Skip to content

Commit 2f592d9

Browse files
authored
Merge pull request #8 from NicEastvillage/script_and_rects
Fix Script manager and add draw_rect_2d and draw_rect_3d
2 parents 036318b + 478c8ee commit 2f592d9

File tree

4 files changed

+96
-63
lines changed

4 files changed

+96
-63
lines changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ description = "A high performance Python interface for communicating with RLBot
88
dynamic = ["version"]
99
requires-python = ">= 3.11"
1010
dependencies = [
11-
"rlbot_flatbuffers~=0.10.0",
11+
"rlbot_flatbuffers~=0.11.0",
1212
"psutil==6.*",
1313
]
1414
readme = "README.md"

rlbot/managers/rendering.py

Lines changed: 49 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,19 @@ def _get_anchor(
2323

2424
class Renderer:
2525
transparent = flat.Color()
26-
black = flat.Color(255)
26+
black = flat.Color(a=255)
2727
white = flat.Color(255, 255, 255, 255)
28-
grey = gray = flat.Color(255, 128, 128, 128)
29-
blue = flat.Color(255, 0, 0, 255)
30-
red = flat.Color(255, 255, 0, 0)
31-
green = flat.Color(255, 0, 128, 0)
32-
lime = flat.Color(255, 0, 255, 0)
33-
yellow = flat.Color(255, 255, 255, 0)
34-
orange = flat.Color(255, 225, 128, 0)
35-
cyan = flat.Color(255, 0, 255, 255)
36-
pink = flat.Color(255, 255, 0, 255)
37-
purple = flat.Color(255, 128, 0, 128)
38-
teal = flat.Color(255, 0, 128, 128)
28+
grey = gray = flat.Color(128, 128, 128, 255)
29+
blue = flat.Color(0, 0, 255, 255)
30+
red = flat.Color(255, 0, 0, 255)
31+
green = flat.Color(0, 128, 0, 255)
32+
lime = flat.Color(0, 255, 0, 255)
33+
yellow = flat.Color(255, 255, 0, 255)
34+
orange = flat.Color(225, 128, 0, 255)
35+
cyan = flat.Color(0, 255, 255, 255)
36+
pink = flat.Color(255, 0, 255, 255)
37+
purple = flat.Color(128, 0, 128, 255)
38+
teal = flat.Color(0, 128, 128, 255)
3939

4040
_logger = get_logger("renderer")
4141

@@ -114,7 +114,7 @@ def is_rendering(self):
114114
return self._group_id is not None
115115

116116
def _draw(
117-
self, render: flat.String2D | flat.String3D | flat.Line3D | flat.PolyLine3D
117+
self, render: flat.String2D | flat.String3D | flat.Line3D | flat.PolyLine3D | flat.Rect2D | flat.Rect3D
118118
):
119119
self._current_renders.append(flat.RenderMessage(render))
120120

@@ -178,3 +178,39 @@ def draw_string_2d(
178178
v_align,
179179
)
180180
)
181+
182+
def draw_rect_2d(
183+
self,
184+
x: float,
185+
y: float,
186+
width: float,
187+
height: float,
188+
color: flat.Color,
189+
centered: bool = True
190+
):
191+
self._draw(
192+
flat.Rect2D(
193+
x,
194+
y,
195+
width,
196+
height,
197+
color,
198+
centered,
199+
)
200+
)
201+
202+
def draw_rect_3d(
203+
self,
204+
anchor: flat.RenderAnchor | flat.BallAnchor | flat.CarAnchor | flat.Vector3,
205+
width: float,
206+
height: float,
207+
color: flat.Color,
208+
):
209+
self._draw(
210+
flat.Rect3D(
211+
_get_anchor(anchor),
212+
width,
213+
height,
214+
color,
215+
)
216+
)

rlbot/managers/script.py

Lines changed: 18 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,15 @@ class Script:
1818
index: int = 0
1919
name: str = "Unknown"
2020
spawn_id: int = 0
21+
agent_id: str = None
2122

2223
match_settings = flat.MatchSettings()
2324
field_info = flat.FieldInfo()
2425
ball_prediction = flat.BallPrediction()
2526

26-
_initialized_bot = False
27+
_initialized_script = False
2728
_has_match_settings = False
2829
_has_field_info = False
29-
_has_player_mapping = False
3030

3131
_latest_packet: Optional[flat.GamePacket] = None
3232
_latest_prediction = flat.BallPrediction()
@@ -47,15 +47,14 @@ def __init__(self, default_agent_id: Optional[str] = None):
4747
self._game_interface.ball_prediction_handlers.append(
4848
self._handle_ball_prediction
4949
)
50-
self._game_interface.controllable_team_info_handlers.append(
51-
self._handle_controllable_team_info
52-
)
5350
self._game_interface.packet_handlers.append(self._handle_packet)
5451

5552
self.renderer = Renderer(self._game_interface)
5653

57-
def _initialize(self):
58-
self.name = self.match_settings.script_configurations[self.index].name
54+
def _try_initialize(self):
55+
if self._initialized_script or not self._has_match_settings:
56+
return
57+
5958
self.logger = get_logger(self.name)
6059

6160
try:
@@ -69,46 +68,27 @@ def _initialize(self):
6968
print_exc()
7069
exit()
7170

72-
self._initialized_bot = True
71+
self._initialized_script = True
7372
self._game_interface.send_init_complete()
7473

7574
def _handle_match_settings(self, match_settings: flat.MatchSettings):
7675
self.match_settings = match_settings
77-
self._has_match_settings = True
7876

79-
if (
80-
not self._initialized_bot
81-
and self._has_field_info
82-
and self._has_player_mapping
83-
):
84-
self._initialize()
77+
for i, script in enumerate(match_settings.script_configurations):
78+
if script.agent_id == self.agent_id:
79+
self.index = i
80+
self.name = script.name
81+
self._has_match_settings = True
82+
break
83+
else: # else block runs if break was not hit
84+
self.logger.warning("Script with agent id '%s' did not find itself in the match settings", self.agent_id)
85+
86+
self._try_initialize()
8587

8688
def _handle_field_info(self, field_info: flat.FieldInfo):
8789
self.field_info = field_info
8890
self._has_field_info = True
89-
90-
if (
91-
not self._initialized_bot
92-
and self._has_match_settings
93-
and self._has_player_mapping
94-
):
95-
self._initialize()
96-
97-
def _handle_controllable_team_info(
98-
self, player_mappings: flat.ControllableTeamInfo
99-
):
100-
self.team = player_mappings.team
101-
controllable = player_mappings.controllables[0]
102-
self.spawn_id = controllable.spawn_id
103-
self.index = controllable.index
104-
self._has_player_mapping = True
105-
106-
if (
107-
not self._initialized_bot
108-
and self._has_match_settings
109-
and self._has_field_info
110-
):
111-
self._initialize()
91+
self._try_initialize()
11292

11393
def _handle_ball_prediction(self, ball_prediction: flat.BallPrediction):
11494
self._latest_prediction = ball_prediction
@@ -117,8 +97,6 @@ def _handle_packet(self, packet: flat.GamePacket):
11797
self._latest_packet = packet
11898

11999
def _packet_processor(self, packet: flat.GamePacket):
120-
if len(packet.players) <= self.index:
121-
return
122100

123101
self.ball_prediction = self._latest_prediction
124102

tests/render_test/render.py

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,32 @@
11
from rlbot import flat
2-
from rlbot.flat import BallAnchor, Vector3, CarAnchor
2+
from rlbot.flat import BallAnchor, Vector3, CarAnchor, RenderAnchor, Color
33
from rlbot.managers import Script
44

55

66
class RenderFun(Script):
77
needs_render = True
88
last_state = flat.GameStatus.Inactive
9+
player_count = 0
910

1011
def handle_packet(self, packet: flat.GamePacket):
1112
if (
1213
packet.game_info.game_status != flat.GameStatus.Replay
1314
and self.last_state == flat.GameStatus.Replay
14-
):
15+
) or len(packet.players) != self.player_count:
1516
self.needs_render = True
1617
self.last_state = packet.game_info.game_status
1718

1819
if self.needs_render:
1920
self.needs_render = False
21+
self.player_count = len(packet.players)
2022

21-
match packet.balls[0].shape.item:
22-
case flat.SphereShape() | flat.CylinderShape() as shape:
23-
radius = shape.diameter / 2
24-
case flat.BoxShape() as shape:
25-
radius = shape.length / 2
26-
case _:
27-
radius = 0
23+
radius = 0
24+
if len(packet.balls) > 0:
25+
match packet.balls[0].shape.item:
26+
case flat.SphereShape() | flat.CylinderShape() as shape:
27+
radius = shape.diameter / 2
28+
case flat.BoxShape() as shape:
29+
radius = shape.length / 2
2830

2931
self.do_render(radius)
3032

@@ -55,6 +57,23 @@ def do_render(self, radius: float):
5557
for i in range(1, len(points)):
5658
self.renderer.draw_line_3d(points[i - 1], points[i], self.renderer.red)
5759

60+
self.renderer.draw_rect_3d(RenderAnchor(Vector3(0, 0, 100), CarAnchor(0, Vector3(200, 0, 0))), 0.02, 0.02, self.renderer.blue)
61+
self.renderer.draw_rect_3d(CarAnchor(0, Vector3(200, 0, 0)), 0.02, 0.02, self.renderer.blue)
62+
63+
self.renderer.draw_rect_2d(0.75, 0.75, 0.1, 0.1, Color(255, 150, 30, 100), centered=False)
64+
self.renderer.draw_rect_2d(0.75, 0.75, 0.1, 0.1, self.renderer.black)
65+
for hkey, h in {
66+
'left': flat.TextHAlign.Left,
67+
'center': flat.TextHAlign.Center,
68+
'right': flat.TextHAlign.Right,
69+
}.items():
70+
for vkey, v in {
71+
'top': flat.TextVAlign.Top,
72+
'center': flat.TextVAlign.Center,
73+
'bottom': flat.TextVAlign.Bottom,
74+
}.items():
75+
self.renderer.draw_string_2d(f'\n\n{vkey:^14}\n{hkey:^14}\n\n', 0.75, 0.75, 0.66, self.renderer.white, h_align=h, v_align=v)
76+
5877
self.renderer.end_rendering()
5978

6079

0 commit comments

Comments
 (0)