There are two different types of "flags", server and player. These are great for storing numerical data; however, they are not unlimited. This is where INI's come in handy. An INI file stores both long (numerical) and string (text) data within a .ini file on the server host's computer. The first thing when making an INI is obviously the way to record information. WriteIniStr(Filename AS String, Header AS String, Name AS String, Data AS String) You have four parameters as you can see, Filename, Header, Name, and Data Filename is the name of the file itself on the server host computer Example: If you have named your file "Zeus", it would be Zeus.ini on the host comptuer. You only have to remember "Zeus", not Zeus.ini With all these parameters, you must have quotes around the call-ups. The last three parameters are all things inside the INI file Header and Name is a method of sorting data Let's say I wanted to keep track of the Health and Energy of two different players in the same INI. We'll pretend this is in a Loop as well, so Loop will be the players targetted WriteIniStr("Zeus" AS String, GetPlayerUser(Loop) AS String, "HP" AS String, GetPlayerHP(Loop) AS String) WriteIniStr("Zeus" AS String, GetPlayerUser(Loop) AS String, "Energy" AS String, GetPlayerEnergy(Loop) AS String) If this was done on two different players, let's say their usernames are "Slasher" and "Mars". You would have four pieces of data in the same file: Slasher's HP, Slasher's Energy, Mars's HP, and Mars's Energy This is as recorded at the time the script was run and the INI was modified Data is what you want to be recorded in the file that will be called by one of the "ReadIni"s "Header" and "Name" should be labeled as something you will need to search by. Never make "Header" and "Name" something that could change. Example: Never make "Header" or "Name" as GetPlayerHP(Player) So you may have a number that you want to be given to a player in a PlayerMessage, but since PlayerMessage uses Strings, you want to use a String, not a Long. Here's how they work. Let's do ReadIniInt for now ReadIniInt(Filename AS STRING, Header AS STRING, Name AS STRING, Default AS LONG) You can guess the first three I'm sure but the last one isn't exactly clear. What you want to enter in for default is what will happen if there is no data under where you're searching, or if the data is invalid (perhaps it has letters or symbols when you specifically want a number) So using the previous example, let's say I want to search through every player's HP that was recorded before, and let's say that Mars, Slasher, and Solid are online and are included in the following Loop: ReadIniInt("Zeus", GetPlayerUser(Loop), "HP", 0) Mars and Slasher will return whatever you recorded, but Solid will return a 0. If you wanted one specific player for whatever reason, you could do something like ReadIniInt("Zeus", "Slasher", "HP", 0) Now let's say that you only need one parameter for your ini, in the sense that... let's use favorite color. You want an ini that will record a player's favorite color for some reason. So, for filename you might put FaveColor, and for Data you know you'll have whatever the favorite color the player gives is, but what will Header and Name be? One of them will obviously be GetPlayerUser(Player) On that note, GetPlayerUser is what you'll almost always use, not GetPlayerName. since Names can change and Users cannot. In this case, you only really need GetPlayerUser(Player), so the other one you will just keep something simple like "Color". You're required to have all four parameters, even if one of them is useless. So when you have a useless parameter, always make the Header the useless parameter (the one after Filename). It will take up less space this way. So for WriteIniStr, I would make: WriteIniStr("FaveColor", "Color", GetPlayerUser(Player), WhateverColor) We'll assume WhateverColor is a String that's been used earlier to store a color In the FaveColor.ini file, it will look something like [Color] followed by a bunch of useranmes that are followed by a color If you would switch "Color" and GetPlayerUser(Player) in the script, it would look like a bunch of usernames, followed by something like (Color), followed by a color See why that would take up more space? Okay, so now let's say you want to read that. Since the color will be a string, this time you'll use ReadIniStr. ReadIniStr("FaveColor", "Color", GetPlayerUser(Player), "No color given.") This will read off the color, and if there's no data in there, it will return "No color given." For ReadIniStr, the equivalent to 0 (since its numerical only) is "" Two quotation marks with no space between. " " means that there's a space in there, the data is a single space In reality you will rarely use something other than 0 in ReadIniInt or "" in ReadIniStr You've got StrCat, StrCmp, StrFormat, Str, StrLen, InStr, and Val all listed at the top of the mbsc. To be honest, some of these I don't even know what they are because I've never used them (though I could look for examples) StrCat, StrCmp, Str, and Val are all helpful Let's get the easy ones out of the way first. Str turns a Long into a String. Let's say you want to PlayerMessage someone how many HP they have. It would appear as follows: PlayerMessage(Player, str(GetPlayerHP(Player)), Green) Since GetPlayerHP() is a long, this turns it into a string StrLen checks to see how long a String is StrLen("Zeus rules") would return 10 because there are 10 characters: 9 letters and a space InStr checks to see if whatever string you provide has a certain string of letters or words within it. InStr(St1 AS STRING, St2 AS STRING) Let's say you want to see if a Player said the word crendale within their Message, it would look as follows: InStr(Message, "Crendale") If they said "Crendale" in their message it would return the value of 1 If InStr(Message, "Crendale") Then PlayerMessage(Player, "You said Crendale!", Yellow) End If Larger example: function main(player as long, message as string) as long if getplayerflag(player,12) = 1 then if instr(message,"window") then playermessage(player,"Sleeping Man says, ''Amazing! You are indeed worthy of passing. Go on now, before I change my mind.''",grey) opendoor(444,6,0) setplayerflag(player,12,0) main = stop exit function Val() does exactly what Str() does but in reverse. It turns a String into a Long. Obviously this'll only work correctly when the String is numbers StrCat is for combining multiple strings into one StrCmp is for comparing two strings to see if they're equal. An example is: If strcmp(GetPlayerUser(Player), "Slasher") Then In this case, if the player's username is equal to "Slasher" then your script will do whatever in the If I looked up StrFormat but I have no idea what it does.