Vuu combat system for Nexus

RocketCatRocketCat Posts: 61Member ✭✭

Hi everyone! This thread marks the release of my PvP system for Nexus. The system is free and works for all classes. This is the third rewrite of a combat system I’ve done for Starmourn, so I’ve taken the lessons learned and tried my best to implement them here. You can use Vuu as a starting point for the development of your own personalized system with more advanced tricks, or you can just use Vuu as it is. Vuu has everything someone with no PvP experience needs to get started. Experienced PvPers can use this to hop on an alt and start playing around with the other classes and maybe learn a thing!


- Automation, should you choose to accept it: Vuu offers command automation to send commands automatically. By default there are 5 varieties of such commands, which may be moved around in priority in any order: Keepup, Queue, Offense, Heal, and Mend. Each is discussed separately below. For most classes, if Vuu does not find a command from one of these subroutines, it will send a default command (the spammable combat skill for the offensive strategy you’re using).

-NB: You can use Vuu without automation and it will still keep track of everything for you, or you can select which subroutines out of the above you want to automate and keep the remainder manual. Several setting profiles (below) allow you to control whether Vuu is ‘automated’, ‘assisted’, or ‘manual’, and otherwise you can tweak the settings to your liking.

- Defups and keepups: Define a list of defs that you want to have up from the moment you login or after you die and Vuu will set them up for you. You can also define a separate list of keepup defs which Vuu will reapply if they are lost for any reason in the flow of combat. (Note that due to the present limitations of GMCP Char.Defences.List this is a bit janky).

- Heal: Simple enough, define a threshold to use your class heal if you have heal balance.

- Mend: Define a set of mending priorities and Vuu will try to mend systems if they’re damaged and below a defined threshold and above a defined efficacy. In case the efficacy of the #1 priority system is getting low it can also perform a lookahead to the second priority to see if it should be mended instead (for matchups where you need to defend two systems).

- Offense: Each class comes with one implemented class offense logic. They are not particularly advanced or self-aware but they’re enough to start killing your friends. When you’re ready, you can start defining your own offense logics and Vuu lets you switch between offense logics on the fly.

- Queue: In certain situations you will want to load an array of commands which you want to send in order, particularly starter and finisher combos for some classes but also some mid-fight ones. You can either load things up to the queue via aliases or load up pre-defined combos.

- Balance methods: Vuu can send commands on balance recovery or to the queue on balance use. Sending to the queue is recommended as a general practice since it will save you ping, but there are situations where you can’t use the queue (command separators do not work). Therefore, you can switch balance methods manually or tie balance method swapping automatically to different aliases. You can also just send commands on balance recovery if that’s your style. You can still issue manual commands off-balance to be sent on-balance.

- Recalcs: If you are sending commands to the queue, you can automatically send a new command if you receive new information. You can use a set of built-in ‘recalc events’ or define your own to trigger Vuu to rethink its previous decision. For instance, you’ve already sent Crackshot to the queue but Rapidfire comes off cooldown, a recalc event will tell Vuu to recalculate the command to send with this new information.

- Command validation: Every command you send (as long as Vuu knows the command) will be validated through GMCP Combat Messages or Triggers to ensure that it succeeds. If it fails for any reason, Vuu will resend it. This is generally very helpful, but can create situations where Vuu is trying to execute a command which you simply cannot for some reason, leading to a loop. Vuu should detect such a loop. If the alias is tied to a cooldown, Vuu will manually put it off cooldown to try to fix the issue. If that doesn’t work, the command will be blocked. If it tries to send it again, Vuu will just throw an error and stop. With a bit of tinkering, you can fix this up for the next fight. At least you won’t have to restart your browser.

- Focing commands and reacting: A manual command you send beginning in ‘/’ will override all automation until it succeeds. Vuu also includes a reaction logic which allows Vuu to react to triggers or GMCP Combat Messages which originate from your target, for instance if you want to automatically interrupt a channeled ability. If you choose, automatic reactions can be set to override manual commands.

- State tracking: Vuu listens to GMCP and triggers and processes incoming data for later use (without manipulating the GMCP objects which are used by the client). Vuu has objects and variables for just about everything you might need. All of this is tied to an event router system which allows you to define your own scripts when certain events occurr (more on this later).

- Props and cover: Vuu does not contain a fully coded prop logic, as these are quite convoluted to code and are highly class and matchup sensitive. What it does contain rather are the beginnings of a prop logic designed at the very least to assist you in dealing with an opponent using props. When your opponent takes cover, Vuu will try to load that prop’s id into a variable which you can use later, either by covering behind it yourself (“/cv”) or by attacking the prop somehow with a manual alias (you’ll have to set it up). There are limitations to this, however. It has no way of knowing which prop an opponent is using if there are multiple props in the room of the same name. It will load one such prop in the prop target variable, but it may be wrong. Vuu does not know which props are coverable and which are not, so it cannot determine which prop you should use. Vuu also doesn’t know anything about climbing, but then neither do most combatants and anyway climbable props are rare.

- The class router: Vuu comes packaged as two groups. The first group contains all the core functions, triggers, and aliases which are class-independent. Throughout this core system, Vuu will call a class-based event router which asks whether there is any class-specific logic to execute before continuing. The class router is therefore the way to interact with the core of Vuu without changing the core Vuu (which you’re nevertheless free to do, just if updates come to the core functions it’ll be annoying).

- Command-specific callbacks: Command aliases can have callback functions tied to them which fire before an alias is sent, after it’s sent, or after the command succeeds. Vuu will execute these functions accordingly. This keeps your code organized and lets you do some neat things in cases where you want to send a command or update a variable before you send a command, after you send it, or after it succeeds!

- Extra small bits of functionality, should you desire: Vuu will stand before it sends a command if you are knocked prone. Vuu will automatically pull your opponent from the skies if necessary. If Vuu is going (via VGO), Vuu will automatically attack your target if they enter the room or if you enter their room. Anti-invisibility functionality will spam attacks on room change if it’s an invisibility matchup. Crashing will resend if you are somehow interrupted, and redundant crash commands will not be sent (ONLY if Vuu is going, and only so long as you use the ‘/C<dir>’ alias. Using the normal ‘CRASH <dir>’ commands while Vuu is going will cause issues.)

- Setting profiles: All of the settings (see vs.settings in the code for a more complete list) can be defined in profiles which you can swap between (preferably before a fight, swapping settings profiles mid-fight might cause issues depending on the particular settings being changed).

- Small tweaks to Nexus: 1) The prompt will show up in logs. You can still use the native settings “Only show the last status/prompt line received” or “Do not show any prompt lines at all” and the prompt will still show at its normal intervals. Vuu also has a prompt with conditional coloring and more options built-in, read more below. 2) The tooltips which show up when you hover over the bottom buttons and bars have been removed.

Installation and setup

Download the package located here and load it into Nexus. If you’re using the Condition Prompt (see below), load oj.nxs first (link below) and type ‘onLoad’ or restart your client. Now load up Vuu and type ‘onLoad’ again or restart your client. The first time you run Vuu, you will need to tell Vuu who you are with VME <fullname>, making sure to include your Dynasty surname if you have one and use capitalization just in case. Vuu will turn CONFIG USEQUEUEING ON. The first time you run Vuu, it will CONFIG SHOWBALANCE ON. Vuu needs the balance use message. If you don’t like it, gag it. If you don’t intend to use queueing, change the value of vs.settings.defaultBalMethod. Other than that, there might be some class-specific stuff for you to take care of, see below. You should mostly be able to have Vuu on and use all your existing packages without Vuu interfering, Vuu should never send commands unless you VGO or you send a manual ‘/’ command. If you intend on using Vuu’s automation, take care that other packages (especially ones that do stuff on balance use/recovery) aren’t getting in the way while resolving issues.

Using Vuu

Use VGO to start (or VGOO if you’re a pk god) and VSTOP to stop. Everything else is just spice. Generally speaking, Vuu is not very front-facing (it’d be triple the work for me to make it so). If you want to customize Vuu to your needs, you’ll have to venture into the Javascript. I’ve done my best to comment the code to explain what’s going on.

VS: Start up Vuu. This command is sent when you load the game. You can send it again and it will reset Vuu to how it was at the start of the session, or after you make changes.

- NB: Using this will reset everything including cooldown information, so Vuu might try to send abilities which are still on cooldown! Don’t use VS mid-fight.

VGO: Start hitting them. Bind this.

VSTOP: Stop. Bind this.

VCONT: Manually validate the current command Vuu is trying to send to allow Vuu to do something else. There might be a game effect which Vuu is unaware of preventing you from doing something. In the early days of Vuu you’ll probably need to use this a lot, so bind it.

VOF <strat>: Switch between offense logics.

VSET <profile>: Tell Vuu which setting profile to use. Vuu comes with some pre-baked profiles. The vsBeast, vsNano, vsFury, vsEngi, vsScoundrel, and vsAll profiles tweak ww priorities, thresholds for health and mending, some other things like maybe defups (like Intercept for Nanoseer), and whether or not to use anti-invisibility spam. The profiles ‘automated’, ‘assisted’, and ‘manual’ control the amount of automation to use with Vuu. If you want to define your own profiles, do so in vuu.settingProfiles

VDEF: Def up according to your currently active defup profile. Use VSET to modify defupMode (and keepupMode).

‘/’: Everything which sends a command to the game should begin with ‘/’. With Vuu you do not make aliases the normal way. Instead, it will try to find the alias as a key of the object vuu.abs which contains all the structured information Vuu needs to know to run that command for you. If the alias does not exist in vuu.abs, you’ll just get an error. You can send normal aliases without ‘/’ but a) they will not be validated, b) they may be overwritten if you are using recalc, and c) if your balMethod is ‘recovered’ you just won’t be able to send it. Take a look through the vs.abs and vs.<class>abs functions to see which abilities have been defined so far in Vuu.

VERBOSE <all|strict|gag|off>: Vuu has debugging notices peppered throughout, VERBOSE ALL will show them all. STRICT lets you only look at debug info from certain parts of code (defined in vuu.settings.strictVerbose), while GAG will disable certain parts (defined in vuu.settings.gagVerbose).

VPU: Manually toggles pursuit mode.

VQ <cmd>: Adds a command (must be in vs.abs) to the front of the ability queue. Not the game’s queue but Vuu’s queue, as discussed above. Useful in situations where you want to send a command AFTER the currently queued command. Also useful if you’ve used VSTOP (maybe for a regen or Pax), and you want to give Vuu a command to execute when you VGO again!

VQL <cmd>: Like VQ but adds it to the end of the ability queue instead of the front.

VCO <combo>: Like VQ but adds the combo (as defined in vs.combos) to the queue.

VHELP: Doesn’t exist. Use this thread.




  • RocketCatRocketCat Posts: 61Member ✭✭

    ... continued...

    Conditional prompt

    Vuu has a pre-built prompt with conditional display and coloring. It’ll give you some bonus information not accessible via the normal prompt, and allow things such as only displaying subsys health if it’s below a threshold. To use the prompt, you’ll first have to install the package Orange Juice (shout out to Iniar for making this package). Then you’ll want to “CONFIG PROMPT NORMAL This is my prompt”.

    Prompt settings:

    promptUseConditions: if this is false you will not get conditional colouring.

    promptShowHealBal: shows your heal balance together with your normal and ww balance.

    promptShowCombat: whether you’re in combat or not.

    promptShowOnlyDamaged: only shows a subsystem’s health if it’s below 90. (Enabled by default)

    promptShowEfficacy: shows the efficacy of a system along with its health. (Disabled by default)

    promptShowGoing: displays a ‘G’ if Vuu is going and ‘S’ if it’s stopped.

    promptShowAffs: displays whether you have some of the more annoying affs inside {}. Prone, Blind, Crippled Movement, and Encroachment. You can add more or less…

    promptShowPursuit: displays ‘PU’ if Vuu is in pursuit mode.

    promptShowCmd: displays the last command sent to Vuu.

    PromptShowNextLevel: % to next level.

    Class info: All classes get their class resources as normal. Engineers get Airdrop bal if they use promptShowAirdropBal. Nanos get a conditional colored first letter of their currently channeled empyreal (including a second empyreal joined with a ‘+’ if they have access to another via Affinity). Furies get conditional coloring of their stance with “(U)” next to it if they’re Unstoppable. Scoundrels get three more settings: promptShowAmmo, promptShowAmmoEffect, and promptShowIED. They basically do as the settings describe, all with conditional coloring, yay!

    The prompt isn’t really optimized for performance but I haven’t encountered performance issues with it yet even in Cosmpiercer group fights. If you want to change anything about the prompt such as the formatting or coloring scheme you will have to venture into the code.

    Class-specific info

    The default offensive strategies as well as the defense profiles used in Vuu are gated behind lesson requirements, and no effort was made to ensure that you actually have the abilities. Sorry, just another thing which would have tripled the work (it’s really annoying to check what abilities you have via GMCP). If you don’t have certain abilities, you’ll have to comment out the relevant sections of code or switch them around to other abilities. Read on for more info. These strategies were chosen because they are in my opinion the best meta strategies for each class. That said, I’m by no means an expert of all the classes and I’ve probably gotten some things wrong, and for sure the logics are not implemented in a way that would satisfy a min-maxer. But they’re enough to get you started on the right foot. Obviously, as the meta shifts these strategies may no longer be competitive. I will generally not tweak these pre-baked offense logics in future updates unless something actually breaks them.

    B.E.A.S.T.: You’ll want an active Shield, Netlauncher, and Railgun. The default offense logic goes like this: Dualshot on cooldown (with overlock if that's up), airshot if we’ve completed a full rotation of armvice/legclamp and it’s off cooldown, else armvice/legclamp right/left. The idea is to lay into their muscular while getting as many of the balance-increasing affs on your opponent, so ideally they’ll have a 20% balance increase with extra hindrance from airshot and staggering. Once their muscular is prepped (SUIT EXAMINE), use VOF SUNDER to swap to your minigun and start prepping their internal with SPOOLUP, with Dualshots when they’re ready to apply Broken Ribs (increasing your internal damage further). Unfortunately, Sunder is a trans ability. So is the very incredibly useful Dualshot. If you don’t have DUALSHOT, change the offensive script to use RAILSHOT instead. You’ll be using SUIT SWAP MINIGUN, so head into vs.beastSettings and change the id of your minigun to the one you want to use. You will probably want to pepper in WALLOP, SMASH, TETHER, FIREWALL, and PLASMA CIRCLE. Note that excessive restarting of Vuu will create unpleasant cooldown management with Overclock being such a huge cooldown.

    Lesson requirements coded in by default:

    MWP: Dualshot (1750 lessons) is coded in. You can switch this to Railshot (302 lessons) instead.

    Plasma: Not coded in at all, but Firewall and Plasmacircle are very useful, as is Sear for when you need to interrupt but have activated your minigun.

    Suittech: Sunder (1750 lessons), you’re really gonna want this.

    Nanoseer: The default offensive strategy for Nanoseer is Mindmelt/Breakdown (mind/wetwiring route): Mindswap on cd, minddrain if they have x mind affs (x=5 by default), else confound. When you think you’re getting close, use ANALYZE liberally. Vuu will automatically MINDMELT or BREAKDOWN if Analyze says you can, otherwise do so manually. If you don’t have these abilities, you’ll have to comment out the relevant code. Vuu will perform a startup combo as well: ENVELOP, DELAY CONFOUND, CONFOUND, MINDSWAP. Vuu is Empyreal-aware and knows about Oblivion Affinity, but is not Sanity-aware. While Vuu is going, if you use a ‘/’ alias for an Oblivion skill of an Empyreal you currently do not have access to, it will swap to that Empyreal if swap is off cooldown. If swap is on cooldown, it will channel instead. You can prevent channeling mid-fight with the setting vs.settings.noChanneling, in which case Vuu will simply not let you send the command.

    Lesson requirements coded in by default:

    Nanotech: You’ll absolutely want Mindswap (1162 lessons), you won’t do much Mind damage without it. Delay (1559 lessons) will give you a slight edge but is only coded into the startup and Pax combos.

    Void: Minddrain (231 lessons) will really up your mind damage in the mid-late stages of the match, and is coded in. Pax (1465 lessons) is a godsend but you don’t strictly need it and it’s not hardcoded in.

    Oblivion: You’ll want Mindmelt (487 lessons) and Breakdown (869 lessons), which are coded into Analyze results. Affinity (973 lessons) is also coded in as a defup. You can remove it as a defup if you don’t have it, but it’s a great ability!

    Engineer: The default offense strategy for Engineer is Squash (muscular route): AIRDROP and QPCBOOST if necessary, else JUNKJET. When you’ve loaded them with shards, manually send Magnetize and/or Magnotron. Keep tabs on them with HUD, the best ability in the game. Squash them if they’re ready. You’ll want a Shardflinger with your favorite mod. Vuu will simply QPCBOOST when your turret runs out of energy. You’ll eventually want Vuu to know how much energy your turret is spending and to preemptively QPCBOOST before the turret runs out. You’ll also want a shard counter. Vuu won't check if you have the appropriate gadgets constructed, so make sure you have all your gadgets!

    Lesson requirements coded in by default:

    Turrets: Turrets are not strictly coded into Vuu, so you can use whatever turret you want. But you’ll want Shardflinger to synergize with the default strategy (689 lessons), along with your favorite mod (I’m fond of Multibarrel at 1173 lessons with a QPC turret nearby).

    Bots: Airdrop (186 lessons).

    Gadgets: You really need Magnetize (1191 lessons), but in a pinch just Magnotron might do (669 lesons), but you’ll also need Squash (982 lessons).

    Scoundrel: The default offensive strategy for Scoundrel is Forcefeed (internal route): Fling when no bullets, EJECTing for another fling if Eject is ready, Rapidfire on cooldown, else Crackshot ‘em. Once your SCAN reveals their internal is prepped, send the finisher combo (TRIP > BIND > FORCEFEED). Vuu will start you off with weakening ammo and Shrapnel Piercer IEDs. If you don’t have these, you’ll have to edit the code. The nice thing about Scoundrel is that you can do a lot without deviating from the Rapidfire > Crackshot > Fling logic just by swapping between ammos and IEDs. Vuu has ammo and IED type swapping coded in, so have fun swapping around! See the function vs.scoundrelAbs for more information.

    Lesson requirements coded in by default:

    Gunslinging: Eject (1067 lessons) is coded in. You’ll want Weakening ammo (833 lessons).

    Guile: You’ll need BIND (301 lessons) to Forcefeed.

    Improvisation: You’ll want SHRAPNEL (1207 lessons), but you can code it out. Other than that you’ll need Forcefeed (528 lessons).

    Fury: The default offensive strategy for Fury is Heartrend. Vuu will start off hitting their muscular, rotating between Ember and Blaze with Blade Swiftcut, Assail, and Barrage and Rage Rend, Resistant, and Upperlash. Once they have crippled movement, switch to int with VOF INT. Now Vuu will hit their internal, rotating between Eruption and Flare with Blade Gutrend, Wound, and Hypertension and Rage Berserk, Flyinglash, or Deepstrike. Vuu will trigger Unstoppable and use Rage Overwhelm instead of other Rage. When their internal is prepped, use ‘HR’ and Vuu will go to Heartrend via airleap. You’ll want flameshape or lightningshape. If you send manual commands which send you out of the stances of the main strategy, Vuu will find a path to the main stances of the selected strategy. This could use more optimization, and doesn’t know about POSITION. To properly use server queueing, Vuu uses a stance lookahead system, which knows what stance to look forward to after each blade attack is validated. Also there is a Rage lookahead override for commands like Airleap. That said, there might still be some issues with this.

    Lesson requirements coded in by default:

    Battleflow: Heartrend (1750 lesson), not really coded in, since you’ll have to manually send the ‘HR’ alias, but you’ll really want it. Other than that Rend (1018lessons) is coded in but only if you get to Inferno stance, which really won’t happen much. The main blade attacks are lower in lesson requirements.

    Rage: Overwhelm (820 lesson), you really want it. Everything else is below 400 I believe.

    Fulmination: Glimmer (899 lessons), which seems to be the only anti-flight Fury has.

    That about sums it up. More specific information can be found in the code itself.

    Bugs and feedback

    PvP has a lot of variables and different game effects may prevent Vuu from working properly. Accounting for everything is part of the process of building up a pvp system. Let me know if you have feedback or encounter bugs. If you do encounter a bug, I’d appreciate it if you try to replicate it if possible and log it with the ‘verbose’ setting set to ‘all’. It’d also help if you tried disabling other packages which might be interfering. Hit me up here or on Discord.

    Note that the most testing I’ve done is for Vuu’s default settings: Usequeueing enabled, full automation, sending commands on balance use. The other options are provided to give you flexibility but they have not received as much testing.

    Future development efforts will be focused on the class-independent aspects of Vuu contained in the “Core” group of Functions, with the idea that most user coding will take place in the “Class” group of Functions.

    If you’re enjoying Vuu and wish to support its development you can send donations to Ata in game.

    Now go kill your friends.

  • MatlkaelMatlkael Posts: 293Member ✭✭✭
    edited May 10

    itsa Mereas!
  • RocketCatRocketCat Posts: 61Member ✭✭
    Matlkael said:

    The studies are in. It still takes 10 years.
  • MatlkaelMatlkael Posts: 293Member ✭✭✭
    yes but now I can relax and eat a hinka while the system does all that busywork!
    itsa Mereas!
  • RocketCatRocketCat Posts: 61Member ✭✭
    edited May 15
    Reserving another post awkwardly here

    Known issues:
    - Efficacy regeneration does not update in the system
    - Affinity Empyreal does not update properly, and in any case I need to change Affinity to include multiple Empyreals. I did not realize that Affinity could stack multiple times.
    - Forcefeed does not send properly when it is loaded from the FF combo. It still works when you manually send '/GFF'.
    - GMCP Players.Remove throws an error message and does not remove the player from vs.playersHere.
    - Currently no way to IED Fling anything other than shrapnel modded ieds.

    I'll be fixing these issues and adding some more functionality this week.
Sign In or Register to comment.