Jump to content

Welcome to Omni-bot Forums
Register now to gain access to all of our features. Once registered and logged in, you will be able to create topics, post replies to existing threads, give reputation to your fellow members, get your own private messenger, post status updates, manage your profile and so much more. If you already have an account, login here - otherwise create an account for free today!

Most Liked Content

#21475 "Scripting" 2.0

Posted by DrEvil on 21 March 2015 - 02:50 PM

Can you believe this bot has been around about 10 years now? I started this bot just before I left my game dev school in Florida in 2004 to exercise my passion and to build up experience that would help me get into the game industry. Not only was did this bot account for the primary demonstration that got me both of my industry jobs, it was fun as hell to work on(and still is really).


I know the community may by dwindled down to almost nothing these days given the age of these games and such, but as a developer who still has that passion, I am still working feverishly behind the scenes on the bot. Primarily this work has been in integrating the fantasic recast navigation system that is available on github, and pulling together and writing code that extracts map geometry from the bsp files and props of the map so that the raw collision geometry may be used automatically to build a properly automatic navigation mesh for the bot in real time. This includes rebuilding tiles of it when the location of things change and such. For some examples of this, see



This work has not been without major refactoring of many areas of the bot. After all, I'm 7-10 years more experienced(depending on which code) than I was when i wrote most of this code initially, so as I go I'm trying to simplify many areas of it as well.


Other than getting a nice automatically built navigation mesh(outside of possibly needing to set up tricky custom traversal links manually), my eye would then turn to the scripting system. In the domain of scripting I have an itch to take a radically different approach than what we've seen on the bot thus far. I wanted to air these ideas to get a feel about how the community(if there's anyone left), feels about this possibility.



Game Monkey script is still probably my favorite scripting language, syntactically and feature wise. The issue for me is that I suppose I've 'out grown' the appeal of interpreted scripting languages. The binding is often at least a bit annoying to maintain and interpreted languages in general are frankly very slow. In the history of Omni-bot itself, nearly all of the persistent crash bugs we've had over the years have been attributed to the garbage collection of the scripting language. Those types of bugs are hard to debug.


Option 1

One obvious option to at least address the performance aspect might be to switch to Lua JIT(just in time). This version of lua is actually JIT compiled, rather than interpreted, so that its performance is generally much better. My issue with this option is that frankly I'm not a big fan of lua, and performance isn't really my primary motivation anyhow.


Option 2

The preferred options in my mind are to stick with C++ code and use it for 'scripting'. MSVC 2013 community edition is free these days, and although it's not a small tool compared to like notepad++ or whatever you use to script with now, using 'native' code solves the performance issue, the binding complexity issue, and greatly simplifies the debugging by taking advantage of the high quality debugger that the tool already has. If I went this direction, I would do so still with coroutines/fibers(what GM calls threads) that still provide the great benefits of being able to write top down serial code, yield, wait, sleep, block for events, etc.



The biggest hurdle to work out with going to native c++ 'scripting' would be whether or not I can sandbox it enough where people cant code malicious stuff. That's one benefit of a scripting system that isn't so easily solvable in native scripting. If I can make the bot responsible for compiling the code(such as with http://runtimecompil...s.blogspot.com/), I could perhaps secure the code by disallowing linking with anything not provided with the bot(not even the c standard library)


Anyways I wanted to see if there was any feedback on the topic, especially from scripters themselves. To users the changes would basically invisible. The bot would load dlls or obj files rather than .gm scripts, to users any noticeable benefit would likely be in a significant cpu reduction.


Scripters would feel the brunt of this change. They would be writing and debugging their scripts in C++ using interfaces provided by the bot. 


This change is pretty far out, but I want to spark a discussion in the mean time. I plan to get the navigation improvements to a stable state first.




  • Niek, Mateos, Gramp and 2 others like this

#21975 Raid final

Posted by Magic on 17 April 2016 - 02:32 PM

A final version of Raid is done...a big thanks to d00d for all the help with the final version.

Have also made a movie from the map...a thank you to all that helped me with it :)


Download link for the map and to see the movie - visit my site :




thanks again for all the help.



  • d00d, Niek, Mateos and 1 other like this

#21407 balancing humans and bots

Posted by hellreturn on 20 January 2015 - 05:15 PM

you could always give your ref's something to do keeping the teams even by hand or just ask players to make even teams.

There was discussion about this awhile ago but I can t find it.


Well asking players never work. Players natural tendency is to get easy kills... so they tend to stack up teams pretty often.


Also evening by hand doesn't work.. it minimizes game play time of admins.. and they have enough on hand. We try so that most of my admin don't have to baby sit or end up putting times on server after other players.. This way admins can enjoy too. Some new features coming soon in next version of silent mod to enhance admin moderation with manual interruption.


Would love if omni's auto balances the team by themselves. I would say check every 2 mins to see which teams has more human players and then put one extra bot on that team till team gets balanced would work out best in everyone's interest, if possible.

  • papa le barbare, Mateos, Dragon! and 1 other like this

#21267 Teuthonia_final

Posted by Micha! on 06 September 2014 - 09:05 AM

Hey, here the waypoints for the map teuthonia_final.

Attached Files

  • d00d, papa le barbare, Mateos and 1 other like this

#22286 bot.TargetBreakableDist

Posted by palota on 07 August 2017 - 08:48 AM

If you set bot.TargetBreakableDist inside OnBotJoin function, then bots will destroy all breakable objects which are closer than the distance.


Trigger regions are useful if you want to destroy only a few obstacles and don't want bots to shoot everything. For example, see fueldump.gm.

When a bot enters the region, bot.TargetBreakableDist is set to RegionTrigger.BreakableDistance.MaxBreakableDist.

When a bot exits the region, bot.TargetBreakableDist is set to RegionTrigger.BreakableDistance.MinBreakableDist.


Paththrough navigation is necessary for ladders or difficult obstacles. For example, see et_poker_b2.gm.


  • d00d, VargaTom and Mateos like this

#22282 Plant Goal with 2 use points

Posted by palota on 23 July 2017 - 07:28 PM

Edit the goal, then look towards the door and type command goal_setproperty coversplit. It will save your current rotation vector. Your position is not important.

  • d00d, VargaTom and Mateos like this

#22274 Turning off coverspot

Posted by palota on 10 July 2017 - 08:20 AM

I fixed the bug. You can get new version from Assembla SVN.

  • d00d, VargaTom and Mateos like this

#22065 Waypoints request for Canyon Depths Final

Posted by Tardis on 01 August 2016 - 05:13 PM

I am working on them slowly so as soon as i get the bots to finish the map I will send some updates via svn

  • JohnDory, d00d and Mateos like this

#21941 Requesting Waypoints for twc paintball

Posted by palota on 02 February 2016 - 11:24 PM

I modified twc_paintball.gm so that bots spawn randomly.

  • d00d, Mateos and MickyP[MW] like this

#21835 Alps_trail waypoints

Posted by palota on 22 December 2015 - 09:56 AM

I've fixed some invalid MOVER goals in file alps_trail_goals.gm and then uploaded waypoints to Assembla into folder et/incomplete_navs/no_script.

I think it would be better to remove waypoints from Alps-trail.rar, because it's impossible for us to update them. You can add Assembla URL into the file alps_readme.txt.

  • d00d, Mateos and twt_thunder like this

#21828 Where to put Waypoints? o0

Posted by d00d on 18 December 2015 - 05:58 PM

You need three files for each map if you want decent bot behavior, all of which should be put into the nav folder:

  • mapname.gm
  • mapname_goals.gm
  • mapname.way

mapname.script files have nothing to do with Omni-bot. They are part of the map itself, but they are already inside the map's .pk3 file. You can delete them unless you are interested in making maps.


But be warned that the UJE guys usually do a lousy job on bot scripts. Most of the bot scripts they provide with their maps are pretty much useless and do not enable the bots to play properly. At least this was true for 95 % of the UJE scripts I looked at some time ago. Maybe they have a better scripter now.

  • Mateos, palota and kino like this

#21662 New version of Omni-bot for RTCW

Posted by palota on 01 September 2015 - 12:20 PM

The latest version of Omni-bot for RTCW and current waypoints are on GitHub.

Clone URL: https://github.com/j...rt/omni-bot.git

Branch: stable


Git repository is very big because it contains full C++ source code. Compiled binaries are located in folder 0.83/Installer/Files. File omnibot_rtcw.dll is for Windows. File omnibot_rtcw.so is for Linux. Folder rtcw contains scripts and waypoints.


You must also copy global_scripts folder from Enemy Territory or use SVN client to checkout url http://svn.assembla..../global_scripts


The mod is in the folder rtcw/game. You must copy it into "Return to Castle Wolfenstein" installation folder and then set fs_game parameter when launching the game.


  • d00d, Mateos and kino like this

#21599 8.4 omni-bot help on heavy weapons

Posted by palota on 17 July 2015 - 11:52 AM

It's not recommended to modify et_autoexec.gm.  It's better to create a new file et_autoexec_user.gm  for all your settings. The file should be in folder omni-bot/et/scripts.


If you want to disable panzer and flamethrower, add these commands to et_autoexec_user.gm:

WeaponTable.SetWeaponAvailability(CLASS.SOLDIER, WEAPON.PANZERFAUST, false);
WeaponTable.SetWeaponAvailability(CLASS.SOLDIER, WEAPON.FLAMETHROWER, false);
WeaponTable.SetWeaponTeamAvailability(TEAM.AXIS, CLASS.SOLDIER, WEAPON.MP40, true);
WeaponTable.SetWeaponTeamAvailability(TEAM.ALLIES, CLASS.SOLDIER, WEAPON.THOMPSON, true);

If you want to disable soldiers and you have the latest Omni-bot version from Assembla, add these commands to et_autoexec_user.gm:

Server.MinClassCount[TEAM.AXIS][CLASS.SOLDIER] = 0;
Server.MinClassCount[TEAM.ALLIES][CLASS.SOLDIER] = 0;

If you want to disable soldiers and you have Omni-bot version 0.84, you must modify MinClassCount values in et_autoexec.gm.

  • JohnDory, d00d and hellreturn like this

#21509 Lifts

Posted by palota on 22 April 2015 - 08:42 AM

Sphere region triggers are activated when center point is inside the sphere. The center point is usually not same as origin !

AABB region triggers are activated when bounding box intersects the region. The bounding box can be much bigger than entity and then the trigger is activated too soon.

All region triggers (OnTriggerRegion) must compare coordinates every frame. That's why it's better to use goto triggers (OnTrigger) which don't need any CPU usage.

  • d00d, VargaTom and Mateos like this

#21355 How to keep Omni Bot files updated?

Posted by d00d on 06 December 2014 - 11:30 PM

Am I making any sense?.   :confused:


Yes, absolutely.


What you need is an SVN (Subversion) client, a dedicated program that synchronizes your local files with the ones on the Assembla server (called an SVN repository). If you are on Windows, you'll probably want to use the free TortoiseSVN as your SVN client. It is a shell extension that integrates with Windows Explorer and is very intuitive to use via the right-click context menu.


Once you have your SVN client set up, you have to choose a local target folder. You can either create a new empty folder or (more conveniently) use your existing Omni-bot install folder. Assuming you are using TortoiseSVN, right-click the folder icon in Win Explorer and choose "SVN checkout" from the menu. This will open a dialog window that asks for the checkout URL, which is https://subversion.a...om/svn/omnibot/


This process will create a subfolder structure in your destination folder if all goes well.


Once you're done downloading, you can right-click your destination folder's icon anytime in Windows Explorer and choose "Update SVN".

  • Mateos, Tardis and Gramp like this

#21965 Bots without waypoints

Posted by palota on 18 March 2016 - 06:28 PM

Commands to disconnect all bots:

bot maxbots 0
bot kickall

  • VargaTom and Mateos like this

#21733 SendTrigger

Posted by palota on 04 November 2015 - 11:20 AM

It is used in mapgoal_grenade.gm when an objective is destroyed.

It is used by VehicleTrigger in et_regiontriggers.gm.

Another example is map breakout2.

  • VargaTom and Mateos like this

#21508 Lifts

Posted by d00d on 21 April 2015 - 09:14 PM

Can I use triggers like to Tank (region triggers)?

Here is an example that uses region triggers:
global Map =
	// Initialize Map.ElevatorPosition with 0
	ElevatorPosition = 0,

	Movers =
		// keep the elevator

	// Trigger tables for the elevator.
	// These keep track of the elevator's position.
	ElevatorLevel1 =
		Name = "ElevatorLevel1",
		TriggerOnEntity = GetGoal("MOVER_elevator").GetEntity(),
		OnEnter = function( ent )
			if ( Map.ElevatorPosition != 1 )
				Map.ElevatorPosition = 1;
				Util.MapDebugPrint( "Elevator at level " + Map.ElevatorPosition );
		OnExit = function( ent )
			Map.ElevatorPosition = 0; //moving/unknown


	ElevatorLevel2 =
		Name = "ElevatorLevel2",
		TriggerOnEntity = GetGoal("MOVER_elevator").GetEntity(),
		OnEnter = function( ent )
			if ( Map.ElevatorPosition != 2 )
				Map.ElevatorPosition = 2;
				Util.MapDebugPrint( "Elevator at level " + Map.ElevatorPosition );
		OnExit = function( ent )
			Map.ElevatorPosition = 0; //moving/unknown

	ElevatorLevel3 =
		Name = "ElevatorLevel3",
		TriggerOnEntity = GetGoal("MOVER_elevator").GetEntity(),
		OnEnter = function( ent )
			if ( Map.ElevatorPosition != 3 )
				Map.ElevatorPosition = 3;
				Util.MapDebugPrint( "Elevator at level " + Map.ElevatorPosition );
		OnExit = function( ent )
			Map.ElevatorPosition = 0; //moving/unknown


global OnMapLoad = function()

	// Trigger regions for the elevator
	l_1 = OnTriggerRegion( Vec3(-5870,-2325,-220), 20, Map.ElevatorLevel1 );
	l_2 = OnTriggerRegion( Vec3(-5870,-2325,180), 20, Map.ElevatorLevel2 );
	l_3 = OnTriggerRegion( Vec3(-5870,-2325,590), 20, Map.ElevatorLevel3 );


If yes, which piece of lift will activate region trigger? (ORIGIN?)

I don't know. I usually experiment with the values until I get the result I want.
  • VargaTom and Mateos like this

#21063 Waypoints: Turning them on and off (make them active/inactive)

Posted by MickyP[MW] on 17 March 2014 - 10:34 PM

From my understanting all the waypoints need an individual name.


There is an example in the goldrush script that will cut down the scripting.

slopeNodes = function(close)
 {  for( i = 1; i <= 3; i += 1 ) {   
         s = "slope" + i;
         Wp.SetWaypointFlag( s, "closed", close );

This is activated using


This opens closes 3 waypoints called "slope1" "slope2" & "slope3"


Is there a reason for needing to close the waypoints as I've found very few maps where waypoints need to be closed that can't be closed using blockwall/blockbridge.

Also depending on how the waypoints are set out you can close the entire path by using the close flag on a single waypoint or two.

  • d00d and Mateos like this

#20911 My first Omni-bot project released today. Thanks for all support.

Posted by Loffy on 07 January 2014 - 11:58 AM

I would like to say that I just finished and published my first Omni-bot project, a new custom map for Wolfenstein: Enemy Territory entitled Ambition 2, complete with a first set of tentative Omni-bot files. Link: http://forums.warche...les)-Ambition-2 More in detail, I made the map and waypointed at the same time, which was great. I was able to craft the map in an iterative process, to provide a nice and fluent environment for the bots to run around in. I must say, it is both funny and rewarding to work with these reliable bots, and it has helped me evolve as a mapper. I make my corridors wider nowadays, and I avoid creating tricky jumps as the only route towards an important objective, et cetera. Another thing is that the Omni-bots help me, as a mapper, test stuff, e.g. lifts and movers as well as sound effects and voice commands, to make sure that everything works smoothly. I am impressed by and grateful for having access to the Omni-bots. I am also glad to have this forum. Thanks again everyone for your continued support and help.

  • d00d and Mateos like this