blakepell / avalonmudclient Goto Github PK
View Code? Open in Web Editor NEWA Windows MUD client written in C#/WPF for .NET 8.
License: Other
A Windows MUD client written in C#/WPF for .NET 8.
License: Other
In cases where entries may have been removed (possibly by someone manually editing the JSON settings file) replace the placeholder entries for the keys we support.
If the #trigger
is used on a trigger in anyway that creates a trigger during the trigger loop it will cause a crash during the enumeration of the for/each loop.
A possible fix would be to defer the contents of those triggers (that create other triggers) until after the for/each has completed enumerating. There is almost no chance the newly created trigger would need to fire on the same line (that line has already been triggered).
Xeno: Provide an option to make the panels not auto-scroll if they're not at the bottom (in case someone is scrolling up).
Dan Kiaha: What about a clan tagger?
Rethink this, it's not currently very useful. The issue is that commands aren't processed currently if the profile's connection to the game is open. If the game auto connects the autoexec sometimes fires and works and sometimes fired and aren't processed because the connection to the game isn't open (race condition).
One of two things should occur (or, both):
1.) Convert this to be a Lua Event instead that gets executed. This would skip the command interpreter unless lua.Send
was called but would allow the user to run setup commands.
2.) Allow commands to process even if the connection isn't open and just let the network commands error if they're called.
Users need to be able to resize the game and comm panels.
Expose the underlying Regex
so that the GagElementGenerator
can call it directly. Gags are unique in that they can be called repeatedly on lines from the AvalonTerminal
(e.g. AvalonEdit) but will never need to process a command or go through any of the additional overhead. Currently the Trigger
class calls Regex.Match
directory because the returned object is needed to process groups. The GagElementGenerator
however can call IsMatch
which doesn't need to create the Match
object and simply returns a true
of false
.
1.) Expose the Regex
as a public property.
2.) Change the GagElementGenerator
to call the Regex.IsMatch
method directly.
Hash commands from plugins should be added into the auto complete list for the input prompt.
Jacob Coulter:
@blake Pell another idea for your client. A built in damage calculator for watching arena fights. Like the old damn dam calc for zmud.
Move this from the IC to the OOC tab:
[06:05:52 PM]: Traice radios 'Now Playing: "Rip N Dip" - Getter (Kill the Noise Remix) - plug.dj/dark-and-shattered-logs/'
Change the example plugin library to be a netcoreapp3.1 type. The rationale for this is that the specific plugin library is for this WPF implementation and as a result we'll want to be able to include things like, Windows and Controls and MenuItems, etc. That will make the plugins very flexible/powerful.
If we expand Xamarin or UWP the core Avalon.Common can be shared via netstandard but the plugins should be platform specific to leverage the UI models of whatever that platform is.
Jonas wrote:
"Add a tiny line that keeps track of how long your blesses are up on your worn armor!"
Flagged as MachineLearning/Anomalous.100%
Malwarebytes
www.malwarebytes.com
-Log Details-
Protection Event Date: 4/27/21
Protection Event Time: 4:19 PM
Log File: 3c01eaae-a79e-11eb-84e1-00d861055e78.json
-Software Information-
Version: 4.3.0.98
Components Version: 1.0.1273
Update Package Version: 1.0.39865
License: Premium
-System Information-
OS: Windows 10 (Build 19041.928)
CPU: x64
File System: NTFS
User: System
-Blocked Malware Details-
File: 1
MachineLearning/Anomalous.100%, C:\Users\jmbzy\AppData\Local\Programs\AvalonMudClient\Avalon.dll, Quarantined, 0, 392687, 1.0.39865, , shuriken, , EB3B3655A14BF8A754F57094B4F18CF7, 5F6BBA5B661EBE5C2FA96585E0BD4B13D10F7796BC507D62AA97F40459E85F10
(end)
Update the trigger hash command to allow for the additional fields to be set. Go into the Trigger class and make sure that the properties added implement Notify Property if they'll be shown through any kind of binding.
Xenophon:
Me:
When the new Argus.Core version is released remove these and replace the calls with the Argus.Core versions (which are identical):
public static int SafeIndexOf(this ReadOnlySpan<char> span, ReadOnlySpan<char> value, int startIndex)
public static int IndexOf(this ReadOnlySpan<char> span, ReadOnlySpan<char> value, int startIndex)
Create a SQLite query control that gives a user everything they need to manage a SQLite database that they can choose to use. By default we will create a new SQLite database with every profile.
Unhandled exception (TaskScheduler.UnobservedTaskException)
Unhandled exception in Avalon v2022.4.22.1
A Task's exception(s) were not observed either by Waiting on the Task or accessing its Exception property. As a result, the unobserved exception was rethrown by the finalizer thread. (Index was out of range. Must be non-negative and less than the size of the collection. (Parameter 'index'))
Index was out of range. Must be non-negative and less than the size of the collection. (Parameter 'index')
at System.Collections.Generic.List`1.get_Item(Int32 index)
at Avalon.Common.Utilities.FullyObservableCollection`1.get_Item(Int32 index) in \Git\AvalonMudClient\src\Avalon.Common\Utilities\FullyObservableCollection.cs:line 65
at Avalon.Common.Utilities.TriggerObservableCollection.Enumerable()+MoveNext() in \Git\AvalonMudClient\src\Avalon.Common\Utilities\TriggerObservableCollection.cs:line 41
at Avalon.Conveyor.DisableGroup(String groupName) in \Git\AvalonMudClient\src\Avalon.Client\Conveyor.cs:line 740
at lambda_method207(Closure , Object , Object[] )
at MoonSharp.Interpreter.Interop.MethodMemberDescriptor.Execute(Script script, Object obj, ScriptExecutionContext context, CallbackArguments args) in \Git\AvalonMudClient\src\Avalon.MoonSharp\Interop\StandardDescriptors\ReflectionMemberDescriptors\MethodMemberDescriptor.cs:line 346
at MoonSharp.Interpreter.Interop.OverloadedMethodMemberDescriptor.<>c__DisplayClass37_0.<GetCallback>b__0(ScriptExecutionContext context, CallbackArguments args) in \Git\AvalonMudClient\src\Avalon.MoonSharp\Interop\StandardDescriptors\ReflectionMemberDescriptors\OverloadedMethodMemberDescriptor.cs:line 511
at MoonSharp.Interpreter.Execution.VM.Processor.Internal_ExecCall(ExecutionControlToken ecToken, Int32 argsCount, Int32 instructionPtr, CallbackFunction handler, CallbackFunction continuation, Boolean thisCall, String debugText, DynValue unwindHandler) in \Git\AvalonMudClient\src\Avalon.MoonSharp\Execution\VM\Processor\Processor_InstructionLoop.cs:line 857
at MoonSharp.Interpreter.Execution.VM.Processor.Processing_Loop(ExecutionControlToken ecToken, Int32 instructionPtr) in \Git\AvalonMudClient\src\Avalon.MoonSharp\Execution\VM\Processor\Processor_InstructionLoop.cs:line 166
at MoonSharp.Interpreter.Execution.VM.Processor.Call(ExecutionControlToken ecToken, DynValue function, DynValue[] args) in \Git\AvalonMudClient\src\Avalon.MoonSharp\Execution\VM\Processor\Processor.cs:line 71
at MoonSharp.Interpreter.Script.Internal_Call(ExecutionControlToken ecToken, DynValue function, DynValue[] args) in \Git\AvalonMudClient\src\Avalon.MoonSharp\Script.cs:line 407
at System.Threading.Tasks.Task`1.InnerInvoke()
at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location ---
at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
--- End of stack trace from previous location ---
at Avalon.Common.Scripting.MoonSharpEngine.ExecuteFunctionAsync[T](String functionName, String[] args) in \Git\AvalonMudClient\src\Avalon.Common\Scripting\MoonSharpEngine.cs:line 372
Make the settings that are being manually set work with binding. Specifically the quick toggles on the command bar. Previous attempts had them being able to set the variables but would not update even though property notification was sent and two way binding was set.
Important: Make sure than anything that is bound calls INotifyProperty.
The directions filter crashes when used after changing profiles. (probably the other filters do as well since they're all mostly the same).
[1:41 PM]: K'anata OOC: 'Make sure it has chat capture, for all channels, and configureable which ones. Plus hush of channels for 1hr.'
This call worked on subsequent calls. Not sure why the first call failed when retrieving the enum value from a string.
=> Lua Exception: (Line 32, Position 11-96): cannot convert a string to a clr type MahApps.Metro.IconPacks.PackIconMaterialKind
=> Lua Function: func_tr_4dacdb10_0443_402f_842f_5379bd9332a4
=> Lua Internal Data: ExecuteFunctionAsync<T>: Lua Error running function func_tr_4dacdb10_0443_402f_842f_5379bd9332a4("A minotaur spectator is struck by lightning from a grand arcanium sword.", "is struck by lightning from", "")
From the interactive Lua panel:
Unhandled exception (TaskScheduler.UnobservedTaskException)
Unhandled exception in Avalon v2022.7.3.2
A Task's exception(s) were not observed either by Waiting on the Task or accessing its Exception property. As a result, the unobserved exception was rethrown by the finalizer thread. (One or more errors occurred. (')' expected (to close '(' at line 5) near '<eof>'))
One or more errors occurred. (')' expected (to close '(' at line 5) near '<eof>')
at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
at System.Threading.Tasks.Task`1.get_Result()
at MoonSharp.Interpreter.Script.<>c__DisplayClass56_0.<DoStringAsync>b__0(Task`1 prevTask)
at System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke()
at System.Threading.Tasks.Task.<>c.<.cctor>b__272_0(Object obj)
at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location ---
at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
--- End of stack trace from previous location ---
at Avalon.Common.Scripting.MoonSharpEngine.ExecuteStaticAsync[T](String code)
Add a back buffer to view text that was previously sent to the mud client. Ideally page up and page down would invoke the back buffer which would take over the upper part of the screen allow the player to scroll back through text that previously was sent while also being able to see text that is incoming on the lower half of the screen.
When a new profile is loaded the auto complete box isn't refreshing with the new profiles directions.
Currently ;
is used to split commands when multiple commands are sent. In some muds, namingly ROM 2.4 the ;
character is used for short hand to send group tells. Set ;
as the default but allow for the character to be changed via the settings.
Idea/Request from Julie Stone.
See if there is anything in Moonsharp to validate Lua syntax, if not, write an extension method to validate syntax. Have places where Lua is used then validate and provide to the user syntax validation on save.
Currently the settings dialog allows for the editing of all of the profile specific settings. We also need a dialog or tabs on the current settings dialog that allow for the core client settings to be altered (these can be thought of as the global settings).
If you type a .
on an empty line the editor will crash. The issue is it invokes the intellisense and crashes finding the previous word (where there is none on an empty line). Put proper bounds checking in. This bug may exist in the SQLite database control as well.
Current the Lua command to echo to the terminal uses the interpreters echo (which is mainly used for echoing text that's incoming from the game). This needs to be changed to construct it's own line that disregards the previous color from the mud (this will both preserve the correct ANSI color for incoming mud text but allow the Lua script to echo whatever it needs in whatever color it needs.
The bug is, when you echo something in Lua it keeps showing the previous color sent from the mud.
From Jonas.
From TJ:
Specifically for ACFL The ability to define however many characters (8 players on the field) and when they get toasted,
it pulls up a fresh window with their name and the 6 tick countdown to their unghost
That would be spectacular for ACFL coordination since it would allow me to track who is alive and dead. If you wanted to get jiggy with it, you could have it auto-populate off of the flagscore
So that the progress bars for each player can be color coordinated for red/blue
When it populates it can be set to the max-bar (like perm effects) that states ALIVE and when they are toasted it starts to tick down from 6 and when they unghost it pushes a toast to alert that they have respawned
#clearflag or the act line "^(variable) Team WON Capture the Flag!!" can clear the window
Ideal setup:
Breakaway ACFL window that pops up on Flagscore. I'll get the print syntax for it because it SHOULD provide "red team" "blue team" data. It can pull the first 4 names from each list (there is a fifth slot on each team that appears to have been scrapped last second) to populate the ACFL window with progress/status bars synced to their team color. Default state is full progress bar ALIVE status, but on parsing a toast message, sets the timer to 6 ticks that ticks down every tick similar to affects window, pushing a (name) has unghosted!) toast at 0
Isn't working, possibly when a language is enabled. Check this Regex:
Kingdom: (Elvish) 'Greetings.'
Jonas and Neil:
Add the ability to open tabs into a new window.
Relik Silversmith ((Imm) Vaelin) imms: 'Hello.'
(Wizi@52) a tubby gray housecat ((Imm) Whiskey) imms: 'eeeeeeek'
Track affects and surface them on the UI. Provide feedback on the screen and via animations that pulse the command bar a color when spells like sanctuary or haste fall.
Investigate having these share the same caller from the Interpreter.
From Dan Kiaha.
Jonas:
Currently triggers work for all or just one character. Make it so a trigger can be used for multiple characters.
Xenophon: My thoughts are a client that could output either pk or rp logs easily would be epic
Rhien: Extracting the battle stuff would be straightforward. I think that'd be pretty easy to do on the fly. Could probably could show the log then you could select "Filter to RP", "Filter to PK".
Xenophon: Tick boxes for what to output or something so you can customize
Xenophon: You'd get a lot of interest from kingdom types for that alone
Now that the client can save the last window position and restore it as a setting, add code that will try to detect if the Window is off the bounds of all monitors (and move it into a visible position if that's the case).
This could come about because of changes in resolution (or because it was moved off of the screen).
The Lua engine is having exceptions when more than one script enter the engine at a time. Look into the MoonSharp documentation and see if either multiple instances need to be started up for async calls or if they need to be called in a different way. The exceptions can manifest with different exceptions. Examples:
Index was out of range. Must be non-negative and less than the size of the collection. (Parameter 'index')
--> Index was out of range. Must be non-negative and less than the size of the collection. (Parameter 'index')
--> Index was outside the bounds of the array.
--> Object reference not set to an instance of an object.
--> Unexpected type in table ctor : 0
--> Unexpected type in table ctor : 10
--> attempt to index a nil value
--> attempt to index a number value
To test this I created an alias that executed a Lua script and then repeated in fast succession with the #repeat command.
Lua Alias (named test):
local data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
local value = data[math.random(1, 10)]
local anotherVar = value * 5;
Cmd:Echo("Your value is " .. anotherVar)
Hash Command:
#repeat 50 test
Need to support different fonts and font sizes.
From Joules:
I am used to the shift + tab for word auto-completion based on history and was sad to see it was not a feature. This feature helps me to quickly complete the full name of the character or mob I am targeting or interacting with. The setup was nice, and I am excited to try it out.
Dan:
Add a setting to allow for the timestamp in the comm windows to include the second.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.