Jump to content

Improvements for the dedicated server


Alloc

Recommended Posts

Is there a way to add a custom command in game that players can type in chat like /url and it will open the players default browser to the link set in the command??

In chat: Not yet, that's just text for everyone right now.

I assume you want it to be sent to others and they can click thank link? Or really open a browser just locally by typing "/url ..."?

 

 

Also a /rd or /removedebuff command so if a Admin breaks their leg while helping a player they can remove it and walk normal again :p

Hm, would have to see if that's possible, may require a client side change which would make it impossible for now.

 

 

When I try compile 7dtd-server-fixes I get the below 3 errors...

At least the last one means you don't have a deobfuscated DLL from the latest deobfuscator as the PackaqeQueue deobfuscation has been there since 0.3.1.

 

The other two may just be different field names in your DLL (couldn't easily deob them so those are the only two that have to be checked each update ;) ). Might be they would have the correct names if you update to the latest deob too as that could change field order because of the added deobfuscation for another field in the entities. If not use an assembly browser (e.g. the one from MonoDevelop) to look at the deobfuscated DLL, go to Command_listplayers.Run() and check which fields that reads for "id" and "remote".

Link to comment
Share on other sites

I think it was how I was using the deob tool.... drag and drop the dll into it doesn't completely work, I think it was needed the some other .dll files from the 7dtd Managed folder.

 

INFO : Started logging to mainlog.txt.

INFO : Deobfuscating Assembly-CSharp.dll...

___

 

 

INFO : Executing patcher "ManualDeobfuscator" (by Alloc,DerPopo)...

INFO : Writing the current Assembly-CSharp.dll to a MemoryStream...

INFO : Reading the current Assembly-CSharp.dll from the MemoryStream...

 

 

INFO : Executing patcher "NameSimplifier" (by DerPopo)...

ERROR : ERROR : Invoking the Patch method for NameSimplifier resulted in an exception :

ERROR : System.Exception: occured while patching 2 ---> Mono.Cecil.AssemblyResolutionException: Failed to resolve assembly: 'UnityEngine, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'

at Mono.Cecil.BaseAssemblyResolver.Resolve(AssemblyNameReference name, ReaderParameters parameters)

at Mono.Cecil.DefaultAssemblyResolver.Resolve(AssemblyNameReference name)

at Mono.Cecil.MetadataResolver.Resolve(IAssemblyResolver resolver, TypeReference type)

at Mono.Cecil.TypeReference.Resolve()

at NamePatcher.NameNormalizer.checkLocalDefinition[T](T def, String prefix, Int32 cmid, TypeDefinition btdef)

at NamePatcher.NameNormalizer.checkLocalDefinitions[T](Collection`1 memDef, String prefix, Int32 cmid, TypeDefinition btdef)

at NamePatcher.NameNormalizer.CheckNames(TypeDefinition tdef)

--- End of inner exception stack trace ---

at NamePatcher.NameNormalizer.CheckNames(TypeDefinition tdef)

at NamePatcher.NamePatcher.Patch(Logger logger, AssemblyDefinition asmCSharp, AssemblyDefinition __reserved)

INFO : Writing the current Assembly-CSharp.dll to a MemoryStream...

INFO : Reading the current Assembly-CSharp.dll from the MemoryStream...

 

 

INFO : Executing patcher "PacketClassesPatcher" (by DerPopo,Alloc)...

ERROR : ERROR : Invoking the Patch method for PacketClassesPatcher resulted in an exception :

ERROR : Mono.Cecil.AssemblyResolutionException: Failed to resolve assembly: 'UnityEngine, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'

at Mono.Cecil.BaseAssemblyResolver.Resolve(AssemblyNameReference name, ReaderParameters parameters)

at Mono.Cecil.DefaultAssemblyResolver.Resolve(AssemblyNameReference name)

at Mono.Cecil.MetadataResolver.Resolve(IAssemblyResolver resolver, TypeReference type)

at Mono.Cecil.TypeReference.Resolve()

at NetworkPatcher.Helpers.PatchSubMethods(MethodDefinition method, String newName)

at NetworkPatcher.Helpers.PatchVMethod(MethodDefinition method, String newName)

at NetworkPatcher.PatchPackageQueue.Patch(Logger logger, AssemblyDefinition asmCSharp)

at NetworkPatcher.NetworkPatcher.Patch(Logger logger, AssemblyDefinition asmCSharp, AssemblyDefinition __reserved)

INFO : Writing the current Assembly-CSharp.dll to a MemoryStream...

INFO : Reading the current Assembly-CSharp.dll from the MemoryStream...

 

___

INFO : Saving the new assembly to F:\7dtd\binary-improvements\Deobfuscate-7dtd_pre0.3.2\Assembly-CSharp.deobf.dll ...

INFO : Success.

 

so i dumped the deob tool in that main 7dtd game folder then did it, now the deob .dll works and I can compile

Link to comment
Share on other sites

In chat: Not yet, that's just text for everyone right now.

I assume you want it to be sent to others and they can click thank link? Or really open a browser just locally by typing "/url ..."?

 

Not a clickable link, Have the browser open to the url when the command is typed in. How its would work is I would set up a auto message to server stating something like "Please type /url in chat to visit our website" they would type /url in chat and hit enter as soon as the command hits the server it send the message back to the client to open the clients default web browser to a link that could be set inside a .txt file or something on the server side.

Link to comment
Share on other sites

I think it was how I was using the deob tool.... drag and drop the dll into it doesn't completely work, I think it was needed the some other .dll files from the 7dtd Managed folder.

 

so i dumped the deob tool in that main 7dtd game folder then did it, now the deob .dll works and I can compile

Yup, the Deobfuscator needs UnityEngine and I think also SteamworksManaged.dll by now. Normally it should work with drag'n'dropping the AC#.dll on the executable but it looks like that's not always the case :(

 

 

Not a clickable link, Have the browser open to the url when the command is typed in. How its would work is I would set up a auto message to server stating something like "Please type /url in chat to visit our website" they would type /url in chat and hit enter as soon as the command hits the server it send the message back to the client to open the clients default web browser to a link that could be set inside a .txt file or something on the server side.

Well, that would definitely include client side changes, so not for now. But I think the new server browser might also include things like a server homepage :)

Link to comment
Share on other sites

Just wanted to say, phenomenal work here Alloc You have given the tools to the community so that they might fight the war on hacking and trouble makers.

 

Aside from my amusing opening line, I'm receiving the following errors upon De-obfuscation.

 

log_PacketClassesPatcher.txt

INFO : Renamed packet class (NetPackage_MapPosition)!

INFO : Patched PackageQueue.Send.

INFO : Patched PackageQueue.SendAll.

INFO : Patched PackageQueue.Update.

INFO : Patched PackageQueue.GetEstimatedStreamSize.

INFO : Patched PackageQueue.Read.

INFO : Patched PackageQueue.IsConnected.

INFO : Patched PackageQueue.Close.

INFO : Patched PackageQueue.isClosed.

INFO : Patched PackageQueue.emptyList.

INFO : Patched PackageQueue.lastBytesSent.

INFO : Successful: 233 / Failed: 5

 

Manual De-obfuscator

ERROR : (Command_listents.Help()): MethodDefinition not found!

ERROR : (Command_listents.RepeatInterval()): MethodDefinition not found!

ERROR : (Command_listplayers.Help()): MethodDefinition not found!

ERROR : (Command_listplayers.RepeatInterval()): MethodDefinition not found!

ERROR : (Command_listthreads.Help()): MethodDefinition not found!

ERROR : (Command_listthreads.RepeatInterval()): MethodDefinition not found!

ERROR : (Command_enablescope.Help()): MethodDefinition not found!

ERROR : (Command_enablescope.RepeatInterval()): MethodDefinition not found!

ERROR : (Command_chunkcache.Help()): MethodDefinition not found!

ERROR : (Command_chunkcache.RepeatInterval()): MethodDefinition not found!

ERROR : (Command_showchunkdata.Help()): MethodDefinition not found!

ERROR : (Command_showchunkdata.RepeatInterval()): MethodDefinition not found!

ERROR : (Command_gameover.Help()): MethodDefinition not found!

ERROR : (Command_gameover.RepeatInterval()): MethodDefinition not found!

ERROR : (Command_debugmenu.Help()): MethodDefinition not found!

ERROR : (Command_debugmenu.RepeatInterval()): MethodDefinition not found!

ERROR : (Command_shutdown.Help()): MethodDefinition not found!

ERROR : (Command_shutdown.RepeatInterval()): MethodDefinition not found!

ERROR : (Command_spawnentity.Help()): MethodDefinition not found!

ERROR : (Command_spawnentity.RepeatInterval()): MethodDefinition not found!

ERROR : (Command_settime.Help()): MethodDefinition not found!

ERROR : (Command_settime.RepeatInterval()): MethodDefinition not found!

ERROR : (Command_setgamepref.Help()): MethodDefinition not found!

ERROR : (Command_setgamepref.RepeatInterval()): MethodDefinition not found!

ERROR : (Command_kick.Help()): MethodDefinition not found!

ERROR : (Command_kick.RepeatInterval()): MethodDefinition not found!

ERROR : (Command_ban.Help()): MethodDefinition not found!

ERROR : (Command_ban.RepeatInterval()): MethodDefinition not found!

ERROR : (Command_admin.Help()): MethodDefinition not found!

ERROR : (Command_admin.RepeatInterval()): MethodDefinition not found!

ERROR : (Command_mod.Help()): MethodDefinition not found!

ERROR : (Command_mod.RepeatInterval()): MethodDefinition not found!

ERROR : (Command_whitelist.Help()): MethodDefinition not found!

ERROR : (Command_whitelist.RepeatInterval()): MethodDefinition not found!

ERROR : (Command_cp.Help()): MethodDefinition not found!

ERROR : (Command_cp.RepeatInterval()): MethodDefinition not found!

ERROR : (Command_say.Help()): MethodDefinition not found!

ERROR : (Command_say.RepeatInterval()): MethodDefinition not found!

ERROR : (Command_convertdtm.Help()): MethodDefinition not found!

ERROR : (Command_convertdtm.RepeatInterval()): MethodDefinition not found!

ERROR : (Command_mem.Help()): MethodDefinition not found!

ERROR : (Command_mem.RepeatInterval()): MethodDefinition not found!

ERROR : (Command_aiddebug.Help()): MethodDefinition not found!

ERROR : (Command_aiddebug.RepeatInterval()): MethodDefinition not found!

ERROR : (Command_spawnwanderinghorde.Help()): MethodDefinition not found!

ERROR : (Command_spawnwanderinghorde.RepeatInterval()): MethodDefinition not found!

ERROR : (Command_spawnairdrop.Help()): MethodDefinition not found!

ERROR : (Command_spawnairdrop.RepeatInterval()): MethodDefinition not found!

ERROR : (Command_spawnsupplycrate.Help()): MethodDefinition not found!

ERROR : (Command_spawnsupplycrate.RepeatInterval()): MethodDefinition not found!

ERROR : (Command_shownexthordetime.Help()): MethodDefinition not found!

ERROR : (Command_shownexthordetime.RepeatInterval()): MethodDefinition not found!

ERROR : (Command_sounddebug.Help()): MethodDefinition not found!

ERROR : (Command_sounddebug.RepeatInterval()): MethodDefinition not found!

ERROR : (Command_smoothworld.Help()): MethodDefinition not found!

ERROR : (Command_smoothworld.RepeatInterval()): MethodDefinition not found!

ERROR : (Command_generatemap.Help()): MethodDefinition not found!

ERROR : (Command_generatemap.RepeatInterval()): MethodDefinition not found!

ERROR : (Command_saveworld.Help()): MethodDefinition not found!

ERROR : (Command_saveworld.RepeatInterval()): MethodDefinition not found!

ERROR : (Command_buff.Help()): MethodDefinition not found!

ERROR : (Command_buff.RepeatInterval()): MethodDefinition not found!

ERROR : (Command_debuff.Help()): MethodDefinition not found!

ERROR : (Command_debuff.RepeatInterval()): MethodDefinition not found!

INFO : Successful: 132 / Failed: 64

 

Whilst the main log prints the following, ultimately it looks as though it has failed.

INFO : Started logging to mainlog.txt.

INFO : Deobfuscating Assembly-CSharp.dll...

___

 

 

INFO : Executing patcher "ManualDeobfuscator" (by Alloc,DerPopo)...

INFO : Writing the current Assembly-CSharp.dll to a MemoryStream...

INFO : Reading the current Assembly-CSharp.dll from the MemoryStream...

 

 

INFO : Executing patcher "NameSimplifier" (by DerPopo)...

INFO : Writing the current Assembly-CSharp.dll to a MemoryStream...

INFO : Reading the current Assembly-CSharp.dll from the MemoryStream...

 

 

INFO : Executing patcher "PacketClassesPatcher" (by DerPopo,Alloc)...

INFO : Writing the current Assembly-CSharp.dll to a MemoryStream...

INFO : Reading the current Assembly-CSharp.dll from the MemoryStream...

 

___

INFO : Saving the new assembly to F:\Project 1\tools\Deobfuscate-7dtd_pre0.3.2\Deobfuscate-7dtd_pre0.3.2 (2) (1)\Deobfuscate-7dtd_pre0.3.2\Assembly-CSharp.deobf.dll ...

INFO : Success.

 

I understand you are a very busy individual, however any help would be most appreciated.

 

Best regards

Archangel

 

[ATTACH]4684[/ATTACH][ATTACH]4683[/ATTACH][ATTACH]4682[/ATTACH][ATTACH]4681[/ATTACH]

log_ManualDeobfuscator.txt

log_NameSimplifier.txt

log_PacketClassesPatcher.txt

mainlog.txt

Link to comment
Share on other sites

Hi,

 

can't tell you much on the network-deob part as that's by DerPopo but as there are no errors I'd assume it's fine. For the ManualDeob it's fine too, those 64 "failures" are from classes that don't have those methods so it's actually fine. Didn't come around to filter those yet ;)

 

Regards,

Chris

Link to comment
Share on other sites

I keep seeing Rev. 199, on the site and its starting to get too me, That odd number just looks at me and makes me what too punch myself in the face. How about doing one more Rev to 200 make it an even number for me even if its just a new Rev with no changes even Rev. 2.0 would be better then seeing that 199... lol :p

Link to comment
Share on other sites

2 Requests.

 

First, Noticed the llp command for listing Keystones will list everyone on the server, While in game your console window will only allow so much text displayed so it would be good to put a break after every 10 or 20 displayed then maybe have Admin type "next" in console to scroll through the next 10 or 20 Keystones. This way it does not spam all the keystone locations at one time and run most of them up and off the console window due to the text limit set in game console.

 

Second, Would like to see a new command added that a Admin can type in console like "event" after this is entered a message is displayed on chat box to all players stating if they would like to join the event then type "/join" in chat, As soon as they type "/join" it teleports the player that types the command to the Admin online with permission level of "0", This will help server admins that like to host events on their server to get the players where they need to be faster so the event can start. This request is just a idea and its up too you if you want to add it in the .dll or not.

Link to comment
Share on other sites

I keep seeing Rev. 199, on the site and its starting to get too me...

Don't worry, there'll be an update soon™ ;)

 

 

First, Noticed the llp command for listing Keystones will list everyone on the server, While in game your console window will only allow so much text displayed so it would be good to put a break after every 10 or 20 displayed then maybe have Admin type "next" in console to scroll through the next 10 or 20 Keystones. This way it does not spam all the keystone locations at one time and run most of them up and off the console window due to the text limit set in game console.

Hm, even though paging sounds like a good idea in the current framework it would be annoying to implement. Isn't filtering the list (llp summary, llp <steamid> etc) not enough?

 

 

Second, Would like to see a new command added that a Admin can type in console like "event" after this is entered a message is displayed on chat box to all players stating if they would like to join the event then type "/join" in chat, As soon as they type "/join" it teleports the player that types the command to the Admin online with permission level of "0", This will help server admins that like to host events on their server to get the players where they need to be faster so the event can start. This request is just a idea and its up too you if you want to add it in the .dll or not.

I suppose until there is a real chat command implementation it doesn't help you much. Obviously it's a bit less work for the admin but on the other hand you can still send a message manually, have people reply (/join would work just fine ;) ) and use "tele <other> <your>" to get them to you. One command per player, shouldn't be thaaaat problematic ;)

Link to comment
Share on other sites

I wanted to add to the llp comment earlier. One thing I find frustrating is getting coords of a land claim block in-game. Standing inside of it is very in accurate. Using the F3 menu in debug mode is also very difficult to get the mouse on the keystone itself. Is it possible somehow to list all land protections near a coordinate or player? Or, add the coordinates to the webserver overlay?

 

Also, I find it hard to get the steam ID sometimes. When llp scrolls off the screen I can't find the username, and the web server only shows the username. So I can't get the steam ID to list or delete all of the players LCBs (unless I search the players.xml file for the coords).

 

Also, I noticed the removelandprotection command only works when I'm near the land claim blocks. On one server, I was trying to delete a few hundred LCBs from one steam ID, and the rlp command only worked when I was next the the LCBs. It said #400 blocks removed but it only removed the ones near me.

 

Thank god for the rlp command, though, even if I had to go around the map to all their coordinates each time, it's such a time saver.

Link to comment
Share on other sites

Is it possible somehow to list all land protections near a coordinate or player? Or, add the coordinates to the webserver overlay?

Sure, both possible (and the latter one will definitely come). Maybe I'll just add a LLP near player in between.

 

Also, I find it hard to get the steam ID sometimes. When llp scrolls off the screen I can't find the username, and the web server only shows the username. So I can't get the steam ID to list or delete all of the players LCBs

Added steamid to LP block display in the web map (just uploaded, webserver files only).

 

Also, I noticed the removelandprotection command only works when I'm near the land claim blocks.

Yup, the game can only modify blocks in chunks that are currently loaded. Will add a message to recheck with LLP after deleting to make sure everything has gone ;)

 

I forgot to add: how about an option to put coords into the llp command to get the owner/SteamID of a certain block?

Hm, hate those "put three coordinates values in here" commands but I think that command variation might actually be helpful ;)

Link to comment
Share on other sites

You are awesome.

 

 

Hm, hate those "put three coordinates values in here" commands but I think that command variation might actually be helpful ;)

 

Yeah, people get confused on how to type it. Is it like the example, "<100> <100> <100>"? Is it like the lp output, "100,100,100"? Is it XYZ or XZY?? It took me a few tries to get it right, then I had to show all my admins. You may want to clear up that instruction text.

 

The other minor annoyance is that we can't type a player's name if it contains any spaces. I can "tele Soylent" all day, but "tele Soy Lent" would try to send Soy over to Lent...

 

But I think that "llp nearby" would be more useful to in-game mods, since they can just go to the location and type that to check who owns the place. But damn, rlp can be dangerous...it's easy to type in "rlp steamID" instead of "llp steamID" :shame::chargrined:

 

So, I was also wondering. Do you know anything about the "mem" command? All I've found is that it clears up chunks and "calls in garbage collector". Does it do anything that the game engine doesn't already do by itself? I'm curious whether there's any advantage to using it frequently.

Link to comment
Share on other sites

The other minor annoyance is that we can't type a player's name if it contains any spaces. I can "tele Soylent" all day, but "tele Soy Lent" would try to send Soy over to Lent...

 

I have always done "tele <id> <id>" where id is the players id displayed in lp command. Never tried to do it with player name didn't even know it was an option, Good catch on the space in a name btw if that's the case.

Link to comment
Share on other sites

Added steamid to LP block display in the web map (just uploaded, webserver files only).

 

Maybe display the cords to the block under the player name so if an Admin sees a block where it should not be on the map he can teleport to the block using the tele cords command.

Link to comment
Share on other sites

You may want to clear up that instruction text.

The other minor annoyance is that we can't type a player's name if it contains any spaces. I can "tele Soylent" all day, but "tele Soy Lent" would try to send Soy over to Lent...

There are overall improvements on the console handling coming up ;)

Not sure about quoting yet though.

 

But damn, rlp can be dangerous...it's easy to type in "rlp steamID" instead of "llp steamID"

Hm, yeah, maybe I should remove the short form of rlp so such an action is protected against mistakes.

 

So, I was also wondering. Do you know anything about the "mem" command? All I've found is that it clears up chunks and "calls in garbage collector". Does it do anything that the game engine doesn't already do by itself? I'm curious whether there's any advantage to using it frequently.

The only thing it does is unload unused things. And that unloading is at least done whenever a client disconnects but also in a few other places where I did not find yet what triggers them.

 

Maybe display the cords to the block under the player name so if an Admin sees a block where it should not be on the map he can teleport to the block using the tele cords command.

Yeah, will add that.

 

Can I overwrite the webserver folder while the server is online, or does it need to be shut down?

Yup, currently caching is disabled so whenever a client requests one of the files it's directly read from disk.

Link to comment
Share on other sites

Hm, yeah, maybe I should remove the short form of rlp so such an action is protected against mistakes.

 

Yeah, will add that.

 

Please don't remove the short version of rlp, I use it all the time as well as llp and I never have a problem, Like stated before in order to remove a claim block with rlp steamid you have to be in the same chunk as the block itself I have never been able to get it too work any other way.

 

Also thanks for adding the cords to the block on the map.

Edited by Lordicon (see edit history)
Link to comment
Share on other sites

Please don't remove the short version of rlp, I use it all the time as well as llp and I never have a problem, Like stated before in order to remove a claim block with rlp steamid you have to be in the same chunk as the block itself I have never been able to get it too work any other way.

 

Also thanks for adding the cords to the block on the map.

 

i agree with LordIcon please don remove the short

i have no prob removing LCB with steamID or x y z

but sometimes its seems like it gets touchy and you have to use steamid

Link to comment
Share on other sites

Thank you for adding the SteamID and coords to the land claims! Awesome improvement.

 

Our servers got hit hard last night, and I have some more feature requests. Would it be possible to add the playername into the log message "Player with ID 123456 has stack for "item" greater than allowed"? I'm trying to make that message trigger a PM to admins, but with the name and SteamID.

 

When I reset a zone (delete a region file), the webserver map still shows all the land claim blocks. Is there a way to refresh the land claims after a region has been deleted?

 

Would it be possible to define specific items and quantity for the message log alert? For example, nobody (on my servers) should have a stack of 64 LCB's, but it won't trigger the over-limit alert.

 

The other thing that I have an issue with in on the server is that it doesn't save bans to the blacklist unless I give the "restart/shutdown" command. Is it possible to have a command that will save to the XML files without needing a restart?

Link to comment
Share on other sites

  • 2 weeks later...

I posted in the support section about this issue but because one of the errors is about the LPE command I figured I would post a link to my other post here and the error message its stating as well.

 

Support Forums Link

 

Error Message I am getting

217.146 Error in ListPlayersExtended.Run: System.NullReferenceException: Object reference not set to an instance of an object at AllocsFixes.CustomCommands.ListPlayersExtended.Run (System.String[] _params) [0x00000] in <filename unknown>:0 

 

Spammed with this

NullReferenceException: Object reference not set to an instance of an object at GameManager.Update () [0x00000] in <filename unknown>:0 

Edited by Lordicon (see edit history)
Link to comment
Share on other sites

Setup new server fresh install getting this error from time to time.

 

25207.850 Error in StaticHandler.HandleRequest: System.IO.IOException: Write failure ---> System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host.



 at System.Net.Sockets.Socket.Send (System.Byte[] buf, Int32 offset, Int32 size, SocketFlags flags) [0x00000] in <filename unknown>:0 

 at System.Net.Sockets.NetworkStream.Write (System.Byte[] buffer, Int32 offset, Int32 size) [0x00000] in <filename unknown>:0 

 --- End of inner exception stack trace ---

 at System.Net.Sockets.NetworkStream.Write (System.Byte[] buffer, Int32 offset, Int32 size) [0x00000] in <filename unknown>:0 

 at System.Net.ResponseStream.InternalWrite (System.Byte[] buffer, Int32 offset, Int32 count) [0x00000] in <filename unknown>:0 

 at System.Net.ResponseStream.Write (System.Byte[] buffer, Int32 offset, Int32 count) [0x00000] in <filename unknown>:0 

 at AllocsFixes.NetConnections.Servers.Web.StaticHandler.HandleRequest (System.Net.HttpListenerRequest req, System.Net.HttpListenerResponse resp, System.Net.HttpListenerBasicIdentity user) [0x00000] in <filename unknown>:0 

 

I am thinking it has to do with when im on the server map but not sure.

Link to comment
Share on other sites

@soylent

The other thing that I have an issue with in on the server is that it doesn't save bans to the blacklist unless I give the "restart/shutdown" command. Is it possible to have a command that will save to the XML files without needing a restart?

For loading a modified xml: Make a custom build where you launch a System.IO.FileSystemWatcher instance, and in the Changed event handler trigger a re-parse of the XML.

 

For the saving, add the serialization of the xml to the ban command.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...