Page 1 of 1

ULFE

Posted: Mon Mar 31, 2025 5:44 pm
by Telan
This is the FE I've been working on for some time:
https://1drv.ms/u/c/048e5dff03fb69cd/EU ... A?e=gSWeWk

The link location is subject to periodic updates, so I'll update the location on the forums along with notes of the new functionality or issues fixed. The program only works with Windows, though it's possible you might be able to get it to work on other platforms if you are adventurous (it uses the .Net runtime so the Mono project might make it runnable on other platforms).

ULFE
Below is an intro to the program, since it has some neat-o features. I'd like to keep this thread light on commentary, and mostly focused on updates. If you have ideas, suggestions, kudos, or things you want fixed that's great! I love feedback, feel free to add some to this forum post: viewtopic.php?t=11

The program should have all the amenities of your normal connection tools, with some things customized to make your experience with UL nicer.

When you first log in you should get a prompt to fill in Account information as well as port selection. Hitting cancel will exit the program. Once you've done that, you'll need to add your characters to the Edit -> Profiles menu. Once you have your characters in place, you should be all set to connect to that profile through the file menu.

UL Parser Bug fixes
Some of the behaviors of UL are kind of annoying, so I did what I could to keep myself from stepping in them.
If you type "wh" I autocomplete it to "who" this is only done with "wh" is the only thing being sent.
I fixed say to client side. Now if you "say to george I don't know what you're talking about!" George will miss out on seeing 'Telan says to you, "T know what you're talking about!"' and will instead see the correct text. If the connector sees the first to words in the text being sent are "say to" and the fourth word doesn't have a ' in front of it, I automatically insert one for you. Similarly if you have "<adverb ending in ly> say to george <stuff>" the connector will ensure you have a ' before <stuff>.

Macros
This menu item you've probably seen in other FEs, but mine is a little different, you simply make the keystroke you want macro'd, and it will record it, putting a text representation into the text box rather than having a big map of Control + H, Control + Y, Control + S, etc, etc. Can handle any single key press from the keyboard, while also including the state of Shift, Control, and Alt.

Highlighting
Standard highlighting capabilities, but also options to highlight the whole line and/or use Regular Expressions to find the text you want to highlight (See: https://docs.microsoft.com/en-us/dotnet ... -reference)

Variables
The FE has variables, which can be referenced with @VariableName, and set / displayed using commands. See the command section for more information about setting up variables.

Chat Window
I made a chat window, where all things chat/gamehelp/staff tells/replies do. You can turn it on/off at any time and the appropriate text will be ripped out of the main window, or neatly re-integrated. The size of this window can be changed and will be the same next time you open the client for that character.

Goto menu
I've organized some information from Jurion's maps (Thanks Jurion!) into a Goto menu, sorted by city (currently only Kaezar, Kemstead, and Never), with sub-classifications that seemed to make sense. You can also go into the Custom menu and add your own, either adding your current location or by Editing the list and manually typing in new locations. You may also give custom goto location a label to be used in the Custom Gotos menu.

Gauges
RT, Stun, UT, PT, Heal time, vitality, stamina, essence, willpower all integrated for a quick glance to see how things are going. Wound indicator shows the number of wounds and a color to show how well off you are (green for no wounds, yellow for when you have only 1-2 wounds on any particular limb, orange for >= 3 wounds on at least one limb, and red for a maim / mutilation. Bleeding follows a similar paradigm, showing the number of bleeding limbs and color indicates worst limb bleed; green is no bleeding, yellow is slight or light bleeding, orange for moderate bleeding, red-orange for severe bleeding and red for profuse bleeding. Experience gauge shows a bar representing % to next level and displays the approximate amount of time remaining to get to that level.

You can also control the ordering of the gauges using the dialog invoked from the Edit->Controls menu item. A 'Break' item indicates a point where the controls will wrap to another row if the contents can't fit onto the same line.

Echo Text Color
You can now edit the foreground text color for text you sent to the server. Makes for easy scanning to see what you've typed recently.

Text Commands
Before I go into commands, make sure you've read the In Game policy against scripting. This isn't meant to be something you use to do things while you're away, but instead to make things a little easier.

There are two kinds of commands, standalone commands and commands that take arguments, commands that stand alone can be executed with $commandname, those with arguments can be executed either at the end of text input $commandname argument or in the middle of text input as $commandname argument$. The second $ lets the system know that the argument has finished. For the purposes of these examples, I've set ; to be my multi-line macro.

It's worth noting that commands can have only a single instance running, so if you try to run a command while it's already running, the original version of the command will be forgotten. E.g. "$waitfor X$;yell 'I found it!" followed by "$waitfor Y$;yell 'I didn't find it!" the second $waitfor command will mean you're no longer waiting for X, and the text "yell 'I found it!" was lost. However commands will stack, even if using the same command. E.g. "$waitfor X$;yell 'I found it!;$waitfor Y$;yell 'I didn't find it!" Will first wait to see X, then it will send "yell 'I found it!" then it will start waiting for Y. Once it sees Y it will then send "yell 'I didn't find it!"

List Of Commands:
$stop - Stops all currently executing commands.

$waitfor - Takes an argument. Waits for the specified text before attempting to interpret the remaining text. E.g. "$waitfor Kaezar$;'Hey there's Kaezar!" Will wait until you see the incoming text "Kaezar" and then send the text "'Hey There's Kaezar!" This does catch the xml tags that are sent by UL, so you can flag things that you wouldn't necessarily see on screen.

$waittimers
Much like waitfor, except this waits until all your timers are at 0, this encompasses: Round Time, Stun Time, Unconscious Time, Prep Time, and Heal Time.

$go
Takes an argument. Navigates the set of directions given using ; as a separator. E.g. $go n;n;n;e;e;e;climb stairs$ will go north 3 times and then east three times and then climb some stairs. The command is smart about opening doors/gates and RT.

$goto
Takes an argument. This command uses pathfind to get the list of directions to the argument and then performs a $go with the direction list.

$dragto
Takes two arguments, separated by ;. First argument is the person, the second argument is the place, just like goto but with dragging. E.g. $dragto Telan;Secluded glade$ will pathfind Secluded glade and drag Telan there.

$wanderuntil
Takes an argument. Chooses random exits until the text in the argument is found. Semi-smart about not backpedaling unless it has no other choice. Mostly I use this to find guardians in Ul'Mydar.

$heal
Will attempt to heal yourself using elixirs (no herbs and no Vashon healing at this time). Will mark particular elixirs as empty when it can't find a particular elixir and won't retry. This command doesn't get you all the way to perfect, keeping you to fewer than 2 limbs with >= 2 wounds.

$refill
Removes canteens and waterskins using the counts defined in the Healing Containers dialog in the Character menu. The waterskins sold by the healers will automatically map to the healing elixir they were sold with, any others need to have a mapping added.

$herbs
Looks in all the canteens / waterskins using the counts defined in the Healing Containers dialog in the Character menu for a quick glance of what you have left.

$buff
Adds buffs to your character based on profession, level, and spell circles known. It will also dispel annoying effects, like being on fire, blinded, etc. Some classes have mutually exclusive effects, such as ap11, sp11, and vp11. The FrontEnd will use supplied Stats (in the character menu) to break ties after considering skill growth and level. If you don't see your favorite spell/ability get activated with $buff, send me a PM with the command to execute, whether it uses RT when invoked as well as the begin, already started, and end effect messaging.

$debuff
This command will use your character's dispel ability/spell to remove all effects present on your character, including positive effects.

$stow
Optional argument. Any text typed following $stow will be assumed to be an argument, unless you typed $stow$. You can target a particular item in either hand, either by specifying the item as the argument, or $stow right$, $stow left$, or $stow both$. No argument is equivalent to $stow both$, which will stow the items in both hands. See Storage Locations and Item Classification for more information.

$my
Takes an argument. This command is the logical inverse of $stow. It will try to discern what kind of item you're referencing in the argument, then reach into the appropriate storage location and grab it. If both hands are full, contents in the right hand will be stowed before attempting to retrieve the item. If you shorthand the noun (e.g. dag instead of dagger), it will not understand what you're looking for, and you'll probably end up with the wrong item.

$loot
This command will search the first corpse in the room. If a box is discovered, it will pick it up and $stow it automatically.

$skin
This command will skin the first corpse in the room. It will $stow items in hand prior to skinning. It assumes you're using a skinning knife and will use $my to get it, and $stow to return it. $stows the pelt and $my's the items that were originally in your hands when finished. Will also change stance to dodge and return to parry if you were originally in the parry stance, similarly it will kneel and restore you to your previous position (except levitating, which I know nothing about, if you know how to get to levitating, let me know).

$dress
Takes an argument. The argument is expected to be a container full of clothes. It will look in the container, grab each item in the container and wear it, retrying with different nouns where necessary. It knows to wait on RT.

$undress
Takes an argument. This command is the opposite of $dress, it takes all worn items *visible* on your character, remove them and put them in the specified container.

$stockuntil
Takes two arguments separated by a ;. Syntax: $stockuntil restockarg;thingyouwant$ This command will execute restock with the restockarg until it gets the text thingyouwant. For example, $restockuntil rack;red$ will run "restock rack" until it sees the text "red."

$unlock
Optional Argument of the NPC locksmith to unlock your boxes. Will take each box in your inventory and attempt to open it. If locked it will give it to the NPC (no argument defaults to Fuzz). Once open, it will then dump the contents into the container defined as General storage location for stow/my. If all the contents are removed from the box it will trash the box and move on to the next one. This command will not get your coins out since I don't know what coinage all the different locksmiths take, have it out ahead of time. If you have only unlocked boxes available, you don't need to be at an NPC locksmith.

$armor
This command takes no arguments. It attempts to get and wear the armor listed in the equipment menu. It uses the armor's storage location information (as though you were using $my) and waits for RT appropriately.

$unarmor
This command takes no arguments. It attempts to remove and put away the armor listed in the equipment menu. It uses the armor's storage location information (as though you were using $stow) and waits for RT appropriately.

$set
This command takes an argument of the form variable=value. For example $set target=Telan$. You can then reference the variable with @variable (e.g. for the previous set, @target). You can use these for Macros, aliases, etc.

$vars
This command doesn't take an argument. It prints out a list of all the current variables in the FE.

$clearvars
This command doesn't take an argument. It removes the entries for all currently set variables.

Special notes on Item Classification and Storage Locations
There are specific menu items to edit storage locations, there are 8 built-in storage locations, with many things that automatically slot to each one: Armor, Domestic Coins (currently only crowns, coins and coin also default to this, I may at some future point allow you to set your default currency), Foreign Coins, General (anything not covered by other buckets), Metals (slivers, ingots, nuggets), Scrolls, Tokens, and Tools (includes locksmithing tools and skinning knives). Each storage location includes an optional Open/Close checkbox, which will cause $my and $stow to automatically open before and close after storage/retrieval and a text box for a single container (may expand later to be variable).
If you find there's a noun that doesn't appropriately map to a storage category, or you want to have a different category for a particular item, that's fine! You can use the "Item Classifications" Character Menu item to map new items/remap existing items to a particular classification, this can be as loose or specific as you want, but the exact string has to match words in the item. For example, if you want things made of gold to go into your Metals classification (even if they aren't slivers, ingots, or nuggets), just add a "gold" entry with the metals classification. I may eventually add custom classifications, but only if people want it or I/others feel restricted by the current set in some way.

Targetted Aliases
While normal aliases are pretty common, in my FE you can add targetted aliases. Here every targetted alias (accessed through the Edit menu) becomes similar to a command with arguments, except that you use # for the beginning and end of the alias instead of $ you would use for commands. You can put $target1 (equivalent to $target), $target2, $target3... into your alias and they will be parsed out from the input. For example, if you have a targetted alias "greet" with text of "act bows deeply to $target, pulling his cloak with a dramatic flair." and you input #greet Telan#, the command "act bows deeply to Telan, pulling his cloak with a dramatic flair." This should work with the $name server-side replacement. Additionally, you can have multiple targets, the input uses the ; as a separator, and will use each entry in turn replacing $target1 (and $target) with the first entry, $target2 with the second, $target3 with the third, and so on.

Thanks for reading this far, hope you enjoy the program!
Telan

Re: ULFE

Posted: Sat Apr 12, 2025 6:14 pm
by Telan
Pending FE Asks
Compass rose
Font sizing specific to the input
Put ooc whispers in chat
More storage locations for mob boxes

FIXED
Unlock had been commented out, this has been restored.
Skinning knife and offhand weapon have been added to equipment. Offhand weapon doesn't do anything as of yet, added for completeness.
Getting coins for refilling healing containers now uses crowns instead of coins.
Via Teg spells should no longer show up for spiritual wilders.
You can not opt to keep the text in the input when you hit enter.
Scrollbar in RichEdit should pause adding text to the window (and scrolling) while that window isn't scrolled to the bottom, as soon as you reach the bottom the new text will appear. Shouldn't impact the chat window.
Added a small delay to $goto if you see "You will have to wait a moment before moving further."
Vm01 and vm05 have been added to $buff.
Added Hard Breaks to the gauges control organization.

Re: ULFE

Posted: Sat Apr 12, 2025 7:12 pm
by Telan
There was a bug related to the new scrolling feature which could crash the FE. It's been fixed.

Re: ULFE

Posted: Fri Apr 18, 2025 5:49 pm
by Telan
Updates related to storing boxes using $loot and $unlock, which will now attempt to rotate through a set of containers with the same name as the one you're targeting the object to go into if that container should be full. This may end in infinite loops if all those containers are full.

I've tweaked some of the auto scroll behaviors based on my own experience with it the past few days. If you type a command and hit enter you should auto scroll, so if you've scrolled up a ways, you can get back to the bottom by looking, glancing, or putting in any command you care to

Setting your skinning knife via the Equipment dialog should properly persist.

I've also been building up a set of tests for the commands so I don't break them as I maybe make tweaks for them.