Jump to content

genesis92x

Member
  • Content Count

    926
  • Joined

  • Last visited

  • Medals

Everything posted by genesis92x

  1. Vcom AI 3.3.0 AI Modification: Faster, Smarter, and Deadlier AI. Vcom AI 3.3.0 is an AI overhaul modification (Script or Mod) that aims to change the feel of combat in a PvE environment. 3.3.0 Hotfix -Fixed several errors related to radios/groups 3.2.2 -CBA integration fixes -Artillery error fixes -Added Vcom Driving (experimental) -Vcom AI will ignore squads with players in them -Overhauled initialization -AI movement during combat tweaked -AI healing improved -AI unique animations -Other things I forgot about HUGE THANKS TO FREDDO FOR ASSISTING SO GREATLY IN MY ABSENCE! Added Changelog Rydigiers "Fire For Effect" artillery system CBA settings support for "Fire For Effect" artillery system Parameter for forcing speedMode "FULL" Descriptive header for all Vcom functions VCOM is now licensed under the ArmA Public License - Share Alike Zeus to mission.sqm Changed Vcom will not give flanking orders to AI with a commander Suppressors are now dynamically checked Mines are now handled differently (Placed mines are added to an array) AI will no longer ragdoll when prone, will instead perform animations AI will not ragdoll when within a certain distance of a player VCom functions have been moved to Vcom\Functions\VCM_Functions Hold waypoints now define what building to garrison AI will not generate flanking waypoints targetting unknown units Deprecated VCom artillery (Replaced by "Fire For Effect") Fixed VCM_SKILLCHANGE had no effect AI taking control when player incapacitated AI attempting to flank aircraft Building clearing behaviour did not check distance to target Civilians being affected by VCOM VCM_SIDEENABLED had no effect VCM_ARTYENABLE had no effect Security Whitelisted remote execution for VCOM And much more that I forgot.... What does Vcom AI offer? Optimizations For starters, Vcom AI 3.0 offers a noticeable increase of performance over its older counter-part, Vcom AI 2.81. Functions on a group based FSM system, instead of an individual AI system. Allowing for better FPS, control, and cohesion with AI. Removed fluff and unnecessary code from Vcom AI 2.81, making the mod/script much more focused. Customization Use the Userconfig file to modify Vcom AI to your liking, or if CBA is running you can modify the settings in-game and on the fly. Advanced AI Direction and Threats -AI will clear garrisoned buildings -AI will automatically generate waypoints for more interesting and varied combat (AI will not do this if they have certain pre-placed waypoints or more than 1 move waypoint) -AI move dynamically from cover to cover while following waypoints -AI will call for on-map artillery for support -AI will call for reinforcements proportional to the enemy threat -AI will garrison structures temporarily in combat, if able -AI will look for nearby static weapons to man -AI will automatically deploy/pack static weapons -AI will use satchels to drop buildings, or setup traps for enemies -AI will use mines to on roads, in buildings, or wherever, to stop enemy movement -AI will change formations depending on the environment -AI will attempt to heal themselves or others when out of combat -AI will attempt to rearm themselves from dead bodies, vehicles, and etc when low -AI will steal empty or unlocked vehicles -AI have a chance to ragdoll when shot, causing them to fall over briefly -AI have an enhanced ability to hear and respond to gunfire from a distance -AI will respond differently from a weapon that is suppressed or not -AI on a hold waypoint will garrison a structure indefinitely, or until provided another order -AI, with NVGs, will be able to see your IR laser and respond accordingly. Be careful where you point that thing! -AI can have side based/classname based skill settings. Ease of use Vcom AI is easy to use. Install it, throw some units down, and go. It supports AI being spawned in dynamically, so there is no worry about needing to execute the code on every freshly spawned AI. To manage specific AI group behaviors, simply use these commands listed below. (group this) setVariable ["VCM_NOFLANK",true]; //This command will stop the AI squad from executing advanced movement maneuvers. (group this) setVariable ["VCM_NORESCUE",true]; //This command will stop the AI squad from responding to calls for backup. (group this) setVariable ["VCM_TOUGHSQUAD",true]; //This command will stop the AI squad from calling for backup. (group this) setVariable ["Vcm_Disable",true]; //This command will disable Vcom AI on a group entirely. (group this) setVariable ["VCM_DisableForm",true]; //This command will disable AI group from changing formations. (group this) setVariable ["VCM_Skilldisable",true]; //This command will disable an AI group from being impacted by Vcom AI skill changes. Known Issues -AI's with mortars will still attempt to deploy the mortar INSIDE a structure. -You must enable -filepatching on your server/machine if you want the userconfig folder to work. Not doing this may result in an error message. Donations Hey, working on this can be difficult and I do it in my spare time. If you want to show me a little love for what I do, I won't say no. With any brand new release, expect some bugs. They will be addressed when I am able. If you want to ensure that I see bugs, suggestions, or questions, hop on my discord and leave a comment the #bugreports channel or #suggestions channel, or preferably post in the Github! Discord Vcom AI 3.3.2 GitHub - SUBMIT BUGS/REQUESTS/ETC HERE! Vcom AI 3.3.2 Steam Version
  2. I'm not sure exactly, but I don't see why MCC4 wouldn't be compatible with Vcom. The GAIA aspect and Vcom may play alright together. Vcom AI does not generate additional waypoints if there are already waypoints created
  3. Vcom AI does not make AI pick up weapons
  4. genesis92x

    Mounting and dismounting ai loop

    Not without some more intricate coding. I believe using the "TR UNLOAD" waypoint type will make any AI in cargo slots disembark and not attempt to enter the vehicle again...So making vehicles do this during combat will prevent AI from entering in repeatedly
  5. genesis92x

    [CTI,TvT,CooP] Dissension

    Currently on steam I believe.
  6. [CooP, TvT, CTI] Dissension Objective Kill the opposing team's commander. That's it. That's the primary objective. There are hundreds of secondary objectives, but this is the primary one. Features Downloads: Update Time! Several bug fixes - Removed all nonsteerable parachutes to fix game from freezing. 1st Attempt at preventing AI units from getting stuck All players can construct items off the same crate to assist in building bases (will still require own purchased HQ) Fix for towns that have only 1 person left to cap. (Towns that report only 1 remaining WITH A FULL BAR have simply not been initialized yet). Several other small bug fixes Dissension Altis V1.2 Dissension Tanoa V1.2 Dissension Source Files The steam version will be updated once I can figure out this issue here. AI Commanders These AI commanders are more than your "capture closest territory" formulas. They come with randomized personalities and army traits. Personalities: These will dictate how the AI choose to engage enemies. Some commanders will like all-out blitzkrieg strategies while others prefer more subtle approaches. Army Traits: These will determine what the commander prefers to create their army with. Every commander will have the basics, but some will prefer more infantry while others will prefer more tanks. These traits interact with many variables to create a unique experience each game. Each of these traits can drastically change the approach the commanders take to the battlefield. Perhaps one commander prefers settings traps and ambushing enemies, while another prefers a Blitzkrieg approach, while yet another prefers to sit back and let the artillery do the talking. AI Hate Humans AI commanders always have something in store for players. They like to adapt to what players are doing. If they notice you using a little too much air, they will just order (which takes resources) a lot of anti-air vehicles, planes, or whatever they'd like. They will match your force with equal force, if they have the resources. Simply steam rolling over the AI with numbers will not be enough - you will need strategy. You will need to attack the AI from multiple sides. Have fun trying to simply "drop" onto the commander to kill him. He doesn't like that. WORK AS A TEAM! Dissension offers an actual difficult Players vs AI challenge. You have to work together. AI Base Construction The AI commander will dynamically utilize squads to defend, patrol, and assault areas. The AI commander will deploy structures and respawn points in new locations to keep the travel time to a minimum for troops while also generously giving out vehicles to select AI squads to traverse the distance before and after combat. Even bodies of water are not a problem as AI will automatically use aircraft to transport units AND vehicles across great expanses of land or sea. Each spawned unit takes 1 ticket and costs resources. It is vital that the AI commanders can quickly expand and spend resources effectively to produce a steady stream of units. Player Base Construction Players can construct their own bases where they can respawn, sell vehicles, sell gear, purchase gear, and purchase vehicles. Be warned, AI will actively seek out player bases if they are too close. Base Destruction Base objects must be destroyed by placing "explosives" on them. If the explosive is not disarmed, it will...explode... and destroy the structure. Players must protect their structures against enemy players and AI alike, lest your base be removed from the face of the planet. Randomized Map Resources Dissension can run on almost any map that has multiple towns and is properly configured, with a simple copy and paste setup. In Dissension, you don't just fight over the towns, you fight over everything. See that interesting point on the map? Yeah, you have to capture that. See that random little island that most people forget about? Yeah, that needs to be captured, prepare for an island invasion. Each map grid, and each town, produce resources for the AI commander's war machine. The more towns/grids you capture, the more cash you get as well. Every town produces a randomize amount of all four resources (Oil,Power,Cash, and Materials). Every grid produces 1 random resource, based off what map objects are around that grid. Advanced UI Design Navigate every feature the game has to offer right from the convenience of a single screen. This UI was lovely crafted by Soolie, a master of ArmA UI design. Supply Lines As the battlefield expands, so does the commander's need for supplies. Supplies must be ferried by players to local structures. Delivering these supplies gives the commander a nice boost of resources and you get a nice cut of the cash as well. Recruit AI Recruit AI into your squad to help man vehicles or to take with you into a town! Every 10 levels gives you one additional AI that you can recruit. Custom Medical/Engineer/Sniper System This comes with a custom medical system. It's simple, but effective. Engineers get rewarded for doing their job, and medics get rewarded for doing their job. You just revived someone? Well here you go pal, here's some nice cash and a little bit of XP. You just got revived by a player without a medikit? Well you're up, but pretty bruised and slow. Well, a FAK will get you up to a decent speed...but without a medic you won't be healed completely. Are you a sniper? Well don't worry if you don't get a lot of kills - the further you can shoot that enemy standing stupidly in the open, the more money you can get! Custom rearm/repair/refuel system Ha! You thought you could just hop into an artillery piece and saturate the map with arty without paying for it, didn't you? Well not only do you have to pay for the artillery. You have to PAY FOR EACH ROUND. Yep. When you go to rearm, you get charged for every round. Ouch. Better make sure those rounds count. This holds true for repairing and refueling, it will cost you. Non-Restrictive Leveling System What's this? A leveling system in an ArmA mission that doesn't simply let you unlock weapons? Weapons that you already paid to have? So, what. Your fancy leveling system must unlock the right to access vehicles? No? Hm. What does it do? The leveling system simply allows you to gain access to unique abilities that do not offer a severe advantage over the battle field. The heavier abilities take time to level to and are costly. While the most frequently used lesser abilities take a few hundred $ and allow you to resupply your team more effectively. You get the idea. It's a fun way to watch yourself progress without it overriding what you do. The idea is simple: Give the player more things to play with, not return what they lost. Freedom of Movement Just like many other CTI missions, the players are free to do just about anything. Perhaps you enjoy helping the AI take towns. Or maybe you enjoy setting up ambushes on convoys or supply lines. The sky is the limit and Dissension aims to create a fun experience no matter where you go in the world. Squad Radar What? Another scripted squad radar? Big deal. Wait! This one is fancy, I promise. See? Hit backspace there. You see? You can filter through all sorts of different modes. You can see names, primary weapon, secondary weapons, unit roles, or even disable it! Vcom AI Vcom AI is baked right into the mission, SO DON'T RUN THE MOD WITH THIS. This means that the AI are vicious in attacking the players AND don't break the mission. Because it was designed around it by the guy who made the mod! Would you just look at that. I hope you like being mortared. Vehicle Customization Feel free to deck out your vehicles with whatever gear you want! Take advantage of ArmA's customizable vehicles. Would you like to have 12 GBU's on that plane? Well you can do that! If you can pay... Parameters, Parameters, Parameters Almost everything about Dissension is customizable. Just look at the size of these parameters! I'm sure there is more...but that is all I will put down for now. Come play! Join in on the fun! Help test! Have questions? Want to play with a group? Have suggestions? Want to pick a fight? Come to our Discord! https://discord.gg/gxc2Wzy I spent many, many, many hours on this project. Feel free to warm your cold heart by donating to a poor ArmA 3 coder: DONATE TO WARM MY COLD HEART
  7. I apologize, I have not. I have been slammed with multiple requests and projects at the moment. I will have to dig it up - I did not realize that code is actually missing from the current version! It essentially was very similar to how AI deployed static weapons, it looked at the classname of the backpack and created the vehicle that the bag was supposed to assemble. Mostly right! I would remove the // from that line. To make sure the difficulty gets set, I would make sure to put that code at the end of the init.sqf, after VCOM is loaded. So it will correctly override the settings. If you are using the script version (and do not have file patching enabled) I would change the defaultsettings.sqf file. located inside the vcom folder somewhere
  8. genesis92x

    FSM vs SQF

    Thanks for explaining it, instead of just linking to the wiki! There isn't much documentation on it 🙂
  9. genesis92x

    FSM vs SQF

    I'm no expert, but isn't it a little more complicated than that? FSM condition evaluation is on each frame and unscheduled. Do you mean that they somehow run on a 3ms schedule, but the code contained within the FSM is executed in an unscheduled environment? You are not allowed to use sleep/waituntil in an FSM.
  10. Gen_VirtualCargo Hey all, I made this simple function in about ~2 hours for a mission of mine and thought the community as a whole might get some use out of it. It is a lightweight, mod compatible, easy-to-use, virtual cargo system that allows vehicles to "carry" objects/other vehicles around and deploy them dynamically across the battlefield. Including ammo crates and etc. The function pulls how much each vehicle can hold from it's config. A simple but intuitive UI. It also allows for dynamic placement of objects into the world. Features - Store objects into vehicles - Deploy objects from vehicles using a line-of-sight system - Prevents using objects to "punt" or destroy other objects (restrictive placement system) - Light weight - Easy to mod - Supports modded vehicles - Keeps inventories and damage states of transported objects. - avoids using attachto due to FPS hit by attachto Bugs I made it in ~2 hours, there will be a few bugs. How to use? Usage is fairly simple. Download the folder below, and copy the description.ext into your mission and the folder Gen_VirtualCargo. Place this code in the init for any vehicle you wish to be affected by this script. if (isServer) then { [ [CargoVehicle1], { if !(hasInterface) exitWith {}; params ["_Veh"]; _Veh addAction ["Cargo Access", {params ["_target", "_caller", "_actionId", "_arguments"];[_target] spawn GEN_fnc_VirtualCargo;},[],0.5,false,true,"(alive _target)"]; } ] remoteExecCall ["BIS_fnc_call",0,CargoVehicle1]; }; Have fun! https://www.dropbox.com/s/vywsoaixcr4ihyo/Gen_VirtualCargo.7z?dl=0
  11. genesis92x

    Adding cargo to vehicles

    Should almost be treated like one. When I began scripting long ago - I found it rather silly and the 'helpful' applications of it seemed to be outweighed by the helpful applications of it. Much easier to just create a little script to handle unit init's instead of editor based init's
  12. genesis92x

    Adding cargo to vehicles

    Keep in mind (unless this has been fixed?) that if you add that command to a units init, it will execute everytime a player joins. So if you have a JIP mission, take that into consideration. It might help to name the units and add those commands into the init.sqf inside a if (isserver) then {};
  13. I have generally stayed away from AI boats due to terrible experiences I have had with them. With that said, off the top of my head, there may be some things that (could) help? I'm at the office here, so I can't test anything. On the init of the vehicle, you could try a limitspeed command this limitspeed 10; Sure it won't make the boat "zoom" around, but it may give them just enough "control" to not beach their boat? You could try splitting the driver/gunners into two separate groups and give the driver careless behavior, or possibly settings the whole group to careless and looping a suppressivefire command once they detect the players. Worst comes to worst, you can make the boat not take damage, and occasionally check if the boat is beached with issurfacewater, and then setvelocity back into the water or setpos it.
  14. The move command fails in MP most likely due to the helicopter1 group not being local to the computer that is executing the command. In mulitplayer/ a dedicated environment you will want to use remoteexec to assure the unit gets his movement order correctly - or have the addaction call a function that is ran server side that will run all the code you need.
  15. genesis92x

    [Release] Enhanced UAV Intel

    What a cool idea 🙂 Thanks for sharing this
  16. genesis92x

    RemoteExec on a global scale

    You're right. It's not a magic bullet. It's a valuable tool that requires some practice in using. I will definitely take the time in figuring out how to use remoteexec in the most efficient ways - it's a great solution for missions for resolving a lot of locality issues. Keep in mind, depending on the magical circumstances of the ArmA 3 engine, remoteexec may not be 100% precise in executing the code. remoteexec is also great for a quick solution for JIP addactions, as you can tie it to the object the addaction is added to - and upon deletion of that object it removes itself from the JIP list.
  17. Stupid question here, what purpose does "force force" do? Here is the default CBA config and userconfig from Vcom, they look different - perhaps the issues can be found there [] spawn { sleep 1; waitUntil {!(isNil "CBAACT")}; if (CBAACT && VCM_USECBASETTINGS) then { [ "VCM_ActivateAI", // Internal setting name, should always contain a tag! This will be the global variable which takes the value of the setting. "CHECKBOX", // setting type "Vcom Active", // Pretty name shown inside the ingame settings menu. Can be stringtable entry. "VCOM SETTINGS", // Pretty name of the category where the setting can be found. Can be stringtable entry. true, // data for this setting: true, // "_isGlobal" flag. Set this to true to always have this setting synchronized between all clients in multiplayer { params ["_value"]; VCM_ActivateAI = _value; } // function that will be executed once on mission start and every time the setting is changed. ] call CBA_Settings_fnc_init; //VCM_USECBASETTINGS = true; If CBA is enabled on the host, use the CBA default settings. If false, use the filepatching settings instead. [ "VCM_USECBASETTINGS", // Internal setting name, should always contain a tag! This will be the global variable which takes the value of the setting. "CHECKBOX", // setting type "Use CBA-Vcom Settings?", // Pretty name shown inside the ingame settings menu. Can be stringtable entry. "VCOM SETTINGS", // Pretty name of the category where the setting can be found. Can be stringtable entry. true, // data for this setting: true, // "_isGlobal" flag. Set this to true to always have this setting synchronized between all clients in multiplayer { params ["_value"]; VCM_USECBASETTINGS = _value; } // function that will be executed once on mission start and every time the setting is changed. ] call CBA_Settings_fnc_init; [ "VCM_Debug", // Internal setting name, should always contain a tag! This will be the global variable which takes the value of the setting. "CHECKBOX", // setting type "Enable Debug Mode. Mostly systemchat messages.", // Pretty name shown inside the ingame settings menu. Can be stringtable entry. "VCOM SETTINGS", // Pretty name of the category where the setting can be found. Can be stringtable entry. false,// data for this setting: true, // "_isGlobal" flag. Set this to true to always have this setting synchronized between all clients in multiplayer { params ["_value"]; VCM_Debug = _value; } // function that will be executed once on mission start and every time the setting is changed. ] call CBA_Settings_fnc_init; [ "VCM_SIDEENABLED", // Internal setting name, should always contain a tag! This will be the global variable which takes the value of the setting. "LIST", // setting type "Sides impacted by Vcom.", // Pretty name shown inside the ingame settings menu. Can be stringtable entry. "VCOM SETTINGS", // Pretty name of the category where the setting can be found. Can be stringtable entry. [[[west,east,resistance],[west,east],[west],[east],[resistance],[resistance,west],[resistance,east]],[["West, East, Resistance"],["West, East"],["West"],["East"],["Resistance"],["Resistance, West"],["Resistance, East"]],0], // data for this setting: true, // "_isGlobal" flag. Set this to true to always have this setting synchronized between all clients in multiplayer { params ["_value"]; VCM_SIDEENABLED = _this; } // function that will be executed once on mission start and every time the setting is changed. ] call CBA_Settings_fnc_init; [ "VCM_ARTYENABLE", // Internal setting name, should always contain a tag! This will be the global variable which takes the value of the setting. "CHECKBOX", // setting type "Enable AI use of Artillery", // Pretty name shown inside the ingame settings menu. Can be stringtable entry. "VCOM SETTINGS", // Pretty name of the category where the setting can be found. Can be stringtable entry. true, // data for this setting: true, // "_isGlobal" flag. Set this to true to always have this setting synchronized between all clients in multiplayer { params ["_value"]; VCM_ARTYENABLE = _value; } // function that will be executed once on mission start and every time the setting is changed. ] call CBA_Settings_fnc_init; [ "VCM_ARTYSIDES", // Internal setting name, should always contain a tag! This will be the global variable which takes the value of the setting. "LIST", // setting type "Sides that will use VCOM Artillery", // Pretty name shown inside the ingame settings menu. Can be stringtable entry. "VCOM SETTINGS", // Pretty name of the category where the setting can be found. Can be stringtable entry. [[[west,east,resistance],[west,east],[west],[east],[resistance],[resistance,west],[resistance,east]],[["West, East, Resistance"],["West, East"],["West"],["East"],["Resistance"],["Resistance, West"],["Resistance, East"]],0], // data for this setting: true, // "_isGlobal" flag. Set this to true to always have this setting synchronized between all clients in multiplayer { params ["_value"]; VCM_ARTYSIDES = _this; } // function that will be executed once on mission start and every time the setting is changed. ] call CBA_Settings_fnc_init; [ "VCM_CARGOCHNG", // Internal setting name, should always contain a tag! This will be the global variable which takes the value of the setting. "CHECKBOX", // setting type "Vcom handling of disembark/embarking for AI?", // Pretty name shown inside the ingame settings menu. Can be stringtable entry. "VCOM SETTINGS", // Pretty name of the category where the setting can be found. Can be stringtable entry. true,// data for this setting: true, // "_isGlobal" flag. Set this to true to always have this setting synchronized between all clients in multiplayer { params ["_value"]; VCM_CARGOCHNG = _value; } // function that will be executed once on mission start and every time the setting is changed. ] call CBA_Settings_fnc_init; [ "VCM_TURRETUNLOAD", // Internal setting name, should always contain a tag! This will be the global variable which takes the value of the setting. "CHECKBOX", // setting type "Disembark from turret positions?", // Pretty name shown inside the ingame settings menu. Can be stringtable entry. "VCOM SETTINGS", // Pretty name of the category where the setting can be found. Can be stringtable entry. true,// data for this setting: true, // "_isGlobal" flag. Set this to true to always have this setting synchronized between all clients in multiplayer { params ["_value"]; VCM_TURRETUNLOAD = _value; } // function that will be executed once on mission start and every time the setting is changed. ] call CBA_Settings_fnc_init; [ "VCM_DISEMBARKRANGE", // Internal setting name, should always contain a tag! This will be the global variable which takes the value of the setting. "SLIDER", // setting type "Distance AI disembark from the enemy?", // Pretty name shown inside the ingame settings menu. Can be stringtable entry. "VCOM SETTINGS", // Pretty name of the category where the setting can be found. Can be stringtable entry. [50,1000,200,0], // data for this setting: [min, max, default, number of shown trailing decimals] true, // "_isGlobal" flag. Set this to true to always have this setting synchronized between all clients in multiplayer { params ["_value"]; VCM_DISEMBARKRANGE = _value; } // function that will be executed once on mission start and every time the setting is changed. ] call CBA_Settings_fnc_init; [ "VCM_StealVeh", // Internal setting name, should always contain a tag! This will be the global variable which takes the value of the setting. "CHECKBOX", // setting type "AI steal empty/unlocked vehicles?", // Pretty name shown inside the ingame settings menu. Can be stringtable entry. "VCOM SETTINGS", // Pretty name of the category where the setting can be found. Can be stringtable entry. true,// data for this setting: true, // "_isGlobal" flag. Set this to true to always have this setting synchronized between all clients in multiplayer { params ["_value"]; VCM_StealVeh = _value; } // function that will be executed once on mission start and every time the setting is changed. ] call CBA_Settings_fnc_init; [ "VCM_ClassSteal", // Internal setting name, should always contain a tag! This will be the global variable which takes the value of the setting. "CHECKBOX", // setting type "Class restriction for stealing vehicles", // Pretty name shown inside the ingame settings menu. Can be stringtable entry. "VCOM SETTINGS", // Pretty name of the category where the setting can be found. Can be stringtable entry. true,// data for this setting: true, // "_isGlobal" flag. Set this to true to always have this setting synchronized between all clients in multiplayer { params ["_value"]; VCM_ClassSteal = _value; } // function that will be executed once on mission start and every time the setting is changed. ] call CBA_Settings_fnc_init; [ "VCM_ForceSpeed", // Internal setting name, should always contain a tag! This will be the global variable which takes the value of the setting. "CHECKBOX", // setting type "Enforce AI Speed 'FULL'?", // Pretty name shown inside the ingame settings menu. Can be stringtable entry. "VCOM SETTINGS", // Pretty name of the category where the setting can be found. Can be stringtable entry. true,// data for this setting: true, // "_isGlobal" flag. Set this to true to always have this setting synchronized between all clients in multiplayer { params ["_value"]; VCM_FullSpeed = _value; } // function that will be executed once on mission start and every time the setting is changed. ] call CBA_Settings_fnc_init; [ "VCM_ADVANCEDMOVEMENT", // Internal setting name, should always contain a tag! This will be the global variable which takes the value of the setting. "CHECKBOX", // setting type "AI generate new waypoints to flank.", // Pretty name shown inside the ingame settings menu. Can be stringtable entry. "VCOM SETTINGS", // Pretty name of the category where the setting can be found. Can be stringtable entry. true,// data for this setting: true, // "_isGlobal" flag. Set this to true to always have this setting synchronized between all clients in multiplayer { params ["_value"]; VCM_ADVANCEDMOVEMENT = _value; } // function that will be executed once on mission start and every time the setting is changed. ] call CBA_Settings_fnc_init; [ "VCM_FRMCHANGE", // Internal setting name, should always contain a tag! This will be the global variable which takes the value of the setting. "CHECKBOX", // setting type "AI change formations based on location.", // Pretty name shown inside the ingame settings menu. Can be stringtable entry. "VCOM SETTINGS", // Pretty name of the category where the setting can be found. Can be stringtable entry. true,// data for this setting: true, // "_isGlobal" flag. Set this to true to always have this setting synchronized between all clients in multiplayer { params ["_value"]; VCM_FRMCHANGE = _value; } // function that will be executed once on mission start and every time the setting is changed. ] call CBA_Settings_fnc_init; [ "VCM_SKILLCHANGE", // Internal setting name, should always contain a tag! This will be the global variable which takes the value of the setting. "CHECKBOX", // setting type "AI impacted by Vcom skill settings.", // Pretty name shown inside the ingame settings menu. Can be stringtable entry. "VCOM SETTINGS", // Pretty name of the category where the setting can be found. Can be stringtable entry. true,// data for this setting: true, // "_isGlobal" flag. Set this to true to always have this setting synchronized between all clients in multiplayer { params ["_value"]; VCM_SKILLCHANGE = _value; } // function that will be executed once on mission start and every time the setting is changed. ] call CBA_Settings_fnc_init; [ "VCM_AIDISTANCEVEHPATH", // Internal setting name, should always contain a tag! This will be the global variable which takes the value of the setting. "SLIDER", // setting type "Distance AI will steal vehicles from.", // Pretty name shown inside the ingame settings menu. Can be stringtable entry. "VCOM SETTINGS", // Pretty name of the category where the setting can be found. Can be stringtable entry. [0,1000,100,0], // data for this setting: true, // "_isGlobal" flag. Set this to true to always have this setting synchronized between all clients in multiplayer { params ["_value"]; VCM_AIDISTANCEVEHPATH = _value; } // function that will be executed once on mission start and every time the setting is changed. ] call CBA_Settings_fnc_init; [ "VCM_RAGDOLL", // Internal setting name, should always contain a tag! This will be the global variable which takes the value of the setting. "CHECKBOX", // setting type "AI Ragdoll when hit?", // Pretty name shown inside the ingame settings menu. Can be stringtable entry. "VCOM SETTINGS", // Pretty name of the category where the setting can be found. Can be stringtable entry. true,// data for this setting: true, // "_isGlobal" flag. Set this to true to always have this setting synchronized between all clients in multiplayer { params ["_value"]; VCM_RAGDOLL = _value; } // function that will be executed once on mission start and every time the setting is changed. ] call CBA_Settings_fnc_init; [ "VCM_RAGDOLLCHC", // Internal setting name, should always contain a tag! This will be the global variable which takes the value of the setting. "SLIDER", // setting type "Chance for AI to ragdoll when hit.", // Pretty name shown inside the ingame settings menu. Can be stringtable entry. "VCOM SETTINGS", // Pretty name of the category where the setting can be found. Can be stringtable entry. [0,100,100,0], // data for this setting: true, // "_isGlobal" flag. Set this to true to always have this setting synchronized between all clients in multiplayer { params ["_value"]; VCM_RAGDOLLCHC = _value; } // function that will be executed once on mission start and every time the setting is changed. ] call CBA_Settings_fnc_init; [ "VCM_HEARINGDISTANCE", // Internal setting name, should always contain a tag! This will be the global variable which takes the value of the setting. "SLIDER", // setting type "Distance AI can hear gunfire.", // Pretty name shown inside the ingame settings menu. Can be stringtable entry. "VCOM SETTINGS", // Pretty name of the category where the setting can be found. Can be stringtable entry. [0,10000,1200,0], // data for this setting: true, // "_isGlobal" flag. Set this to true to always have this setting synchronized between all clients in multiplayer { params ["_value"]; VCM_HEARINGDISTANCE = _value; } // function that will be executed once on mission start and every time the setting is changed. ] call CBA_Settings_fnc_init; [ "VCM_WARNDIST", // Internal setting name, should always contain a tag! This will be the global variable which takes the value of the setting. "SLIDER", // setting type "Distance AI will call for reinforcements from.", // Pretty name shown inside the ingame settings menu. Can be stringtable entry. "VCOM SETTINGS", // Pretty name of the category where the setting can be found. Can be stringtable entry. [0,10000,1000,0], // data for this setting: true, // "_isGlobal" flag. Set this to true to always have this setting synchronized between all clients in multiplayer { params ["_value"]; VCM_WARNDIST = _value; } // function that will be executed once on mission start and every time the setting is changed. ] call CBA_Settings_fnc_init; [ "VCM_WARNDELAY", // Internal setting name, should always contain a tag! This will be the global variable which takes the value of the setting. "SLIDER", // setting type "Time (seconds) AI wait before support called.", // Pretty name shown inside the ingame settings menu. Can be stringtable entry. "VCOM SETTINGS", // Pretty name of the category where the setting can be found. Can be stringtable entry. [0,10000,30,0], // data for this setting: true, // "_isGlobal" flag. Set this to true to always have this setting synchronized between all clients in multiplayer { params ["_value"]; VCM_WARNDELAY = _value; } // function that will be executed once on mission start and every time the setting is changed. ] call CBA_Settings_fnc_init; [ "VCM_STATICARMT", // Internal setting name, should always contain a tag! This will be the global variable which takes the value of the setting. "SLIDER", // setting type "Time (seconds) AI stay on unarmed Static Weapons", // Pretty name shown inside the ingame settings menu. Can be stringtable entry. "VCOM SETTINGS", // Pretty name of the category where the setting can be found. Can be stringtable entry. [0,10000,300,0], // data for this setting: true, // "_isGlobal" flag. Set this to true to always have this setting synchronized between all clients in multiplayer { params ["_value"]; VCM_STATICARMT = _value; } // function that will be executed once on mission start and every time the setting is changed. ] call CBA_Settings_fnc_init; [ "VCM_MINECHANCE", // Internal setting name, should always contain a tag! This will be the global variable which takes the value of the setting. "SLIDER", // setting type "Chance for AI to place a mine, once in combat.", // Pretty name shown inside the ingame settings menu. Can be stringtable entry. "VCOM SETTINGS", // Pretty name of the category where the setting can be found. Can be stringtable entry. [0,100,75,0], // data for this setting: true, // "_isGlobal" flag. Set this to true to always have this setting synchronized between all clients in multiplayer { params ["_value"]; VCM_MINECHANCE = _value; } // function that will be executed once on mission start and every time the setting is changed. ] call CBA_Settings_fnc_init; [ "VCM_ARTYDELAY", // Internal setting name, should always contain a tag! This will be the global variable which takes the value of the setting. "SLIDER", // setting type "Delay before artillery requests. SIDE BASED.", // Pretty name shown inside the ingame settings menu. Can be stringtable entry. "VCOM SETTINGS", // Pretty name of the category where the setting can be found. Can be stringtable entry. [0,5000,30,0], // data for this setting: true, // "_isGlobal" flag. Set this to true to always have this setting synchronized between all clients in multiplayer { params ["_value"]; VCM_ARTYDELAY = _value; } // function that will be executed once on mission start and every time the setting is changed. ] call CBA_Settings_fnc_init; [ "VCM_AIMagLimit", // Internal setting name, should always contain a tag! This will be the global variable which takes the value of the setting. "SLIDER", // setting type "Mag count AI begin to look for additional mags.", // Pretty name shown inside the ingame settings menu. Can be stringtable entry. "VCOM SETTINGS", // Pretty name of the category where the setting can be found. Can be stringtable entry. [2,10,5,0], // data for this setting: [min, max, default, number of shown trailing decimals] true, // "_isGlobal" flag. Set this to true to always have this setting synchronized between all clients in multiplayer { params ["_value"]; VCM_AIMagLimit = _value; } // function that will be executed once on mission start and every time the setting is changed. ] call CBA_Settings_fnc_init; [ "VCM_AISNIPERS", // Internal setting name, should always contain a tag! This will be the global variable which takes the value of the setting. "CHECKBOX", // setting type "Special marksman/sniper AI", // Pretty name shown inside the ingame settings menu. Can be stringtable entry. "VCOM SETTINGS", // Pretty name of the category where the setting can be found. Can be stringtable entry. true,// data for this setting: true, // "_isGlobal" flag. Set this to true to always have this setting synchronized between all clients in multiplayer { params ["_value"]; VCM_AISNIPERS = _value; } // function that will be executed once on mission start and every time the setting is changed. ] call CBA_Settings_fnc_init; [ "VCM_AISUPPRESS", // Internal setting name, should always contain a tag! This will be the global variable which takes the value of the setting. "CHECKBOX", // setting type "AI attempt to suppress enemies more, and at a further range.", // Pretty name shown inside the ingame settings menu. Can be stringtable entry. "VCOM SETTINGS", // Pretty name of the category where the setting can be found. Can be stringtable entry. true,// data for this setting: true, // "_isGlobal" flag. Set this to true to always have this setting synchronized between all clients in multiplayer { params ["_value"]; VCM_AISUPPRESS = _value; } // function that will be executed once on mission start and every time the setting is changed. ] call CBA_Settings_fnc_init; [ "VCM_ADVANCEDMOVEMENT", // Internal setting name, should always contain a tag! This will be the global variable which takes the value of the setting. "CHECKBOX", // setting type "AI generate new waypoints to flank.", // Pretty name shown inside the ingame settings menu. Can be stringtable entry. "VCOM SETTINGS", // Pretty name of the category where the setting can be found. Can be stringtable entry. true,// data for this setting: true, // "_isGlobal" flag. Set this to true to always have this setting synchronized between all clients in multiplayer { params ["_value"]; VCM_ADVANCEDMOVEMENT = _value; } // function that will be executed once on mission start and every time the setting is changed. ] call CBA_Settings_fnc_init; [ "Vcm_DrivingActivated", // Internal setting name, should always contain a tag! This will be the global variable which takes the value of the setting. "CHECKBOX", // setting type "Experimental Improvements to AI driving.", // Pretty name shown inside the ingame settings menu. Can be stringtable entry. "VCOM SETTINGS", // Pretty name of the category where the setting can be found. Can be stringtable entry. false,// data for this setting: true, // "_isGlobal" flag. Set this to true to always have this setting synchronized between all clients in multiplayer { params ["_value"]; Vcm_DrivingActivated = _value; } // function that will be executed once on mission start and every time the setting is changed. ] call CBA_Settings_fnc_init; [ "Vcm_PlayerAISkills", // Internal setting name, should always contain a tag! This will be the global variable which takes the value of the setting. "CHECKBOX", // setting type "Player AI recieve unique skill settings", // Pretty name shown inside the ingame settings menu. Can be stringtable entry. "VCOM SETTINGS", // Pretty name of the category where the setting can be found. Can be stringtable entry. true,// data for this setting: true, // "_isGlobal" flag. Set this to true to always have this setting synchronized between all clients in multiplayer { params ["_value"]; Vcm_PlayerAISkills = _value; } // function that will be executed once on mission start and every time the setting is changed. ] call CBA_Settings_fnc_init; }; diag_log "VCOM: Loaded CBA settings"; }; Defaul userconfig settings Vcm_Settings = { /* ADDITIONAL COMMANDS (group this) setVariable ["VCM_NOFLANK",true]; //This command will stop the AI squad from executing advanced movement maneuvers. (group this) setVariable ["VCM_NORESCUE",true]; //This command will stop the AI squad from responding to calls for backup. (group this) setVariable ["VCM_TOUGHSQUAD",true]; //This command will stop the AI squad from calling for backup. (group this) setVariable ["Vcm_Disable",true]; //This command will disable Vcom AI on a group entirely. (group this) setVariable ["VCM_DisableForm",true]; //This command will disable AI group from changing formations. (group this) setVariable ["VCM_Skilldisable",true]; //This command will disable an AI group from being impacted by Vcom AI skill changes. */ Vcm_ActivateAI = true; //Set this to false to disable VcomAI. It can be set to true at any time to re-enable Vcom AI VcmAI_ActiveList = []; //Leave this alone. Vcm_ArtilleryArray = []; //Leave this alone //VCOM ARTILLERY. Only one kind of advanced artillery can be used at a time. VCM_ARTYENABLE = true; //Enable improved artillery handling from Vcom. VCM_ARTYLST = []; //List of all AI inside of artillery pieces, leave this alone. VCM_ARTYDELAY = 30; //Delay between squads requesting artillery VCM_ARTYWT = -(VCM_ARTYDELAY); VCM_ARTYET = -(VCM_ARTYDELAY); VCM_ARTYRT = -(VCM_ARTYDELAY); VCM_ARTYSIDES = [west,east,resistance]; //Sides that will use VCOM/FFE artillery VCM_AIMagLimit = 5; //Number of mags remaining before AI looks for ammo. VCM_Debug = false; //Enable debug mode. VCM_MINECHANCE = 75; //Chance to lay a mine VCM_SIDEENABLED = [west,east,resistance]; //Sides that will activate Vcom AI VCM_RAGDOLL = true; //Should AI ragdoll when hit VCM_RAGDOLLCHC = 100; //CHANCE AI RAGDOLL VCM_FullSpeed = true; //Enforce full speedmode during combat (Does not reset after combat end) VCM_HEARINGDISTANCE = 1200; //Distance AI hear unsuppressed gunshots. VCM_WARNDIST = 1000; //How far AI can request help from other groups. VCM_WARNDELAY = 30; //How long the AI have to survive before they can call in for support. This activates once the AI enter combat. VCM_STATICARMT = 300; //How long AI stay on static weapons when initially arming them. This is just for AI WITHOUT static bags. They will stay for this duration when NO ENEMIES ARE SEEN, or their group gets FAR away. VCM_StealVeh = true; //Will the AI steal vehicles. VCM_ClassSteal = true; //If true, crewmen are required to steal tracked vehicles. Pilots are required to steal aircraft. false = anyone can steal any vehicle. VCM_AIDISTANCEVEHPATH = 100; //Distance AI check from the squad leader to steal vehicles VCM_ADVANCEDMOVEMENT = true; //True means AI will actively generate waypoints if no other waypoints are generated for the AI group (2 or more). False disables this advanced movements. VCM_FRMCHANGE = true; //AI GROUPS WILL CHANGE FORMATIONS TO THEIR BEST GUESS. VCM_SKILLCHANGE = true; //AI Groups will have their skills changed by Vcom. VCM_USECBASETTINGS = true;//If CBA is enabled on the host, use the CBA default settings. If false, use the filepatching settings instead. VCM_CARGOCHNG = true; //If true, Vcom will handle disembarking/re-embarking orders instead of vanilla. This is with the intention to prevent the endless embark/disembark loops AI are given. VCM_TURRETUNLOAD = true;//If true, AI will automatically disembark turret positions in vehicles, if the vehicle is badly damaged. This is to prevent AI leaving a tank, when the tracks are damaged. VCM_DISEMBARKRANGE = 200; //How far AI will disembark from their enemies. If the vehicle is damaged, they will disembark. VCM_AISNIPERS = true; //Special sniper AI VCM_AISUPPRESS = true; //AI will attack from further away with primary weapons to suppress enemies Vcm_DrivingActivated = false; //AI will use experimental driving improvements. Vcm_PlayerAISkills = true; //AI in a group, that a players leads, can have their skills changed separately. //AI SKILL SETTINGS HERE!!!!!!!!!!!! //LOW DIFFICULTY //VCM_AIDIFA = [['aimingAccuracy',0.15],['aimingShake',0.1],['aimingSpeed',0.25],['commanding',1],['courage',1],['endurance',1],['general',0.5],['reloadSpeed',1],['spotDistance',0.8],['spotTime',0.8]]; //MEDIUM DIFFICULTY VCM_AIDIFA = [['aimingAccuracy',0.25],['aimingShake',0.15],['aimingSpeed',0.35],['commanding',0.85],['courage',0.5],['general',1],['reloadSpeed',1],['spotDistance',0.85],['spotTime',0.85]]; //HIGH DIFFICULTY //VCM_AIDIFA = [['aimingAccuracy',0.35],['aimingShake',0.4],['aimingSpeed',0.45],['commanding',1],['courage',1],['endurance',1],['general',0.5],['reloadSpeed',1],['spotDistance',0.8],['spotTime',0.8]]; //SIDE SPECIFIC VCM_AIDIFWEST = [['aimingAccuracy',0.25],['aimingShake',0.15],['aimingSpeed',0.35],['commanding',0.85],['courage',0.5],['general',1],['reloadSpeed',1],['spotDistance',0.85],['spotTime',0.85]]; VCM_AIDIFEAST = [['aimingAccuracy',0.25],['aimingShake',0.15],['aimingSpeed',0.35],['commanding',0.85],['courage',0.5],['general',1],['reloadSpeed',1],['spotDistance',0.85],['spotTime',0.85]]; VCM_AIDIFRESISTANCE = [['aimingAccuracy',0.25],['aimingShake',0.15],['aimingSpeed',0.35],['commanding',0.85],['courage',0.5],['general',1],['reloadSpeed',1],['spotDistance',0.85],['spotTime',0.85]]; //PLAYER SQUAD SPECIFIC VCM_PSQUADW= [['aimingAccuracy',0.25],['aimingShake',0.15],['aimingSpeed',0.35],['commanding',0.85],['courage',0.5],['general',1],['reloadSpeed',1],['spotDistance',0.85],['spotTime',0.85]]; VCM_PSQUADE= [['aimingAccuracy',0.25],['aimingShake',0.15],['aimingSpeed',0.35],['commanding',0.85],['courage',0.5],['general',1],['reloadSpeed',1],['spotDistance',0.85],['spotTime',0.85]]; VCM_PSQUADR= [['aimingAccuracy',0.25],['aimingShake',0.15],['aimingSpeed',0.35],['commanding',0.85],['courage',0.5],['general',1],['reloadSpeed',1],['spotDistance',0.85],['spotTime',0.85]]; VCM_AISIDESPEC = { private _Side = (side (group _this)); switch (_Side) do { case west: { { _this setSkill _x; } forEach VCM_AIDIFWEST; }; case east: { { _this setSkill _x; } forEach VCM_AIDIFEAST; }; case resistance: { { _this setSkill _x; } forEach VCM_AIDIFRESISTANCE; }; }; }; VCM_CLASSNAMESPECIFIC = false; //Do you want the AI to have classname specific skill settings? VCM_SIDESPECIFICSKILL = false; //Do you want the AI to have side specific skill settings? This overrides classname specific skills. VCM_SKILL_CLASSNAMES = []; //Here you can assign certain unit classnames to specific skill levels. This will override the AI skill level above. /* EXAMPLE FOR VCM_SKILL_CLASSNAMES VCM_SKILL_CLASSNAMES = [["Classname1",[aimingaccuracy,aimingshake,spotdistance,spottime,courage,commanding,aimingspeed,general,endurance,reloadspeed]],["Classname2",[aimingaccuracy,aimingshake,spotdistance,spottime,courage,commanding,aimingspeed,general,endurance,reloadspeed]]]; VCM_SKILL_CLASSNAMES = [ ["B_GEN_Soldier_F",[0.01,0.02,0.03,0.04,0.05,0.06,0.07,0.08,0.09,0.1]], ["B_G_Soldier_AR_F",[0.01,0.02,0.03,0.04,0.05,0.06,0.07,0.08,0.09,0.1]] ]; */ VCM_AIDIFSET = { { private _unit = _x; _unit setSkill 0.9; _unit allowFleeing 0; { _unit setSkill _x; } forEach VCM_AIDIFA; if (VCM_CLASSNAMESPECIFIC && {count VCM_SKILL_CLASSNAMES > 0}) then { { if (typeOf _unit isEqualTo (_x select 0)) exitWith { _ClassnameSet = true; _unit setSkill ["aimingAccuracy",((_x select 1) select 0)];_unit setSkill ["aimingShake",((_x select 1) select 1)];_unit setSkill ["spotDistance",((_x select 1) select 2)];_unit setSkill ["spotTime",((_x select 1) select 3)];_unit setSkill ["courage",((_x select 1) select 4)];_unit setSkill ["commanding",((_x select 1) select 5)]; _unit setSkill ["aimingSpeed",((_x select 1) select 6)];_unit setSkill ["general",((_x select 1) select 7)];_unit setSkill ["endurance",((_x select 1) select 8)];_unit setSkill ["reloadSpeed",((_x select 1) select 9)]; }; } foreach VCM_SKILL_CLASSNAMES; }; if (VCM_SIDESPECIFICSKILL) then { _unit call VCM_AISIDESPEC; }; } forEach (units _this); }; diag_log "VCOM: Loaded Default Settings"; if (VCM_USECBASETTINGS) then { [] call VCM_fnc_CBASettings; }; };
  18. I can take a look at this sometime next week - a busy week for me unfortunately currently they go idle at where they were called IF they have 8 waypoints already, they will switch to combat mode and will not generate/switch to new waypoints - as long as another script does not interfere. Vcom kicks in as soon as the squad is in combat mode - so while they won't generate new waypoints, they may still seek cover in buildings/deploy static/place mines, and etc. looks like some kind of CBA error with the vcom settings. I would double check the installation, I have not encountered this yet
  19. Could you post your groups framework?
  20. genesis92x

    Need help with VCOM AI

    Feel free to make a post in the Vcom thread! Although more information is needed. How does it conflict? What is the 'error' behavior? What is the expected behavior?
  21. Looking at it today, there is an error with the GEN_ChangeVoices function, replace GEN_ChangeVoices with this GEN_ChangeVoices = { params ["_passedparam","_Style"]; _passedparam params ["_control"]; if (_Style isEqualTo "Russian") then { s01 setspeaker "male01rus"; s02 setspeaker "male02rus"; s03 setspeaker "male03rus"; } else { s01 setspeaker "male01gre"; s02 setspeaker "male02gre"; s03 setspeaker "male03gre"; }; _display = ctrlParent _control; _display closedisplay 2; }; I believe that should work. Currently _control is returning [_control], it needs to just be _control.
  22. genesis92x

    GUI behavior (Dialog)

    Does this happen with any dialog? I might have to try creating one once I get home and see the effect you described occurs...that's a strange thing
  23. Here's an example that I just created, so it might not be perfect This could go at the end of your init.sqf, for example. [] spawn { waituntil {time > 1}; private _display = findDisplay 46 createDisplay "RscDisplayEmpty"; GEN_ChangeVoices = { params ["_control","_Style"]; if (_Style isEqualTo "Russian") then { Bobby1 setspeaker "SomethingRussianHere1"; Bobby2 setspeaker "SomethingRussianHere2"; Bobby3 setspeaker "SomethingRussianHere3"; } else { Bobby1 setspeaker "SomethingHere1"; Bobby2 setspeaker "SomethingHere2"; Bobby3 setspeaker "SomethingHere3"; }; _display = ctrlParent _control; _display closedisplay 2; }; private _ButtonLeft = _display ctrlCreate ["RscButton", 7803]; _ButtonLeft ctrlSetPosition [(0.2 * safezoneW + safezoneX),(0.5 * safezoneH + safezoneY),(0.05 * safezoneW),(0.025* safezoneH)]; _ButtonLeft ctrlSetBackgroundColor [1,1,1,1]; _ButtonLeft ctrlCommit 0; _ButtonLeft ctrlSetText "Russian Voices"; _ButtonLeft ctrlAddEventHandler ["ButtonClick","[_this,'Russian'] call GEN_ChangeVoices"]; private _ButtonRight = _display ctrlCreate ["RscButton", 7803]; _ButtonRight ctrlSetPosition [(0.4 * safezoneW + safezoneX),(0.5 * safezoneH + safezoneY),(0.05 * safezoneW),(0.025* safezoneH)]; _ButtonRight ctrlSetBackgroundColor [1,1,1,1]; _ButtonRight ctrlCommit 0; _ButtonRight ctrlSetText "American Voices"; _ButtonRight ctrlAddEventHandler ["ButtonClick","[_this,'American'] call GEN_ChangeVoices"]; }; EDIT: Fixed an obvious bug
  24. I'd like to think that in the init.sqf, you could try using this setspeaker with a simple dialog created by ctrlCreate with two buttons that the player can choose from?
  25. Nice work! I love seeing more love put into the pylon system
×