Approved Fougerite MC [Deleted]

Status
Not open for further replies.

mikec

Master Of All That I Survey
Administrator
Jul 12, 2014
296
152
28
Los Angeles, California, USA
New in MC1:
  • Fixed Magma plugin.cfg loading.
  • Rust++ uses its own name instead of Fougerite in chat response and notify.
  • JintPlugin.dll is self-contained and can be enabled along with MagmaPlugin. Each uses its own folder for plugins, so there is no conflict.
  • JintPlugin gets a new Lookup class, which makes it easy to get collections of game objects by owner, kind, material, etc.
  • Fougerite can be disabled in Fougerite.cfg. When starting or reloading, if enabled=false Fougerite will not load modules and will not call any hooks. Normally Fougerite is enabled but this can be used to turn it off on the next reload.
  • The Fougerite version message at login can be turned off by setting tellversion=false in Fougerite.cfg.
 

CorrosionX

Plugin Developer
Plugin Developer
Sep 3, 2014
212
85
18
California
So, seems in yours:
%ServerRoot%\save\rust++
in official
%ServerRoot%\save\rustpp
and, Fougerite.cfg is located in
%ServerRoot%\save\
in official
%ServerRoot%\rust_server_data\
(which replaces the need for the fougeritedirectory.cfg as they are combined.)

To let anyone else that moves over know.


Oh and don't mind this server crashing bug that freezes everything by spamming console with this error practically DDOSing itself:
Code:
[9/7/2014 12:56:27 PM] [Exception] [ AnticheatModule->takeCoordsEvent | Timer->Callback | ]
System.NullReferenceException: Object reference not set to an instance of an object
  at Fougerite.Player.get_Name () [0x00000] in <filename unknown>:0
  at Anticheat.AnticheatModule.takeCoordsEvent (System.Object x, System.Timers.ElapsedEventArgs y) [0x00000] in <filename unknown>:0
[9/7/2014 12:56:28 PM] [Error] [MagmaPlugin] Error invoking function TPAJobTimerCallback in TpFriend plugin.
[9/7/2014 12:56:28 PM] [Exception] [ Plugin->Invoke | Plugin->OnTimerCB | TimedEvent->_timer_Elapsed | Timer->Callback | ]
System.NullReferenceException: Object reference not set to an instance of an object
at Fougerite.Player.get_SteamID () <0x0002a>
at (wrapper dynamic-method) Jint.Marshal.ProxyHelper.dynamicPropertyGetter (Jint.Marshaller,Jint.Native.JsDictionaryObject) <0x00029>
at Jint.Native.NativeDescriptor.Get (Jint.Native.JsDictionaryObject) <0x0002a>
at Jint.Native.JsDictionaryObject.TryGetProperty (string,Jint.Native.JsInstance&) <0x00047>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.PropertyExpression) <0x00085>
at Jint.Expressions.PropertyExpression.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.MemberExpression) <0x0003e>
at Jint.Expressions.MemberExpression.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.BinaryExpression) <0x00031>
at Jint.Expressions.BinaryExpression.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.IfStatement) <0x0001c>
at Jint.Expressions.IfStatement.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.BlockStatement) <0x000b4>
at Jint.Expressions.BlockStatement.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.ForEachInStatement) <0x00377>
at Jint.Expressions.ForEachInStatement.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.BlockStatement) <0x000b4>
at Jint.Expressions.BlockStatement.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.BlockStatement) <0x000b4>
at Jint.Expressions.BlockStatement.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.Native.JsFunction.Execute (Jint.Expressions.IJintVisitor,Jint.Native.JsDictionaryObject,Jint.Native.JsInstance[]) <0x0008f>
at Jint.ExecutionVisitor.ExecuteFunction (Jint.Native.JsFunction,Jint.Native.JsDictionaryObject,Jint.Native.JsInstance[],System.Type[]) <0x0033c>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.MethodCall) <0x0042c>
at Jint.Expressions.MethodCall.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.MemberExpression) <0x0003e>
at Jint.Expressions.MemberExpression.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.VariableDeclarationStatement) <0x0003c>
at Jint.Expressions.VariableDeclarationStatement.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.BlockStatement) <0x000b4>
at Jint.Expressions.BlockStatement.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.SwitchStatement) <0x0012f>
at Jint.Expressions.SwitchStatement.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.BlockStatement) <0x000b4>
at Jint.Expressions.BlockStatement.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.IfStatement) <0x0005d>
at Jint.Expressions.IfStatement.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.BlockStatement) <0x000b4>
at Jint.Expressions.BlockStatement.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.ForEachInStatement) <0x00377>
at Jint.Expressions.ForEachInStatement.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.BlockStatement) <0x000b4>
at Jint.Expressions.BlockStatement.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.IfStatement) <0x0005d>
at Jint.Expressions.IfStatement.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.BlockStatement) <0x000b4>
at Jint.Expressions.BlockStatement.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.BlockStatement) <0x000b4>
at Jint.Expressions.BlockStatement.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.Native.JsFunction.Execute (Jint.Expressions.IJintVisitor,Jint.Native.JsDictionaryObject,Jint.Native.JsInstance[]) <0x0008f>
at Jint.ExecutionVisitor.ExecuteFunction (Jint.Native.JsFunction,Jint.Native.JsDictionaryObject,Jint.Native.JsInstance[],System.Type[]) <0x0033c>
at Jint.ExecutionVisitor.ExecuteFunction (Jint.Native.JsFunction,Jint.Native.JsDictionaryObject,Jint.Native.JsInstance[]) <0x0001b>
at Jint.JintEngine.CallFunction (Jint.Native.JsFunction,object[]) <0x00066>
at Jint.JintEngine.CallFunction (string,object[]) <0x00094>
at MagmaPlugin.Plugin.Invoke (string,object[]) <0x0002b>

[9/7/2014 12:56:28 PM] [Exception] [ AnticheatModule->takeCoordsEvent | Timer->Callback | ]
System.NullReferenceException: Object reference not set to an instance of an object
  at Fougerite.Player.get_Name () [0x00000] in <filename unknown>:0
  at Anticheat.AnticheatModule.takeCoordsEvent (System.Object x, System.Timers.ElapsedEventArgs y) [0x00000] in <filename unknown>:0
[9/7/2014 12:56:29 PM] [Exception] [ AnticheatModule->takeCoordsEvent | Timer->Callback | ]
System.NullReferenceException: Object reference not set to an instance of an object
  at Fougerite.Player.get_Name () [0x00000] in <filename unknown>:0
  at Anticheat.AnticheatModule.takeCoordsEvent (System.Object x, System.Timers.ElapsedEventArgs y) [0x00000] in <filename unknown>:0
[9/7/2014 12:56:30 PM] [Error] [MagmaPlugin] Error invoking function TPAJobTimerCallback in TpFriend plugin.
[9/7/2014 12:56:30 PM] [Exception] [ Plugin->Invoke | Plugin->OnTimerCB | TimedEvent->_timer_Elapsed | Timer->Callback | ]
System.NullReferenceException: Object reference not set to an instance of an object
at Fougerite.Player.get_SteamID () <0x0002a>
at (wrapper dynamic-method) Jint.Marshal.ProxyHelper.dynamicPropertyGetter (Jint.Marshaller,Jint.Native.JsDictionaryObject) <0x00029>
at Jint.Native.NativeDescriptor.Get (Jint.Native.JsDictionaryObject) <0x0002a>
at Jint.Native.JsDictionaryObject.TryGetProperty (string,Jint.Native.JsInstance&) <0x00047>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.PropertyExpression) <0x00085>
at Jint.Expressions.PropertyExpression.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.MemberExpression) <0x0003e>
at Jint.Expressions.MemberExpression.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.BinaryExpression) <0x00031>
at Jint.Expressions.BinaryExpression.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.IfStatement) <0x0001c>
at Jint.Expressions.IfStatement.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.BlockStatement) <0x000b4>
at Jint.Expressions.BlockStatement.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.ForEachInStatement) <0x00377>
at Jint.Expressions.ForEachInStatement.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.BlockStatement) <0x000b4>
at Jint.Expressions.BlockStatement.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.BlockStatement) <0x000b4>
at Jint.Expressions.BlockStatement.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.Native.JsFunction.Execute (Jint.Expressions.IJintVisitor,Jint.Native.JsDictionaryObject,Jint.Native.JsInstance[]) <0x0008f>
at Jint.ExecutionVisitor.ExecuteFunction (Jint.Native.JsFunction,Jint.Native.JsDictionaryObject,Jint.Native.JsInstance[],System.Type[]) <0x0033c>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.MethodCall) <0x0042c>
at Jint.Expressions.MethodCall.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.MemberExpression) <0x0003e>
at Jint.Expressions.MemberExpression.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.VariableDeclarationStatement) <0x0003c>
at Jint.Expressions.VariableDeclarationStatement.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.BlockStatement) <0x000b4>
at Jint.Expressions.BlockStatement.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.SwitchStatement) <0x0012f>
at Jint.Expressions.SwitchStatement.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.BlockStatement) <0x000b4>
at Jint.Expressions.BlockStatement.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.IfStatement) <0x0005d>
at Jint.Expressions.IfStatement.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.BlockStatement) <0x000b4>
at Jint.Expressions.BlockStatement.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.ForEachInStatement) <0x00377>
at Jint.Expressions.ForEachInStatement.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.BlockStatement) <0x000b4>
at Jint.Expressions.BlockStatement.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.IfStatement) <0x0005d>
at Jint.Expressions.IfStatement.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.BlockStatement) <0x000b4>
at Jint.Expressions.BlockStatement.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.ExecutionVisitor.Visit (Jint.Expressions.BlockStatement) <0x000b4>
at Jint.Expressions.BlockStatement.Accept (Jint.Expressions.IStatementVisitor) <0x0001e>
at Jint.Native.JsFunction.Execute (Jint.Expressions.IJintVisitor,Jint.Native.JsDictionaryObject,Jint.Native.JsInstance[]) <0x0008f>
at Jint.ExecutionVisitor.ExecuteFunction (Jint.Native.JsFunction,Jint.Native.JsDictionaryObject,Jint.Native.JsInstance[],System.Type[]) <0x0033c>
at Jint.ExecutionVisitor.ExecuteFunction (Jint.Native.JsFunction,Jint.Native.JsDictionaryObject,Jint.Native.JsInstance[]) <0x0001b>
at Jint.JintEngine.CallFunction (Jint.Native.JsFunction,object[]) <0x00066>
at Jint.JintEngine.CallFunction (string,object[]) <0x00094>
at MagmaPlugin.Plugin.Invoke (string,object[]) <0x0002b>

[9/7/2014 12:56:30 PM] [Exception] [ AnticheatModule->takeCoordsEvent | Timer->Callback | ]
System.NullReferenceException: Object reference not set to an instance of an object
  at Fougerite.Player.get_Name () [0x00000] in <filename unknown>:0
  at Anticheat.AnticheatModule.takeCoordsEvent (System.Object x, System.Timers.ElapsedEventArgs y) [0x00000] in <filename unknown>:0
[9/7/2014 12:56:31 PM] [Exception] [ AnticheatModule->takeCoordsEvent | Timer->Callback | ]
System.NullReferenceException: Object reference not set to an instance of an object
  at Fougerite.Player.get_Name () [0x00000] in <filename unknown>:0
  at Anticheat.AnticheatModule.takeCoordsEvent (System.Object x, System.Timers.ElapsedEventArgs y) [0x00000] in <filename unknown>:0
or this error:
Code:
[9/7/2014 1:18:47 PM] [Console] [Modules] Module ServerTests v1.0.0.0 (by Riketta) initiated.
[9/7/2014 1:18:47 PM] [Exception] [ DataStore->Load | Hooks->ServerStarted | Bootstrap->Start | ]
System.IO.EndOfStreamException: Failed to read past end of stream.
  at System.IO.BinaryReader.ReadByte () [0x00000] in <filename unknown>:0
  at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadNextObject (System.IO.BinaryReader reader) [0x00000] in <filename unknown>:0
  at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObjectGraph (BinaryElement elem, System.IO.BinaryReader reader, Boolean readHeaders, System.Object& result, System.Runtime.Remoting.Messaging.Header[]& headers) [0x00000] in <filename unknown>:0
  at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.NoCheckDeserialize (System.IO.Stream serializationStream, System.Runtime.Remoting.Messaging.HeaderHandler handler) [0x00000] in <filename unknown>:0
  at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System.IO.Stream serializationStream) [0x00000] in <filename unknown>:0
  at Fougerite.Util.HashtableFromFile (System.String path) [0x00000] in <filename unknown>:0
  at Fougerite.DataStore.Load () [0x00000] in <filename unknown>:0
 
Last edited:

mikec

Master Of All That I Survey
Administrator
Jul 12, 2014
296
152
28
Los Angeles, California, USA
So, seems in yours:
in official
and, Fougerite.cfg is located in
in official
(which replaces the need for the fougeritedirectory.cfg as they are combined.)
It also removed the ability of the server admin to change Fougerite.cfg at GSP since rust_server_Data\ is not public. I split the cfg files for that reason. They've always been split in my builds.

rust_server_Data\FougeriteDirectory.cfg is for the GSP to set a public folder and a private folder for the modules. The public folder should be where the game server save files are. If you have full server access set the folders to whatever you like, or don't use FougeriteDirectory.cfg. If it's not there Fougerite will use %ServerRoot%\Modules for ModuleFolder and %ServerRoot%\Save for PublicFolder.

Fougerite.cfg is looked for in the PublicFolder. If it isn't there, Fougerite will still load, but no modules will be loaded and not much will happen.

In the [Modules] section you can enable and disable Modules to load: module=folder
If you'd rather have Rust++ use %ServerRoot%\save\rustpp then change it. I like to use Rust++ for the folder.

Oh and don't mind this server crashing bug that freezes everything by spamming console with this error practically DDOSing itself:
Code:
[9/7/2014 12:56:27 PM] [Exception] [ AnticheatModule->takeCoordsEvent | Timer->Callback | ]
or this error:
Code:
[9/7/2014 1:18:47 PM] [Console] [Modules] Module ServerTests v1.0.0.0 (by Riketta) initiated.
[9/7/2014 1:18:47 PM] [Exception] [ DataStore->Load | Hooks->ServerStarted | Bootstrap->Start | ]
System.IO.EndOfStreamException: Failed to read past end of stream.
Those are actually related. If you want to disable Anticheat and/or ServerTests, edit Fougerite.cfg and remove them or comment them. If you want a pure Magma experience, comment or remove everything from the [Modules] section except MagmaPlugin. It's up to you what to use or not use. You can also set all the logging and debugging off. There is no need to complain about console spam. Just turn it off. That's why Fougerite.cfg is in the public area.

Code:
;Anticheat=Anticheat
;ServerTests=on
Anticheat adds Vector3 objects to the DataStore. This isn't a problem until something calls DataStore.Save(). Vector3 can't be serialized like other .Net objects, and the result is that the DataStore.ds save file becomes corrupt. This leads to weird sharing or read-beyond-end-of-file exceptions. I've been testing a fix for this and it will make it into the next MC release.
 

CorrosionX

Plugin Developer
Plugin Developer
Sep 3, 2014
212
85
18
California
Regarding Rust++
So, when the server restarts, any /addadmin and /addflag people get's removed/ or is temporary. Doesn't actually get saved to admins file. However, the first default admin you set works just fine and actually saves, thankfully.
 

CorrosionX

Plugin Developer
Plugin Developer
Sep 3, 2014
212
85
18
California
Unsure if this is a bug, but:
Code:
ini.AddSetting("Settings", "RefundPlayer", true);
ini.AddSetting("Settings", "EvilMode", false);
Gets added into ini file like:
Code:
RefundPlayer=True
EvilMode=False
With capital first letters, thereby messing up any == true/false later on when used.
 

Jakkee

Plugin Developer
Plugin Developer
Contributor
Jul 28, 2014
1,465
925
113
Australia
Unsure if this is a bug, but:
Code:
ini.AddSetting("Settings", "RefundPlayer", true);
ini.AddSetting("Settings", "EvilMode", false);
Gets added into ini file like:
Code:
RefundPlayer=True
EvilMode=False
With capital first letters, thereby messing up any == true/false later on when used.
This doesn't happen to me and im running the latest.
 

mikec

Master Of All That I Survey
Administrator
Jul 12, 2014
296
152
28
Los Angeles, California, USA
Looks like we cast to string when saving. Makes sense, since we use TextWriter.
JavaScript:
ini.AddSetting("Settings", "RefundPlayer", true);
ini.AddSetting("Settings", "EvilMode", false);
RefundPlayer=True
EvilMode=False
Well, if the case of the values returned from ini.GetSetting() is causing your plugin to error, then you were doing a string comparison. But you aren't saving string types, you're saving bool types. If you save them as strings "true" and "false" the case is preserved.

Would you like to have GetBoolSetting() which returns boolean true if the key.ToLower() == "true", and returns boolean false otherwise? Then you could write cleaner tests:
JavaScript:
var evil = ini.GetBoolSetting("Settings", "EvilMode");
if(evil) {
   DoEvil();
}
This doesn't happen to me and im running the latest.
Interesting. Are you putting "true" and "false" in quotes when adding to the ini?
JavaScript:
function On_PluginInit() {
    var ini = Plugin.CreateIni('Test');
    ini.AddSetting('Test', 'foo', true);
    ini.AddSetting('Test', 'bar', false);
    ini.Save();
}
Code:
[Test]
foo=True
bar=False
 
Last edited:

CorrosionX

Plugin Developer
Plugin Developer
Sep 3, 2014
212
85
18
California
I can't patch .dll files.Any ideas why?
Message me on Steam: CorrosionX
I'll help you out.

Looks like we cast to string when saving. Makes sense, since we use TextWriter.
Well, if the case of the values returned from ini.GetSetting() is causing your plugin to error, then you were doing a string comparison. But you aren't saving string types, you're saving bool types. If you save them as strings "true" and "false" the case is preserved.

Would you like to have GetBoolSetting() which returns boolean true if the key.ToLower() == "true", and returns boolean false otherwise? Then you could write cleaner tests:
JavaScript:
var evil = ini.GetBoolSetting("Settings", "EvilMode");
if(evil) {
   DoEvil();
}
This would be make sense, and would be more cleaner, as was stated. Still learning the syntax. I got the API pretty well down. Thanks for your help as always. Updating my plugins :)
 
Last edited:

mikec

Master Of All That I Survey
Administrator
Jul 12, 2014
296
152
28
Los Angeles, California, USA
I like doing easy stuff that makes people happy. :cool:
C#:
    public bool GetBoolSetting(string sectionName, string settingName)
    {
        return this.GetSetting(sectionName, settingName).ToLower() == "true";
    }
 
Status
Not open for further replies.