Jump to content


  • Content count

  • Joined

  • Last visited

Community Reputation

14 Positive

About X0R

  • Rank

Profile Information

  • Gender
  • Location
    Manitoba, Canada
  • Interests
    !Coop>PvP !SystemsAutomation !AI !VideoGames !SystemicGames !SandboxGames !SimulationGames !!ARMA2&3(300GB>,modded) !KSP !MSFX !DCS !Paramotoring !Python/C/Go/Sqf

Recent Profile Visitors

106 profile views
  1. I understood what you meant, but if as you suggest you define a *_randomaiasset_type_* template in the gpo, it should be easy to do, difficulty only arises if it weren't. Either way, whatever you define in the server.zip gpo will be spawnable. Though i must add, unlike for other entities, placement of bipods must be utterly precise, so it would require <coord>+<rotation> from the bf2editor, so it would just use a different set of randomization coordinate arrays to all other assets. It should already be defined in the gpo,i.e consider a tank on jabal, if spawned in a randomly defined spawn point, coordinate only,it's existing rotation will be applied, which works just fine for existing map objects as they already have rotation defined,although I'll certainly add the bearing/heading component of rotation to the coordinate pool to make spawns more adaptable, like alleyway spawns. So for any object template you add to the gpo i suggest you create a dummy spawn without coordinates with rotation defined. Bipods are a unique case, so there's two ways you can deal with them, either decide which bipods spawned in the gpo actually spawn, or you can spawn 4 bipods in the gpo & have them spawn at any one of N positions+rotation defined in a list, so the purpose of such a list would solely be to randomize the location all bipods defined in gpo would spawn at, instead of simply defining where they spawn at to begin with. I'm fundamentally lazy , so when choosing a solution i prefer that which provides the best performance but also allows the least maintenance, so it was a performance, convenience & ease of use consideration that made me prefer this approach, just like you can easily modify AI configs, you should easily be able to modify asset spawn, asset type & spawn locations for any given map without needing to know much of anything about the internal workings or without having to load a map in the editor.
  2. I've been testing out a few approaches with deriving the 'Y' component of a coordinate from the height map for a randomly chosen coordinate,having trouble with that but beyond that, it should all be doable with perhaps a different but still effective approach, that features most of what you state above, except perhaps spawning assets not defined on gpo, the real power of python in bf2 is in rcon_invoke() which pretty much lets you do anything but is fairly locked down, infact almost everything in the PR UI is actually an rcon command, done through rcon_invoke(), see attachments & https://classic-battlefield-modding.fandom.com/wiki/BF2_Object_Reference . realityserver.py, pretty much controls rcon_invoke privileges, so the best solution is a combination of an internal & external scripts with some in game logic done externally,where possible. Occam's Razor, “the simplest solution is almost always the best.” I've yet to figure out how to do the 'xxx_randomaiasset_type1_xxx' object spawn reliably,without the server crashing, so I'm putting that at the bottom of my to do list, given it's an 'easteregg',I'll see what i can do about that once everything else is done. Regardless script solution will feature the following : //Assuming additional ability to modify(not add or remove from) the gpo of server.zip -*Scripted object spawner, highly unstable, working on it. -Randomization using a coordinate array that can easily be modified(added to && removed from by anyone with out having to navigate bf2editor) -'rcon position' was added in 1.50 update, should allow anyone to get coordinates for respective maps to populate randomization coordinates array, with coordinates being used logically, with respect to the type of object & distance to nearest CP, we wouldn't wanna spawn a tank inside a building on a coordinate intended for infantry spawn now would we. -Randomization logic that's not hard coded but instead applied logically, based on nothing more than coordinates defined for any given map, i.e provide coordinates for a given map & map will be randomized with respect to AI assets, spawn points & statics. -Config based object spawner, spawns entities defined in script on next map run at designated coordinates,or if coordinate array is defined, at a randomly chosen coordinate from array. ~(obj, minSpawn, maxSpawn, a, p, r, <x, y, z> || <x, y, z>array), simply specify an unreasonably long minSpawn to prevent respawn. ##OBJECTS MUST BE DEFINED IN MAP## i.e don't spawn an f15 on muttrah, just don't. -Randomized Spawn Points, pr does allow addition of new spawn points which are automatically added to a randomized spawn point pool , but I'm sure we all know that's a load of crock, spawn points are far too few & internal randomization is too lacking, so I'll use the config to further randomize spawn point coordinates with respect to their nearest CP, should work on every map, using an external spawn coordinate array. -Randomize Static Emplacements. -Randomized AI Assets, maybe they have a tank and a few techies, or maybe a dozen tanks, & 6 mortars who knows,.. -AI Asset spawn probability, lets you define spawn probability of an asset whose sub-string is specified, i.e (tank, 0.6), and the next randomization cycle has a 60% probability of making the tank spawn. -Randomized AI rally points, will mostly spawn farther to CP to complement spawn points as players tend to camp at a distance. -Randomized AI spawn delay. -Randomized Vehicle Depot Spawn Probability, forces you into a map where you have all the vehicles in the world, but no ability to repair them, no running back to mommy, i figure it forces players to be more conservative with their assets & perhaps for once use the combat engineer kit for something other than mines. -Won't require server restart for changes to script to take effect, changes should take effect on next map. -External script will apply logical config randomization every N hours to all maps, for which randomization coordinates are defined. -*Randomize AI behavior with in a defined scope, extent of randomization is hard to define,I'm figuring that out. The list above contains only things I've figured out how to do , using two server-side scripts, internal for server-side logic & external script for dynamic config modification, which will also alter the internal script's run-time behavior. *denotes conceptually WIP,i.e i haven't figured out how to do that reliably. Awesome, I'll send some your way when i get some time. Exactly, hence why I'm using a coordinate array to which one can easily make additions, as you can now retrieve coordinates for any map pos using 'rcon position'. Simplest to do, Volod will soon be running around like everyone else, And see above, no need for map editors, once it's done, anyone can just submit a list of coordinates for the spawn pool for a given map using normal PR to get coordinates. In summary, once i get everything above working & tested I'll post script & video here, no deadlines though, I've got a job & school so, y'know. realityevents - rcon commands.py realityrally.py
  3. Gotcha, I've got a few ideas on how to randomize spawn points on mission start, the tricky part is randomizing successive spawns after mission is loaded, I'll start with mission start randomization first though.
  4. Certainly flight physics as well, wouldn't we all like to take off in 50m< on irregular terrain in a jet like the bots do... But i stand corrected, i could have been clearer. ------------------------------------------------------------------------------------------------------------------------------------------ https://www.moddb.com/mods/sw33tsp0t BF2 Total War Realism Mod https://www.youtube.com/watch?v=TvPK6EKQkMQ Video which adequately illustrates the scope of the AI config for the mod above. https://www.moddb.com/mods/bf2-sp-128-professional-ai BF2 SP 128 Professional AI Both mods linked above feature quiet interesting AI configs, with decent results as shown in video, though i recommend you try both yourself, if you still happen to have bf2, or simply dissect & examine the config otherwise, i find both offer a superior single player experience, which would logically translate to coop, the configs for TWRM for instance could offer a known behavioral baseline around which PRBF2 AI configs could be optimized. ------------------------------------------------------------------------------------------------------------------------------------------ Regarding python spawner, have you considered defining the insurgent caches in the map config, perhaps replace one or two defined vehicles on a given map with a cache and then simply move/teleport the cache to any one of randomly selected coordinates or perhaps to a randomly selected CombatArea.<areaPoint> coordinate. It would be far simpler to implement, the rallypoint spawner can then be used to spawn rally points at random CombatArea.<areaPoint> coordinates surrounding(w/in 100m) cache coordinate. I don't know the extent of the insurgency logic you've implemented, so i'm just spitballing. -If i recall the add framework had a teleport script,which could be used to 'relocate' entities on map even without exact coordinates(i.e heading+distance+objPosition), you don't happen to have the old AdFramework files do you? -And are you using realityrally or realityspawner as basecode because both have cascading dependencies & use internal logic to spawn objects? The only other python spawning method I've identified is using rcon.invoke(), which can be used to spawn kits & so could certainly be used to spawn objects,given obj template is defined.
  5. Cheers guys, appreciate it. @=VG= Fastjack , I'll do that sometime.
  6. -The following is a list of tips, tricks & nuances that are either undocumented or infrequently referenced in such lists, note of things i tend to forget after a long break. -Some of these may work in PvP,All work in coop, given the location of this post(VG PR COOP), i shall make no distinctions There's generally two types of helicopters in PR those that float such as hueys, cobras, ospreys, havocs, little birds,... & those that fall such as hinds, blackhawks, chinooks,..., often people crash/flail around because they fly both types as though they were the same & apply too little or too much input,remember the difference. Crates around Vehicle Refit stations heal infantry automatically, i'm surprised not many people know this. Fences are Launcher/RPG/ATGM/TOW proof, so when on the hunt for big game while seeking protection from RPG's & TOW's, find the nearest fence,. Pressing Alt in one of the View Modes(6,7,8,9) will give a slightly different view... >If you have trackIR you can bind the the view modes & extreme deadzones for effective freelook especially when flying, makes flying hella fun. The only thing a joystick is good for is JETS & AUTOHOVER(release stick to hover, a hardware hack if there ever was one) Simply turning to have a point of interest be near the edge of screen allows you to see farther, as the rendering cone results in lower view distance for objects near the middle of FOV as opposed to objects at the edge of the cone which is longer. Basically place point of interest near the edge of your FOV to see farther... " It's because of how 3D environments are rendered by game engines. They create perspective using something called a "frustum". You can see objects not up to a certain radius around the camera, but up to a certain "depth" into the screen. Towards the edge of your screen, the depth is the same, but the radius is larger, so you can see further. " Enabling LODs or rather not enabling 'No Lods' will result in improved performance(unless potato pc) as well as ability to see far away enemies. Quality of life keybindings for your convenience, here's a working snippet from my PR autohotkey script, #IfWinActive, ahk_exe PRBF2.exe ctrl & w::HotkeyToggle("w") ;toggles up/down state of paired hotkey - toggle moving forward w/ freedom to change direction,unlike the chat+w hack RCtrl::HotkeyToggle("LCtrl") ;toggles up/down state of paired hotkey - toggle crouch/freelook in Aircraft,makes it a breeze to hover ctrl & LButton::HotkeyToggle("Lbutton") ;toggles up/down state of paired hotkey - toggle click, handly when you gotta use the shovel/tow or hover $e:: ;prevent actidental ejection, either double tap or hold for extended periods to eject/enter vehicles If (A_TimeSincePriorHotkey<300) and (A_TimeSincePriorHotkey<>-1) and (A_PriorHotkey=A_ThisHotkey){ Send {Blind}{e DownTemp} Sleep 300 Send {Blind}{e Up} } Return #IfWinActive HotkeyToggle(key:=""){ ;for use with games with no option to toggle,requiring key be held... Static key := key ? key : A_ThisHotkey ;toggle the hotkey itself instead of another specified key... toggle%key% := !toggle%key% ? 1 : 0 If toggle%key% Send {%key% Down} Else Send {%key% Up} } As Fixed Wing CAS use the map as if it were a flight instrument,as it can easily tell you relative bearing & horizontal vs vertical velocity. In Harrier use the AGM thermal camera for target spotting, use the gun while in camera view... As CAS helo, move back deploying flares to get flares in front of you, easy way to dodge AA. On Active AA emplacements, remember you have 30 seconds of freedom after two missiles are fired, bait AA into firing two, then fly freely for 30sec. As CAS helo, drop throttle for a controlled & slow decent instead of simply pitching down when engaging targets, gives you more time on target. Helicopter rotor blades don't have a collision mesh, something i forget after flying for just a few hours in Arma or DCS. If you drop a patch before reviving someone, they're health will be at 50%.... Patches can also be used to unstuck someone... Infact it's a better way to unstuck someone than pushing them, often at least. There is a trick to firing beyond line of sight in cas, as a cas gunner, with simple trigonometry, place marker on target area which gives distance on map view, then RequiredTargetRangeOnGunView=sqrt(markerDistanceSquared+AltitudeSquared), then simply fire blind at target of x distance in fog and it should hit marker...or use the same trick to derive gun elevation angle to hit target. >just use the app on your phone, trig function should be built in & fill in the entries for the range to fire blind. 2xmags fired at ammo on mortar emplacement will destroy mortar. REPAIR STATIONS ALSO REPAIR HELICOPTERS AND GENERALLY ANY AIRCRAFT, I FORGET THIS ALL THE TIME,HENCE BOLD. Though Not Repair+Resupply depots.\0/ Shilka's, can be killed without directly shooting at them, 2xLG's /w in 5m should kill vehicle... Enable 'Acoustic Echo Cancellation' in your sound(WIN10)/soundDriver settings if you tend to play without headphones, it makes your mic function like your phone on speaker, no echo's & when you talk your game audio doesn't leak through your mic. Enable 'Loudness Equalization' in your sound(WIN10)/soundDriver settings, it makes loud shit quieter & quiet shit louder, need i say more about the benefits, especially for the quiet folk on mumble, it lets you enjoy stunning sound effects while making people audible. Enable 'Enhanced Pointer Precision', a type of mouse acceleration in mouse settings, it takes getting used to though, makes movement & flying much simpler... Armored Vehicle Turrets have a ~2min warmup time, they won't traverse otherwise & ammo will sometimes provide a null value until warmup is done. (?)To Rearm Instantly Go to an ammo box, LAT can be rearmed at resupply box,by reslecting LAT kit. <I think this was a bug,still works for some launchers> Mumble will show the disconnected Icon in game if multiple instances are running, just as it would if a single disconnected instance is running. 'c' to change scope mode 'c' or 'x' to zoom in vehicles/uav, one or the other will work. 'f' for UAV thermal as commander Left CTRL to freelook when operating most vehicles such as helicopters, jets, jeeps, boats and trucks. APCs and IFVs do not have this feature as they use dedicated cameras. This also makes it also easier to hover. LT = Lock on given laser and fire away LG = Missile flies where you click,every subsequent click updates missile destination,nOtE some are actually controlled as you would a TOW TV = Same as LG On some choppers LG/TV might act like wire guided missile (compare TOW). This is due to RL limitations of those. When repairing vehicle cycle seats, preferably to commander seat to see the repair icon. @Supply crates Left Click to get scoped weapon & right click for ironsights Destroy enemy crates to have your own crates spawn instead at a capture point... You may also rearm on enemy crates though you won't be able to change kits with them. Jumping Out & Back in to tank quickly when faced with enemy vehicles(bots) will result in them not shooting at you... also works with enemy tow... HARRIER when switching to vtol has inverted controls so when it starts to pitch down, push down, you'll known transition is complete once controls are normalized, when controls are back to normal, transition is complete. Staying above 1,300ft generally keeps you safe from AA weapons. To Use Mortar, Get a Marker to target, get marker is dist in map, turn to center marker & press F4 to select round & range to target & Fire Away. Any two man APC allows taking any kit similar to a supply crate ON HMG's, '1' + 'RightClick' to zoom Alternate LAT Kit for AT-CS kit is 2xLAW Rounds... though rifle sucks for this one... Activating text input chat(j/k/l) while moving will keep you moving,a sort of cruise control.... On testAirfield, flying over antenna will rearm/repair any aircraft without needing to land. Create a marker to target & RANGE should appear at bottom of map,to market target... Right Click TO Lob/Drop grenade/smoke, useful to drop grenade over a railing for instance. -FIX FOR WINDOWED MODE DEBUG ASSERTION ERRORS If you attempt to run windowed mode,for background loading while you do other shit or simply because it's faster, you might encounter a frequent error, regarding Debug Assertion, the contents of the error are irrelevant, the solution simple. 1.Download & install dxwnd, from https://sourceforge.net/projects/dxwnd/ 2.Add/Create a new profile with path to your PRBF2.exe executable. 3.Enable the following options in your profile; Under DirectX Tab, Enable, 'Suppress DX common errors' Under Libs Tab, Enable, 'Suppress Win common errors' 'Suppress message dialogs' 4.Enjoy, You'll never encounter debug assertion errors, though you'll still crash after playing a few dozen rounds as usual. *Note dxwnd does hook PRBF2.exe, you may not close it, just leave it in the background & PRB2F2.exe won't ofcourse need to be launched from it, it's automatically hooked when it runs. *here's a simple ahk script that automatically launches dxwnd whenever you run the project reality launcher. completely optional. ; Get WMI service object. winmgmts := ComObjGet("winmgmts:") ; Create sink objects for receiving event noficiations. ComObjConnect(createSink := ComObjCreate("WbemScripting.SWbemSink"), "ProcessCreate_") ; Set event polling interval, in seconds. interval := 1 ; Register for process creation notifications: winmgmts.ExecNotificationQueryAsync(createSink , "Select * from __InstanceCreationEvent" . " within " interval . " where TargetInstance isa 'Win32_Process'") ; Don't exit automatically. #Persistent ; Called when a new process is detected: ProcessCreate_OnObjectReady(obj) { proc := obj.TargetInstance If (proc.Name = "PRLauncher.exe") && !WinExist("ahk_exe dxwnd.exe") ;when PRLauncher is launched automatically run dxwnd to force fullscreen windowed mode,where fps limit is imposed(vsync),assert errors don't appear but game is paused... Run <path to dxwnd exe>, <path to dxwnd directory>, Min } Map Notification Alert AutoHotKey Script, lets you know if number of players is above N & if any specified maps are loaded, if specified processes are inactive. ;AutoHotkey script to notify you when you preferred map is online relative to the minimum number of players online, ;default: if at least 10 players & any of specified maps, delimited by SPACE, then TrayTip will notify you of current map & current number of players online. ;X0R - PR Monitor ;you can easily modify script to only notify you when you're playing another game for instance or when your just using your browser so that it's not always active. #SingleInstance, force ;#NoTrayIcon SetBatchLines, 20ms ;script will not notify about current map if any of these processes are active or if active process is fullscreen,such as another game... deactivateOnTheseProcesses = scite.exe, notepad++.exe, devenv.exe, atom.exe, pycharm.exe, processing.exe For each,proc in StrSplit(deactivateOnTheseProcesses, ",") GroupAdd, doNotNotifyIfActive, ahk_exe %proc% Loop{ If WinActive("ahk_group doNotNotifyIfActive") ;change WinActive to WinExist, if you don't want notification while processes exist Continue page := DownloadToString("https://cache3.gametracker.com/server_info/") map := Trim(Trim(StringBetweenTwoStrings(page, "<div class=""si_map_header"" id=""HTML_curr_map"">", "</div>"), "`n")) playerCount := Trim(Trim(StringBetweenTwoStrings(page, "<span id=""HTML_num_players"">", "</span>"), "`n")) ;========================================================================================================================== If (playerCount >= 10) && AreInStr_delim(map, "grozny Pavlovsk kashan bamyan kokan muttrah basrah jabal black gold karbalah silent eagle") TrayTip, PR MAP MONITOR, % map "`n" playerCount "/40 online`n`n" ,30, 1 Sleep % * 60 * 1000 ;every 5minutes } StringListLastLine(ByRef string){ Return RegExReplace(string, ".*`t(.*)", "$1") ;".*" - the first ".*" matches any string, starting from left to right! } AreInStr_delim(haystack, needles, needlesDelim:=" "){ ;variant uses delimited search strings instead of a parameters Loop, Parse, needles, %needlesDelim% i := ( InStr(haystack, A_LoopField) ? (!i ? (i:=0) & (i += 1) : (i += 1)) : i ) Return i } ;Esc::ExitApp :*:nopr:: ;type 'nopr' anywhere to kill script ExitApp StringBetweenTwoStrings(string, startsWith, endsWith, returnWhat:="result1"){ ;returns string between two delimiters, if returnWhat = "result",the delimiters will be Included in the result. StringSplit, sideSplit, string, %startsWith% foundAtPos := RegExMatch(string, "s)\Q" . startsWith . "\E(.*?)\Q" . endsWith . "\E", result) Return % ( returnWhat = "result1" ? ( !endsWith && startsWith ? sideSplit2 : result1) : ( returnWhat = "result" && !endsWith && startsWith ? startsWith . sideSplit2 : result ) ) } DownloadToString(url, encoding="utf-8") { static a := "AutoHotkey/" A_AhkVersion if (!DllCall("LoadLibrary", "str", "wininet") || !(h := DllCall("wininet\InternetOpen", "str", a, "uint", 1, "ptr", 0, "ptr", 0, "uint", 0, "ptr"))) return 0 c := s := 0, o := "" if (f := DllCall("wininet\InternetOpenUrl", "ptr", h, "str", url, "ptr", 0, "uint", 0, "uint", 0x80003000, "ptr", 0, "ptr")) { while (DllCall("wininet\InternetQueryDataAvailable", "ptr", f, "uint*", s, "uint", 0, "ptr", 0) && s>0) { VarSetCapacity(b, s, 0) DllCall("wininet\InternetReadFile", "ptr", f, "ptr", &b, "uint", s, "uint*", r) o .= StrGet(&b, r>>(encoding="utf-16"||encoding="cp1200"), encoding) } DllCall("wininet\InternetCloseHandle", "ptr", f) } DllCall("wininet\InternetCloseHandle", "ptr", h) return o } DownloadToFile(url, filename) { static a := "AutoHotkey/" A_AhkVersion if (!(o := FileOpen(filename, "w")) || !DllCall("LoadLibrary", "str", "wininet") || !(h := DllCall("wininet\InternetOpen", "str", a, "uint", 1, "ptr", 0, "ptr", 0, "uint", 0, "ptr"))) return 0 c := s := 0 if (f := DllCall("wininet\InternetOpenUrl", "ptr", h, "str", url, "ptr", 0, "uint", 0, "uint", 0x80003000, "ptr", 0, "ptr")) { while (DllCall("wininet\InternetQueryDataAvailable", "ptr", f, "uint*", s, "uint", 0, "ptr", 0) && s>0) { VarSetCapacity(b, s, 0) DllCall("wininet\InternetReadFile", "ptr", f, "ptr", &b, "uint", s, "uint*", r) c += r o.rawWrite(b, r) } DllCall("wininet\InternetCloseHandle", "ptr", f) } DllCall("wininet\InternetCloseHandle", "ptr", h) o.close() return c } DownloadBin(url, byref buf) { static a := "AutoHotkey/" A_AhkVersion if (!DllCall("LoadLibrary", "str", "wininet") || !(h := DllCall("wininet\InternetOpen", "str", a, "uint", 1, "ptr", 0, "ptr", 0, "uint", 0, "ptr"))) return 0 c := s := 0 if (f := DllCall("wininet\InternetOpenUrl", "ptr", h, "str", url, "ptr", 0, "uint", 0, "uint", 0x80003000, "ptr", 0, "ptr")) { while (DllCall("wininet\InternetQueryDataAvailable", "ptr", f, "uint*", s, "uint", 0, "ptr", 0) && s>0) { VarSetCapacity(b, c+s, 0) if (c>0) DllCall("RtlMoveMemory", "ptr", &b, "ptr", &buf, "ptr", c) DllCall("wininet\InternetReadFile", "ptr", f, "ptr", &b+c, "uint", s, "uint*", r) c += r VarSetCapacity(buf, c, 0) if (c>0) DllCall("RtlMoveMemory", "ptr", &buf, "ptr", &b, "ptr", c) } DllCall("wininet\InternetCloseHandle", "ptr", f) } DllCall("wininet\InternetCloseHandle", "ptr", h) return c }
  7. Hi, pm me the script, I'm not not familiar with spawners beyond obj spawner templates, but given an example, I think i could come up with something. I'd rather you not have stopped reading tho;) Yea, it's home away from home
  8. Hey there, so I've been playing PR for a long time, 8 years now, since i was 14 actually, i used to play PvP and I'd probably play more, but there are too many other things competing for my time to commit to a full round anymore - and I'm not one to just up and bail mid-game if I can help it. PR COOP, was always an adequate alternative,but repetitive & predictable with static emplacements & spawn points,to the extent where a simple duplication of an identical strategy in a previous round is all that is required to quickly win a round. As a matter of principle i never complain about things for which i have no solution, so what follows are tested suggestions & solutions to enhanced PR coop, eliminating some of the more nuanced complaints about coop through better game logic, ai configuration & server configuration, imho. I figured it's a new decade, i might as well create an account here on VG & reality-mod forum, given I'm still playing this damn game after all these years, and if nothing else, I'd hopefully have contributed something to the way people play PR. NUANCED WALL OF TEXT INCOMING... I've always avoided the tedium of repetition & boredom by playing as many roles & using as many varieties of assets as i can, occasionally taking a long break, while I've always mostly played Arma 3(6000hrs+), KSP, MSFX or Insurgency more so than PR. And what I've come to realize especially from playing Arma 3 more often now is PR Coop can be made better, with simple changes to server configuration or more precisely introduction of new game-play alterations by means of the tested methods below, i hope you indulge me in considering these suggestions with the function of making PR coop a more challenging & therefore more enjoyable experience, something it only ever truly was, at least for me, only when i got started with PR, nowadays PR to me is like tetris, i know all the pieces, where & how they go & i only ever loose or fuck up like when I'm distracted by my phone(which happens a lot) or bs irl. -Most of the suggestions below were functional on a private server i used to play on, server went under, but the methods remained, albeit only in thy head. 1.A new class of players, 'curators' (per designation for zeus in arma 3), permitted one command, '!switch', yes I'm volunteering & no I'm not looking for a legitimate excuse to kill volod ;). It's a role i believe can throw a wrench in the camping tactic that permeates coop,where bots do the same thing over & over again & players do the same in return. Granted PR doesn't even come close to having anything like Arma 3 zeus\highCommand, however having a player curate bot behavior, does not necessitate direct control, you can exercise emergent control; -build emplacements which bots will automatically occupy, -deny access to areas through mines & emplacements funneling player movement, -create a more extensive & randomized spawn network for bots through fobs & as SL -simply transporting bots manually from point a to point b other than on foot -strategic asset suppression to extend the effective life time of bots(i.e kill enemy CAS with AA/AT to let bots push up farther for example), -,..., basically render every strategy from spawn camping to hovering because there's no active AA emplacements to hunting known emplacement locations pointless, i think PR provides adequate command tools & systems to allow this to be a plausible strategy at the very least, i understand working with AI in general,even in Arma, let alone PR is an undesirable if not repugnant proposition to most people because they're not as responsive as people,which in my opinion is an unreasonable expectation to begin with, but taken for what they are, rudimentary behaviorally constrained reactive logic(trigger-constraint-action) & given you understand the limitations of the bots(see "aidefaultstrategies.ai, aibehaviours.ai, aipathfinding.ai" & Battlefield AI - Advanced Topics, then it's basically akin to playing an RTS, effectively a little explored nondescript game-mode in PR. And to be clear, i suggest an alternative to admins taking on this role, as i highly doubt given the temperament & patience it requires ENOUGH existing admins are willing to put in the effort, as it's as only ever as rewarding as your expectations & I'm guessing most will have too low or too high an expectation from this approach, and given the single command provided, which the AD framework allowed configuring, though I'm not sure about RealityAdmin, there's little risk to exploring new people for the role as not much authority comes with it, just !switch. And I've seen how admins switching to bot team, works in servers like SSG for instance, which is little more than trolling players imho & i understand that is a reasonable point of concern for this approach, but with a set of well defined rules similar to those that exist already & with the large extent to which VG is moderated, i don't think that's much of a concern. I've spent a lot of time configuring,modifying & testing ai behaviors in bf2 over the years as a consequence of my compulsive curiosity in the topic at large, if there's one thing I've learned,it's the simple fact that no amount of config changes will make the ai as challenging as they can be when their behavior is properly configured AND that behavior is systemically curated... 2.A few more server side scripts that i think ought to be included, with minor modifications if necessary, which I'm willing to make if called upon.My python isn't too bad ;p. https://projects.uturista.pt/bf2tech/index.php/Scripts:AntiBaseRape ^players, including myself do this a tad too much,especially muttrah,where the spawn point for shilka's & so on is technically a base... https://projects.uturista.pt/bf2tech/index.php/Scripts:AutoMap Or, MM_MapAutoSizer is more compatible with mapvotes from my experience https://projects.uturista.pt/bf2tech/index.php/Scripts:MM_MapAutoSizer ^i understand there's already a map randomize active, but from what i understand, it's sole intent is to avoid repetition & does not factor in the number of players. https://projects.uturista.pt/bf2tech/index.php/Scripts:OfftimePy ^for the rare occasion no admin is online https://projects.uturista.pt/bf2tech/index.php/Scripts:ThreatAndWorth ^i much like this approach to the existing point system,in the abstract, it pretty much means a tank killed by infantry earns-looses more points than a tank killed by a tank, you get the drift. https://projects.uturista.pt/bf2tech/index.php/Scripts:TK_punish_announcer ^makes known the serial tk'ers in our midst with autokick, I'm nothing of the sort, i only had 200tk's in 2019, thanks for that damn list btw acro. >I've played with all the above & i think they'd make fine additions to the coop server, if you so agree. I authored none of these, scripts just happened to be used for the bf2-pr dedi of some arma 3 unit with which i used to play with, now defunct. 3.I understand that opfor events are few & far between because of the need for custom map config changes for each map,but I've experimented with a reliable alternative approach using autobalance that makes bots playable for either faction on a map. With a 0% AI balance where all AI are grouped to one side, a servers side script to teamswitch players on init will be unnecessary provided max AI defined exceeds the number of possible number of players 40pV40b for instance, now with autobalance enabled the sides chosen flip logically with the first round on mission start always deferring to opfor & the flipping the bot faction on every subsequent run, which logically flips player faction respectively, so take kashan for example, iff on init players are bluefor, with autobalance enabled, !reload, will reload the mission with bots as bluefor & players autobalance switched to opfor., Autobalance is disabled for a good number of reasons, but AUTOBALANCE + COMPATIBLE MAPLIST//where bots can put up an effective fight on either side,i.e Kashan NOT Jabal, Kamisiyah NOT MuttrahStd/Large, etc.. generally any map/layer(ex. ,muttrah inf vs std/lrg) where there is no body of water to traverse & player faction doesn't initially occupy the majority of sectors is a valid map//. So if nothing else, such a config that doesn't require individual map modification is a valid means of having playable opfor, but more so, such a variance will increase the variety of playable factions in coop and implicitly increase replayability. Too many people have this notion of the 'evil' autobalance, like all things, properly understood & configured, it can be put to great use, just a thought i feel warrants serious consideration. Maybe have an Autobalanced second server for greater variance, where you alternate between bluefor & opfor sequentially on suitable maps, using !reload to swap teams based on, say, a vote, see what people prefer? Or simpler still since i understand the reason for a single server, have days where server runs autobalanced with a logically selected maplist. 4.Modified AI Behavior, using core configs instead of map configs, the more practical means of doing so, I've attempted to see what such modifications are currently active & most modifications comprise individual map config changes which complicates updates though generally not tedious if scripted i guess,but even that contrasts the fact that the most meaningful(as a consequence of outcome) changes to ai behavior can be made in the core ai config. And based on what I've seen, there seem to be little divergence between stock ai behavior & in game behavior on VG,so maybe it's high time changes to ai are made, here are a few suggestions & examples... -Why Bots Swim? Water Weights for Infantry, the reason why bots swim in the open instead of walking where appropriate, aisettings.setVehicleMods Infantery StandardWeights aiSettings.setVehicleMaterialCost Infantery Ground 1 aiSettings.setVehicleMaterialCost Infantery Road 1 aiSettings.setVehicleMaterialCost Infantery Shallows 1.1 aiSettings.setVehicleMaterialCost Infantery DeepWater 6 ,this default config makes sense on very few maps & is the reason bots swim on pavlovsk or jabal & remember, if bots swim, they can't use weapons,so setting the DeepWater weight to 1, same as ground & road, will make them swim when no roads or ground exists in direction of travel,deferring otherwise, when not, with the occasional exception to the case, as is the nature of weights. Such simple changes are the difference between 40 bots LOADED ON MAP & 40 bots COMBAT EFFECTIVE ON MAP, an important difference, dare i say. More Examples Below: For example under standardweights (running on foot) aiSettings.createBehaviourModifiers StandardWeights aiSettings.setBehaviourModifier Avoid 1.0 aiSettings.setBehaviourModifier MoveTo 1.0 aiSettings.setBehaviourModifier Idle 0.1 aiSettings.setBehaviourModifier Fire 7.5 aiSettings.setBehaviourModifier Special 3.0 aiSettings.setBehaviourModifier TakeCover 2.0 aiSettings.setBehaviourModifier Change 1.9 aiSettings.setBehaviourModifier Revive 3.0 Revive from 3.0 to 8.0, meaning medics will revive before they shoot. aiSettings.setVehicleDefaultBehaviour Infantery Idle to aiSettings.setVehicleDefaultBehaviour Infantery MoveTo So that if the bot has nothing else to do, it's default action will be to move to the next objective. if you change these lines in the mod's \AI\Aibehaviors.ai file: aisettings.setVehicleMods Plane StandardWeights aisettings.setVehicleMods Helicopter StandardWeights to use custom weights as show (These lines are separate sections for planes and Helis) aisettings.setVehicleMods Plane StandardWeights aisettings.setVehicleMods Helicopter HeliMoveWeights where this is what the Planes and Helis currently use: aiSettings.createBehaviourModifiers StandardWeights aiSettings.setBehaviourModifier Avoid 1.0 aiSettings.setBehaviourModifier MoveTo 1.0 aiSettings.setBehaviourModifier Idle 0.1 aiSettings.setBehaviourModifier Fire 7.5 aiSettings.setBehaviourModifier Special 3.0 aiSettings.setBehaviourModifier TakeCover 2.0 aiSettings.setBehaviourModifier Change 1.9 aiSettings.setBehaviourModifier Revive 3.0 aiSettings.setBehaviourModifier c4 1.0 aiSettings.setBehaviourModifier Special2 1.0 aiSettings.setBehaviourModifier Special3 1.0 aiSettings.setBehaviourModifier Random 1.0 aiSettings.setBehaviourModifier Triggerable 1.0 Avoid is set to a weight of only 1, compared to fire which is 7.5. Where weights, used to adjust the chance of a bot choosing a specific action. The following modification to Plane & Helicopter weights respectively for instance make bot aircraft's far more dangerous & effective, remember, Bot Aircraft are disallowed to players because they mostly have unlimited ammo, changes below make it rain & the 'avoid' weights for planes for instance, though specified as a 2D collision avoidance weight seem to additionally influence the tendency of bot planes to attempt evasion towards their base, where AA emplacements are usually active so, the effects cascade, every change cascades. //Commented Lines Signify Default Values aiSettings.createBehaviourModifiers PlaneWeights // aiSettings.setBehaviourModifier Avoid 0.0 aiSettings.setBehaviourModifier Avoid 7.5 // aiSettings.setBehaviourModifier MoveTo 1.0 aiSettings.setBehaviourModifier MoveTo 2.2 aiSettings.setBehaviourModifier Idle 0.01 // aiSettings.setBehaviourModifier Fire 1.5 aiSettings.setBehaviourModifier Fire 8.5 // aiSettings.setBehaviourModifier Special 1.0 aiSettings.setBehaviourModifier Special 3.0 //^none primary weapons such as grenades, rockets, bombs,etc... // aiSettings.setBehaviourModifier TakeCover 0.0 aiSettings.setBehaviourModifier TakeCover 2.0 // aiSettings.setBehaviourModifier Change 0.0 aiSettings.setBehaviourModifier Change 1.9 // aiSettings.setBehaviourModifier Revive 1.0 aiSettings.setBehaviourModifier Revive 3.0 //^it has this weird effect where it makes them more likely to stay close to each other aiSettings.setBehaviourModifier c4 1.0 // aiSettings.setBehaviourModifier Special2 1.0 aiSettings.setBehaviourModifier Special2 3.0 // aiSettings.setBehaviourModifier Special3 1.0 aiSettings.setBehaviourModifier Special3 3.0 aiSettings.setBehaviourModifier Random 1.0 aiSettings.setBehaviourModifier Triggerable 1.0 aiSettings.createBehaviourModifiers HeliMoveWeights // aiSettings.setBehaviourModifier Avoid 0.0 aiSettings.setBehaviourModifier Avoid 8.5 // aiSettings.setBehaviourModifier MoveTo 1.0 aiSettings.setBehaviourModifier MoveTo 5.0 aiSettings.setBehaviourModifier Idle 0.01 // aiSettings.setBehaviourModifier Fire 1.5 aiSettings.setBehaviourModifier Fire 8.5 // aiSettings.setBehaviourModifier Special 1.0 aiSettings.setBehaviourModifier Special 3.0 // aiSettings.setBehaviourModifier TakeCover 0.0 aiSettings.setBehaviourModifier TakeCover 4.0 aiSettings.setBehaviourModifier Change 2.5 // aiSettings.setBehaviourModifier Revive 1.0 aiSettings.setBehaviourModifier Revive 3.0 aiSettings.setBehaviourModifier c4 1.0 aiSettings.setBehaviourModifier Special2 1.0 aiSettings.setBehaviourModifier Special3 1.0 aiSettings.setBehaviourModifier Random 1.0 aiSettings.setBehaviourModifier Triggerable 1.0 So for the most part bots don't suck because 'bots', but because they're handicapped by design in their configuration, which considers few players going up against them, Essentially, given VG is for the most part exclusively a COOP server, perhaps it's time to stop using stock AI configs for better custom configs, because the default configs simply weren't designed with 40v40 Coop in mind, they were seemingly optimized for single player & at most for just a few players. In the mean time i think playing with bots can be made more interesting & challenging through systems & tools already in the game without looking to the devs or scripts, which as awesome as they are, lets be real, bots are a low priority subsystem in PR,with primary focus on PvP, at least where R-DEV is concerned,so maybe it's time to consider pragmatic solutions such as those specified above. Here's a great article on gamasutra about how game mechanics translates to replayability, https://www.gamasutra.com/view/feature/131468/replayability_part_2_game_.php , a good read. SORRY FOR THE WALL OF TEXT, but despite all these years of playing PR, CooP is still little more than a shooting gallery,despite almost all suggestions above being made possible because of existing Battlefield 2 subsystems at the core & improving CooP using these subsystems is rare to see, i strongly believe there's still a lot of unexplored potential ,i play coop not as alternative to deployment, but as a discrete experience unto itself, with different challenges & fun to be had, bots are SHOCKINGLY not people & having SHOCKINGLY good aim, that's unrealistic as most would say, just a different set of challenges so far as I'm concerned, where people are smart bots are fast, where people are fast bots are faster, simple as that, where as i think most players especially new ones play coop for little more than practice or just the 'shooting gallery' bit, which it unfortunately is atm, especially when population exceeds 15. So perhaps it's high time you reconsider how we fundamentally play PR CooP as opposed to how it could practically be played to a more rewarding extent, using some of the suggestion above, which I've made certain are practical & well tested & not merely things I'd like to see happen. And please note, this comes not, from a place of entitlement nor prejudice(against bots;)) but of frustration & boredom at maps i know too well & bots i understand too well. Cheers & Regards, X0R.