JohnWL edited this page Oct 21, 2021 · 4 revisions

Enabling/disabling of rendering

When installing the RLBotGUI, rendering will be disabled by default. You can turn it on by clicking 'Extra' and ticking 'Enable Rendering' in the GUI. However, rendering can also be enabled or disabled any time using the page up and page down keys, respectively. So if your rendering isn't appearing, make sure to press page up before panicking.

Good to Know

Rendering in Java is a useful tool to draw information about your bot directly in RocketLeague, such as drawing the predicted ball path or the speed of your car. The Renderer in Java comes in two different versions. The first type is the normal Renderer found in rlbot.render.Renderer. This renderer is used with your current bot that is running and also has a maximum amount of drawing operations you can perform in one frame. The second type is the NamedRenderer found in rlbot.render.NamedRenderer. This renderer is mainly used for drawing large amounts of data on the Screen because you can divide your drawing operations into different packets and send them individually to RocketLeague.

Rendering with the normal Renderer

First we need to create a renderer, that we can use to draw on the screen. We can retrieve a Renderer object by calling BotLoopRenderer.forBotLoop(Bot bot) and then use it with the drawing operations. Let's take a look at this example code:

privatevoiddraw(Botbot){
Rendererr = BotLoopRenderer.forBotLoop(bot);
r.drawRectangle3d(Color.white,newVector3(0,0,0),10,10,true);
}

If we call this method in our bot's processInput method like draw(this) it should result in a white rectangle in the middle of the field. Something like this: white point

Rendering large Amounts with NamedRenderer

For rendering large amounts of data on the screen you want to use a NamedRenderer. For this you want to split your rendering into different parts that can be rendered seperately. Let's look at this example:

privatevoiddraw(){
//Create a new rendering groupNamedRenderernamedRenderer1 = newNamedRenderer("Group1");
namedRenderer1.startPacket();
//Render first part of data up to 100 drawing operations work safenamedRenderer1.drawRectangle3d(Color.white,newVector3(0,0,0),10,10,true);
namedRenderer1.drawRectangle3d(Color.white,newVector3(0,0,100),10,10,true);
namedRenderer1.drawRectangle3d(Color.white,newVector3(0,0,200),10,10,true);
//mark the end of your rendering part and send your drawing to RocketLeaguenamedRenderer1.finishAndSend();
//Create a second rendering groupNamedRenderernamedRenderer2 = newNamedRenderer("Group2");
namedRenderer2.startPacket();
namedRenderer2.drawRectangle3d(Color.red,newVector3(0,10,0),10,10,true);
namedRenderer2.drawRectangle3d(Color.red,newVector3(0,10,100),10,10,true);
namedRenderer2.drawRectangle3d(Color.red,newVector3(0,10,200),10,10,true);
namedRenderer2.finishAndSend();
}

First you create your NamedRenderer with a unique name. Then you have to start a new packet and after that you can safely do up to 100 drawing operations. If you exceed 100 you run into the same problems as the normal renderer. That's where the second group comes in and shines, because now you are able to do 200 drawing operations at the same time without breaking the game completely.

But this method of rendering can still be dangerous if used too much. For exmaple: This is what you do not want to do in RocketLeague

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
JohnWL edited this page Oct 21, 2021 · 4 revisions

Enabling/disabling of rendering

When installing the RLBotGUI, rendering will be disabled by default. You can turn it on by clicking 'Extra' and ticking 'Enable Rendering' in the GUI. However, rendering can also be enabled or disabled any time using the page up and page down keys, respectively. So if your rendering isn't appearing, make sure to press page up before panicking.

Good to Know

Rendering in Java is a useful tool to draw information about your bot directly in RocketLeague, such as drawing the predicted ball path or the speed of your car. The Renderer in Java comes in two different versions. The first type is the normal Renderer found in rlbot.render.Renderer. This renderer is used with your current bot that is running and also has a maximum amount of drawing operations you can perform in one frame. The second type is the NamedRenderer found in rlbot.render.NamedRenderer. This renderer is mainly used for drawing large amounts of data on the Screen because you can divide your drawing operations into different packets and send them individually to RocketLeague.

Rendering with the normal Renderer

First we need to create a renderer, that we can use to draw on the screen. We can retrieve a Renderer object by calling BotLoopRenderer.forBotLoop(Bot bot) and then use it with the drawing operations. Let's take a look at this example code:

privatevoiddraw(Botbot){
Rendererr = BotLoopRenderer.forBotLoop(bot);
r.drawRectangle3d(Color.white,newVector3(0,0,0),10,10,true);
}

If we call this method in our bot's processInput method like draw(this) it should result in a white rectangle in the middle of the field. Something like this: white point

Rendering large Amounts with NamedRenderer

For rendering large amounts of data on the screen you want to use a NamedRenderer. For this you want to split your rendering into different parts that can be rendered seperately. Let's look at this example:

privatevoiddraw(){
//Create a new rendering groupNamedRenderernamedRenderer1 = newNamedRenderer("Group1");
namedRenderer1.startPacket();
//Render first part of data up to 100 drawing operations work safenamedRenderer1.drawRectangle3d(Color.white,newVector3(0,0,0),10,10,true);
namedRenderer1.drawRectangle3d(Color.white,newVector3(0,0,100),10,10,true);
namedRenderer1.drawRectangle3d(Color.white,newVector3(0,0,200),10,10,true);
//mark the end of your rendering part and send your drawing to RocketLeaguenamedRenderer1.finishAndSend();
//Create a second rendering groupNamedRenderernamedRenderer2 = newNamedRenderer("Group2");
namedRenderer2.startPacket();
namedRenderer2.drawRectangle3d(Color.red,newVector3(0,10,0),10,10,true);
namedRenderer2.drawRectangle3d(Color.red,newVector3(0,10,100),10,10,true);
namedRenderer2.drawRectangle3d(Color.red,newVector3(0,10,200),10,10,true);
namedRenderer2.finishAndSend();
}

First you create your NamedRenderer with a unique name. Then you have to start a new packet and after that you can safely do up to 100 drawing operations. If you exceed 100 you run into the same problems as the normal renderer. That's where the second group comes in and shines, because now you are able to do 200 drawing operations at the same time without breaking the game completely.

But this method of rendering can still be dangerous if used too much. For exmaple: This is what you do not want to do in RocketLeague

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
JohnWL edited this page Oct 21, 2021 · 4 revisions

Enabling/disabling of rendering

When installing the RLBotGUI, rendering will be disabled by default. You can turn it on by clicking 'Extra' and ticking 'Enable Rendering' in the GUI. However, rendering can also be enabled or disabled any time using the page up and page down keys, respectively. So if your rendering isn't appearing, make sure to press page up before panicking.

Good to Know

Rendering in Java is a useful tool to draw information about your bot directly in RocketLeague, such as drawing the predicted ball path or the speed of your car. The Renderer in Java comes in two different versions. The first type is the normal Renderer found in rlbot.render.Renderer. This renderer is used with your current bot that is running and also has a maximum amount of drawing operations you can perform in one frame. The second type is the NamedRenderer found in rlbot.render.NamedRenderer. This renderer is mainly used for drawing large amounts of data on the Screen because you can divide your drawing operations into different packets and send them individually to RocketLeague.

Rendering with the normal Renderer

First we need to create a renderer, that we can use to draw on the screen. We can retrieve a Renderer object by calling BotLoopRenderer.forBotLoop(Bot bot) and then use it with the drawing operations. Let's take a look at this example code:

privatevoiddraw(Botbot){
Rendererr = BotLoopRenderer.forBotLoop(bot);
r.drawRectangle3d(Color.white,newVector3(0,0,0),10,10,true);
}

If we call this method in our bot's processInput method like draw(this) it should result in a white rectangle in the middle of the field. Something like this: white point

Rendering large Amounts with NamedRenderer

For rendering large amounts of data on the screen you want to use a NamedRenderer. For this you want to split your rendering into different parts that can be rendered seperately. Let's look at this example:

privatevoiddraw(){
//Create a new rendering groupNamedRenderernamedRenderer1 = newNamedRenderer("Group1");
namedRenderer1.startPacket();
//Render first part of data up to 100 drawing operations work safenamedRenderer1.drawRectangle3d(Color.white,newVector3(0,0,0),10,10,true);
namedRenderer1.drawRectangle3d(Color.white,newVector3(0,0,100),10,10,true);
namedRenderer1.drawRectangle3d(Color.white,newVector3(0,0,200),10,10,true);
//mark the end of your rendering part and send your drawing to RocketLeaguenamedRenderer1.finishAndSend();
//Create a second rendering groupNamedRenderernamedRenderer2 = newNamedRenderer("Group2");
namedRenderer2.startPacket();
namedRenderer2.drawRectangle3d(Color.red,newVector3(0,10,0),10,10,true);
namedRenderer2.drawRectangle3d(Color.red,newVector3(0,10,100),10,10,true);
namedRenderer2.drawRectangle3d(Color.red,newVector3(0,10,200),10,10,true);
namedRenderer2.finishAndSend();
}

First you create your NamedRenderer with a unique name. Then you have to start a new packet and after that you can safely do up to 100 drawing operations. If you exceed 100 you run into the same problems as the normal renderer. That's where the second group comes in and shines, because now you are able to do 200 drawing operations at the same time without breaking the game completely.

But this method of rendering can still be dangerous if used too much. For exmaple: This is what you do not want to do in RocketLeague

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
JohnWL edited this page Oct 21, 2021 · 4 revisions

Enabling/disabling of rendering

When installing the RLBotGUI, rendering will be disabled by default. You can turn it on by clicking 'Extra' and ticking 'Enable Rendering' in the GUI. However, rendering can also be enabled or disabled any time using the page up and page down keys, respectively. So if your rendering isn't appearing, make sure to press page up before panicking.

Good to Know

Rendering in Java is a useful tool to draw information about your bot directly in RocketLeague, such as drawing the predicted ball path or the speed of your car. The Renderer in Java comes in two different versions. The first type is the normal Renderer found in rlbot.render.Renderer. This renderer is used with your current bot that is running and also has a maximum amount of drawing operations you can perform in one frame. The second type is the NamedRenderer found in rlbot.render.NamedRenderer. This renderer is mainly used for drawing large amounts of data on the Screen because you can divide your drawing operations into different packets and send them individually to RocketLeague.

Rendering with the normal Renderer

First we need to create a renderer, that we can use to draw on the screen. We can retrieve a Renderer object by calling BotLoopRenderer.forBotLoop(Bot bot) and then use it with the drawing operations. Let's take a look at this example code:

privatevoiddraw(Botbot){
Rendererr = BotLoopRenderer.forBotLoop(bot);
r.drawRectangle3d(Color.white,newVector3(0,0,0),10,10,true);
}

If we call this method in our bot's processInput method like draw(this) it should result in a white rectangle in the middle of the field. Something like this: white point

Rendering large Amounts with NamedRenderer

For rendering large amounts of data on the screen you want to use a NamedRenderer. For this you want to split your rendering into different parts that can be rendered seperately. Let's look at this example:

privatevoiddraw(){
//Create a new rendering groupNamedRenderernamedRenderer1 = newNamedRenderer("Group1");
namedRenderer1.startPacket();
//Render first part of data up to 100 drawing operations work safenamedRenderer1.drawRectangle3d(Color.white,newVector3(0,0,0),10,10,true);
namedRenderer1.drawRectangle3d(Color.white,newVector3(0,0,100),10,10,true);
namedRenderer1.drawRectangle3d(Color.white,newVector3(0,0,200),10,10,true);
//mark the end of your rendering part and send your drawing to RocketLeaguenamedRenderer1.finishAndSend();
//Create a second rendering groupNamedRenderernamedRenderer2 = newNamedRenderer("Group2");
namedRenderer2.startPacket();
namedRenderer2.drawRectangle3d(Color.red,newVector3(0,10,0),10,10,true);
namedRenderer2.drawRectangle3d(Color.red,newVector3(0,10,100),10,10,true);
namedRenderer2.drawRectangle3d(Color.red,newVector3(0,10,200),10,10,true);
namedRenderer2.finishAndSend();
}

First you create your NamedRenderer with a unique name. Then you have to start a new packet and after that you can safely do up to 100 drawing operations. If you exceed 100 you run into the same problems as the normal renderer. That's where the second group comes in and shines, because now you are able to do 200 drawing operations at the same time without breaking the game completely.

But this method of rendering can still be dangerous if used too much. For exmaple: This is what you do not want to do in RocketLeague

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
JohnWL edited this page Oct 21, 2021 · 4 revisions

Enabling/disabling of rendering

When installing the RLBotGUI, rendering will be disabled by default. You can turn it on by clicking 'Extra' and ticking 'Enable Rendering' in the GUI. However, rendering can also be enabled or disabled any time using the page up and page down keys, respectively. So if your rendering isn't appearing, make sure to press page up before panicking.

Good to Know

Rendering in Java is a useful tool to draw information about your bot directly in RocketLeague, such as drawing the predicted ball path or the speed of your car. The Renderer in Java comes in two different versions. The first type is the normal Renderer found in rlbot.render.Renderer. This renderer is used with your current bot that is running and also has a maximum amount of drawing operations you can perform in one frame. The second type is the NamedRenderer found in rlbot.render.NamedRenderer. This renderer is mainly used for drawing large amounts of data on the Screen because you can divide your drawing operations into different packets and send them individually to RocketLeague.

Rendering with the normal Renderer

First we need to create a renderer, that we can use to draw on the screen. We can retrieve a Renderer object by calling BotLoopRenderer.forBotLoop(Bot bot) and then use it with the drawing operations. Let's take a look at this example code:

privatevoiddraw(Botbot){
Rendererr = BotLoopRenderer.forBotLoop(bot);
r.drawRectangle3d(Color.white,newVector3(0,0,0),10,10,true);
}

If we call this method in our bot's processInput method like draw(this) it should result in a white rectangle in the middle of the field. Something like this: white point

Rendering large Amounts with NamedRenderer

For rendering large amounts of data on the screen you want to use a NamedRenderer. For this you want to split your rendering into different parts that can be rendered seperately. Let's look at this example:

privatevoiddraw(){
//Create a new rendering groupNamedRenderernamedRenderer1 = newNamedRenderer("Group1");
namedRenderer1.startPacket();
//Render first part of data up to 100 drawing operations work safenamedRenderer1.drawRectangle3d(Color.white,newVector3(0,0,0),10,10,true);
namedRenderer1.drawRectangle3d(Color.white,newVector3(0,0,100),10,10,true);
namedRenderer1.drawRectangle3d(Color.white,newVector3(0,0,200),10,10,true);
//mark the end of your rendering part and send your drawing to RocketLeaguenamedRenderer1.finishAndSend();
//Create a second rendering groupNamedRenderernamedRenderer2 = newNamedRenderer("Group2");
namedRenderer2.startPacket();
namedRenderer2.drawRectangle3d(Color.red,newVector3(0,10,0),10,10,true);
namedRenderer2.drawRectangle3d(Color.red,newVector3(0,10,100),10,10,true);
namedRenderer2.drawRectangle3d(Color.red,newVector3(0,10,200),10,10,true);
namedRenderer2.finishAndSend();
}

First you create your NamedRenderer with a unique name. Then you have to start a new packet and after that you can safely do up to 100 drawing operations. If you exceed 100 you run into the same problems as the normal renderer. That's where the second group comes in and shines, because now you are able to do 200 drawing operations at the same time without breaking the game completely.

But this method of rendering can still be dangerous if used too much. For exmaple: This is what you do not want to do in RocketLeague

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
JohnWL edited this page Oct 21, 2021 · 4 revisions

Enabling/disabling of rendering

When installing the RLBotGUI, rendering will be disabled by default. You can turn it on by clicking 'Extra' and ticking 'Enable Rendering' in the GUI. However, rendering can also be enabled or disabled any time using the page up and page down keys, respectively. So if your rendering isn't appearing, make sure to press page up before panicking.

Good to Know

Rendering in Java is a useful tool to draw information about your bot directly in RocketLeague, such as drawing the predicted ball path or the speed of your car. The Renderer in Java comes in two different versions. The first type is the normal Renderer found in rlbot.render.Renderer. This renderer is used with your current bot that is running and also has a maximum amount of drawing operations you can perform in one frame. The second type is the NamedRenderer found in rlbot.render.NamedRenderer. This renderer is mainly used for drawing large amounts of data on the Screen because you can divide your drawing operations into different packets and send them individually to RocketLeague.

Rendering with the normal Renderer

First we need to create a renderer, that we can use to draw on the screen. We can retrieve a Renderer object by calling BotLoopRenderer.forBotLoop(Bot bot) and then use it with the drawing operations. Let's take a look at this example code:

privatevoiddraw(Botbot){
Rendererr = BotLoopRenderer.forBotLoop(bot);
r.drawRectangle3d(Color.white,newVector3(0,0,0),10,10,true);
}

If we call this method in our bot's processInput method like draw(this) it should result in a white rectangle in the middle of the field. Something like this: white point

Rendering large Amounts with NamedRenderer

For rendering large amounts of data on the screen you want to use a NamedRenderer. For this you want to split your rendering into different parts that can be rendered seperately. Let's look at this example:

privatevoiddraw(){
//Create a new rendering groupNamedRenderernamedRenderer1 = newNamedRenderer("Group1");
namedRenderer1.startPacket();
//Render first part of data up to 100 drawing operations work safenamedRenderer1.drawRectangle3d(Color.white,newVector3(0,0,0),10,10,true);
namedRenderer1.drawRectangle3d(Color.white,newVector3(0,0,100),10,10,true);
namedRenderer1.drawRectangle3d(Color.white,newVector3(0,0,200),10,10,true);
//mark the end of your rendering part and send your drawing to RocketLeaguenamedRenderer1.finishAndSend();
//Create a second rendering groupNamedRenderernamedRenderer2 = newNamedRenderer("Group2");
namedRenderer2.startPacket();
namedRenderer2.drawRectangle3d(Color.red,newVector3(0,10,0),10,10,true);
namedRenderer2.drawRectangle3d(Color.red,newVector3(0,10,100),10,10,true);
namedRenderer2.drawRectangle3d(Color.red,newVector3(0,10,200),10,10,true);
namedRenderer2.finishAndSend();
}

First you create your NamedRenderer with a unique name. Then you have to start a new packet and after that you can safely do up to 100 drawing operations. If you exceed 100 you run into the same problems as the normal renderer. That's where the second group comes in and shines, because now you are able to do 200 drawing operations at the same time without breaking the game completely.

But this method of rendering can still be dangerous if used too much. For exmaple: This is what you do not want to do in RocketLeague

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
JohnWL edited this page Oct 21, 2021 · 4 revisions

Enabling/disabling of rendering

When installing the RLBotGUI, rendering will be disabled by default. You can turn it on by clicking 'Extra' and ticking 'Enable Rendering' in the GUI. However, rendering can also be enabled or disabled any time using the page up and page down keys, respectively. So if your rendering isn't appearing, make sure to press page up before panicking.

Good to Know

Rendering in Java is a useful tool to draw information about your bot directly in RocketLeague, such as drawing the predicted ball path or the speed of your car. The Renderer in Java comes in two different versions. The first type is the normal Renderer found in rlbot.render.Renderer. This renderer is used with your current bot that is running and also has a maximum amount of drawing operations you can perform in one frame. The second type is the NamedRenderer found in rlbot.render.NamedRenderer. This renderer is mainly used for drawing large amounts of data on the Screen because you can divide your drawing operations into different packets and send them individually to RocketLeague.

Rendering with the normal Renderer

First we need to create a renderer, that we can use to draw on the screen. We can retrieve a Renderer object by calling BotLoopRenderer.forBotLoop(Bot bot) and then use it with the drawing operations. Let's take a look at this example code:

privatevoiddraw(Botbot){
Rendererr = BotLoopRenderer.forBotLoop(bot);
r.drawRectangle3d(Color.white,newVector3(0,0,0),10,10,true);
}

If we call this method in our bot's processInput method like draw(this) it should result in a white rectangle in the middle of the field. Something like this: white point

Rendering large Amounts with NamedRenderer

For rendering large amounts of data on the screen you want to use a NamedRenderer. For this you want to split your rendering into different parts that can be rendered seperately. Let's look at this example:

privatevoiddraw(){
//Create a new rendering groupNamedRenderernamedRenderer1 = newNamedRenderer("Group1");
namedRenderer1.startPacket();
//Render first part of data up to 100 drawing operations work safenamedRenderer1.drawRectangle3d(Color.white,newVector3(0,0,0),10,10,true);
namedRenderer1.drawRectangle3d(Color.white,newVector3(0,0,100),10,10,true);
namedRenderer1.drawRectangle3d(Color.white,newVector3(0,0,200),10,10,true);
//mark the end of your rendering part and send your drawing to RocketLeaguenamedRenderer1.finishAndSend();
//Create a second rendering groupNamedRenderernamedRenderer2 = newNamedRenderer("Group2");
namedRenderer2.startPacket();
namedRenderer2.drawRectangle3d(Color.red,newVector3(0,10,0),10,10,true);
namedRenderer2.drawRectangle3d(Color.red,newVector3(0,10,100),10,10,true);
namedRenderer2.drawRectangle3d(Color.red,newVector3(0,10,200),10,10,true);
namedRenderer2.finishAndSend();
}

First you create your NamedRenderer with a unique name. Then you have to start a new packet and after that you can safely do up to 100 drawing operations. If you exceed 100 you run into the same problems as the normal renderer. That's where the second group comes in and shines, because now you are able to do 200 drawing operations at the same time without breaking the game completely.

But this method of rendering can still be dangerous if used too much. For exmaple: This is what you do not want to do in RocketLeague

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
JohnWL edited this page Oct 21, 2021 · 4 revisions

Enabling/disabling of rendering

When installing the RLBotGUI, rendering will be disabled by default. You can turn it on by clicking 'Extra' and ticking 'Enable Rendering' in the GUI. However, rendering can also be enabled or disabled any time using the page up and page down keys, respectively. So if your rendering isn't appearing, make sure to press page up before panicking.

Good to Know

Rendering in Java is a useful tool to draw information about your bot directly in RocketLeague, such as drawing the predicted ball path or the speed of your car. The Renderer in Java comes in two different versions. The first type is the normal Renderer found in rlbot.render.Renderer. This renderer is used with your current bot that is running and also has a maximum amount of drawing operations you can perform in one frame. The second type is the NamedRenderer found in rlbot.render.NamedRenderer. This renderer is mainly used for drawing large amounts of data on the Screen because you can divide your drawing operations into different packets and send them individually to RocketLeague.

Rendering with the normal Renderer

First we need to create a renderer, that we can use to draw on the screen. We can retrieve a Renderer object by calling BotLoopRenderer.forBotLoop(Bot bot) and then use it with the drawing operations. Let's take a look at this example code:

privatevoiddraw(Botbot){
Rendererr = BotLoopRenderer.forBotLoop(bot);
r.drawRectangle3d(Color.white,newVector3(0,0,0),10,10,true);
}

If we call this method in our bot's processInput method like draw(this) it should result in a white rectangle in the middle of the field. Something like this: white point

Rendering large Amounts with NamedRenderer

For rendering large amounts of data on the screen you want to use a NamedRenderer. For this you want to split your rendering into different parts that can be rendered seperately. Let's look at this example:

privatevoiddraw(){
//Create a new rendering groupNamedRenderernamedRenderer1 = newNamedRenderer("Group1");
namedRenderer1.startPacket();
//Render first part of data up to 100 drawing operations work safenamedRenderer1.drawRectangle3d(Color.white,newVector3(0,0,0),10,10,true);
namedRenderer1.drawRectangle3d(Color.white,newVector3(0,0,100),10,10,true);
namedRenderer1.drawRectangle3d(Color.white,newVector3(0,0,200),10,10,true);
//mark the end of your rendering part and send your drawing to RocketLeaguenamedRenderer1.finishAndSend();
//Create a second rendering groupNamedRenderernamedRenderer2 = newNamedRenderer("Group2");
namedRenderer2.startPacket();
namedRenderer2.drawRectangle3d(Color.red,newVector3(0,10,0),10,10,true);
namedRenderer2.drawRectangle3d(Color.red,newVector3(0,10,100),10,10,true);
namedRenderer2.drawRectangle3d(Color.red,newVector3(0,10,200),10,10,true);
namedRenderer2.finishAndSend();
}

First you create your NamedRenderer with a unique name. Then you have to start a new packet and after that you can safely do up to 100 drawing operations. If you exceed 100 you run into the same problems as the normal renderer. That's where the second group comes in and shines, because now you are able to do 200 drawing operations at the same time without breaking the game completely.

But this method of rendering can still be dangerous if used too much. For exmaple: This is what you do not want to do in RocketLeague

Clone this wiki locally