For questions not covered in this guide, please use the Q & A website: http://mmokit.net/
unofficial japanese translation by かなた
MMO Starter Kit 1.8 Documentation
Testing with 2 players in the editor
Transferring assets from another project
Customizing the player character
Creating items, quests and abilities
Customizing item quality tiers
Adding your own persistent stats
Creating your own draggable windows
Running the server on your local computer
Dedicated Server and Packaging
Setting up dedicated server on a VPS
Transferring the server to a VPS
Crashes, game not launching or not compiling
I would love to thank and give credit to the following:
VaRest Plugin - Vladimir Alyamkin (Ufna)
LoadingScreen Plugin - Nick Darnell
The authors of the free assets that are used in the demo:
Sword Girl model (used only on the demo server, not distributed) - Bunt Games
Inventory icons - Ravenmore, Flare icons
Icons for abilities and empty slots - game-icons.net
Inventory sounds - qubodup, Akeroyc
Healing spell sound - qubodup
Spell particles, fire spell sounds - official UE4 demos (ContentExamples and FeaturesTour2014)
Female voices - AderuMoro, MadamVicious
Male voices - Michel Baradari
You will need Visual Studio 2015 and a source-built version of UE4. If you don’t have the source-built engine yet, follow the official instructions here: https://www.unrealengine.com/ue4-on-github
Important: Download the “release” branch since it’s the most stable one: https://github.com/EpicGames/UnrealEngine/tree/release
This guide is for UE4 version 4.14
Once you have built the editor, you can open the project by clicking on the blue .uproject file in MMOStarterKit-1.8/ folder:
NOTE: Don’t place the project on the desktop or inside a deep folder structure, since it has been known to cause build errors. A good path example: D:/MyGame/ |
The editor will tell you that the project was built with another version, click “Yes”:
If it fails to convert, right-click on the blue .uproject icon in the folder with the project and choose "Switch Unreal Engine version", choose your source-built engine, then right-click again and choose "Generate Visual Studio project files".
You will need a webserver with PHP 5.5+ and mysql, it can be the same server where you host your website. If you already have a hosting provider, you can check its documentation or control panel to see if you have PHP 5.5+, or contact their support.
These hosting providers have been reported to have PHP 5.5+, however this list is by no means exhaustive:
binero.se (Swedish)
spaceweb.ru (Russian)
Not recommended: godaddy.com - because of the php time limit, this hosting provider doesn’t work well with the uploader/launcher that comes with MMO Kit
You don’t need a paid domain name to work with MMO Kit.
NOTE: PHP 5.5+ is required because of the new encryption methods, if you really want to use an older version of PHP, you can modify the password hashing in mmoregistration.php and mmologin.php. However, it is not recommended. |
The following instructions assume you already have a hosting provider:
NOTE: Most hosting providers use the same server for the database and the php so don’t replace ‘localhost’ unless you are sure it doesn’t work with it. |
http://yoursite/somefolder/myphpversion.php
If the reported version is 5.5+, proceed to the next step.
http://yoursite/somefolder/mmologin.php
If it says {"status":"Login information is incorrect. Check your username and password."} this means the script is working fine, good job!
If it says Connection failed or Access denied, double-check the database connection info that you filled in step 2
If instead it displays raw php code (with <? and such), this means that the php scripts don't execute properly on your webserver.
NOTE: Don’t delete this first character. It will have the “id” 0 in the database and when playing in editor, the game assumes you have logged in as this character with id 0. This allows you to fully test everything in PIE - saving/loading of position and stats, inventory items, etc. If you do need to delete it, set the “id” of some other character to 0 - it will be the new character that’s used when playing in editor. |
You can play the game in the editor as 2 players. Make sure that there are characters with ids 0 and 1 in your MySQL database and set the number of players to 2:
If you want to concentrate on customization and gameplay first, you can skip this for now.
Follow the steps below if you want to configure the full MMO Starter Kit demo setup (launcher/patcher, dedicated server on Softlayer or other VPS):
If you are new to UE4, you can follow multiple tutorials that are available on the official website: https://docs.unrealengine.com/latest/INT/
Here are the tutorials that deal with networking and UMG, parts of UE4 that are heavily used in MMO Kit:
Blueprint Networking: https://www.unrealengine.com/blog/blueprint-networking-tutorials
UMG (creating user interface): https://docs.unrealengine.com/latest/INT/Engine/UMG/QuickStart/index.html
Here’s a quick map of some of the more important blueprints. The color corresponds to the node block color.
B. If you want to create a map from scratch: Create the map as you would normally.
.
Note: If when you play in editor, your character (the one with id 0) falls through the ground, use /unstuck chat command.
This guide assumes you have the following animations for your model: idle, walk, jumpstart, jumpend, jumploop, combat idle, attack, and death. If you don’t have them all, everything will still work but the t-pose will be displayed in place of the clip that you haven’t specified.
NOTE: The animations should be without root motion.
NOTE: make sure your skeletal mesh has a Physics Asset specified. It is required to be able to click on dead characters. You can create a Physics Assets by right-clicking on a Skeletal Mesh and choosing Create > Physics Asset.
This guide assumes you have changed your player character successfully and now want to change the inventory doll accordingly.
If you want the characters be highlighted on mouse hover, the material of your character’s mesh needs to have a scalar parameter “Highlight Amount” - the highlight effect is up to you, for example you can add an emissive color. If you would like to know more about this you can check out the GuyMaterial located in MMO\NewCharacter. Note that player’s own character is not highlighted on mouseover, only other players and NPCs are.
Chance Of Sound variable determines how often the pain and attack sounds will be played (death sound is always played).
To customize the NPCs you will need to follow the same steps used earlier when learning how to customize the player character. The only difference will be instead of inheriting from ModularPlayerCharacter blueprint you would inherit from RoamingCharacter blueprint located in MMO/AI/Roaming.
After you’ve created your new NPC, you can place it on the map and it will appear in game.
In this example I will create a new item type called Book that derives from regular item (ItemData) class. It will have one additional field used to store the book’s text.
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Item)
FText Description;
public:
I renamed it like this:
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Book)
FText BookText;
After that you will be able to create a Book asset with 1 additional Text field.
If you want to edit multiple NPCs or items at once or if you want to edit them individually but there is a lot of them, use the property matrix:
NOTE: in property matrix you can sort the assets by any property by pinning the property so it shows up in the table and clicking on the column name.
Persistent stats are saved to the MySQL database when the character logs out and retrieved by server when the character logs in. Examples of persistent stats already in the demo are: character name, health, position, equipped helmet. You could add your own stats, such as: character haircut, skin color, money, etc. Here’s how to do this:
NOTE: when editing php scripts, make sure your prepared statements’ syntax is correct. The number of ‘?’ in the query and the number of “s” or “i” letters should be the same as the number of variables after them. Example: $stmt->bind_param("ssss", $health, $posx, $posy, $posz);
NOTE: When you modify the stats in game, make sure you’re doing it on the server, since it’s the server that will send them to the database.
This guide will show you how to create your own draggable windows that can gain focus and appear on top of others just like the Inventory/Equipment windows in the demo.
NOTE: I intend to make this a bit easier in the future, but decided to provide the guide for the current version nevertheless:
Q: Why do we have a Canvas panel as the root for the draggable window widget and not the window itself?
A: This way the window can have popups that exceed the window’s own borders.
NOTE: if you want to set up a server that will run 24/7, you could look into ordering a virtual server.
A game has to be packaged in order to be able to run without UE4 editor. A console dedicated server is needed in order to run your game on a virtual/bare metal server (for example, Softlayer or Amazon) which normally have no video cards and to maximize performance.
NOTE: If you don’t have this option, make sure you’re using a source-built version of Unreal. If you have a source-built engine, but there’s still no “Development Server” option in VS, check that the project uses the right engine. You can do that by right-clicking on the .uproject file and selecting “Switch Unreal Engine version” |
NOTE: normally you only have to do a Full Rebuild the first time and if you port the project to a new UE4 version. |
In order for the clients to be able to connect to your dedicated server, you need to specify the server IP address in mmogetserver.php. Find this text “'address'=>” , and specify your ip address there.
NOTE: when connecting remotely, there should be no -local parameter in the client or server shortcut (so the address from mmogetserver.php will be used). |
To remove the default players limit, in your project folder open file Config\DefaultGame.ini and add these lines on top (where 100 is the desired number):
[/Script/Engine.GameSession]
MaxPlayers=100
At some point you will want to have a server that is online 24/7 and doesn’t interfere with your other activities on your computer. You can maintain this server yourself on a dedicated machine or order it from a hosting provider of your choosing. This guide explains how to order and set up a virtual server on Softlayer, where MMO Starter Kit demo server is being hosted (E5520 Xeon @ 2.27 GHz, 1GB RAM). You can safely skip it if you already have a VPS or want to use a different provider.
NOTE: while MMO Starter Kit demo is currently being hosted on Softlayer, it’s not the cheapest hosting provider. I recommended it to new users because of 24/7 chat support and very fast deploy times. For most of my servers I’m using a different provider, ipserver, i7 4790k for $79/month. |
1. Archive and upload to your favorite cloud (for example, Dropbox) the following :
2. Order a Softlayer virtual server with Windows Server OS through www.softlayer.com . You can order an hourly server first to test things out, and if everything is fine, order a monthly server.
The lowest virtual server configuration is enough for small-scale testing, though you might want to increase the disk space. With a 25 GB hard drive you will have only around 2.5 gb free space with the fresh Windows install.
When determining which data center to use - if your users are from Europe you could use Amsterdam, and you could choose Dallas for the US. MMO Starter Kit demo server is hosted in the data center in Washington to provide decent ping for Europe and the US both.
You could check the stats at https://wondernetwork.com/pings to have an estimate at what your users' ping will be.
If you have PayPal, you can pay with it instead of a credit card, then your order will be processed instantly. Credit card orders can take longer or even fail if your bank requires a special verification. The website says your order will be processed within 15 minutes. If you don't receive an email from Softlayer in 15-30 minutes, you can contact their live chat directly - usually they answer immediately 24/7.
3. Once your order has been approved, you'll receive your login and a temporary password, log in and change the password to a permanent one.
4. Wait until you get the email saying the server has been provisioned and is ready to use.
NOTE: This guide is for Windows Server VPS. While UE4 dedicated server can work on Linux, I don’t provide support for Linux servers currently. If you choose to go with Linux for the dedicated server, keep in mind that you will have to package the game twice each time you package. |
1. Upload your packaged game and the chat server to a cloud of your choice (for example, Dropbox)
2. In Windows, Run > Remote Desktop Connection. Use the ip address, username and password of your VPS for the remote connection. If using Softlayer, to get the ip of your VPS go to control panel, then to Devices, and double click on your server.
3. On your VPS, open up Internet Explorer and go to the cloud where you’ve uploaded the game files. Download all the files that you've put there.
4. On your VPS, install the prerequisites located in your game’s folder Engine\Extras\Redist\en-us.
5. Start the chat server and the dedicated server on the VPS.
6. Copy the ip of your VPS to mmogetserver.php script.
Done! Try to run the game as a client (using the .exe from your packaged game folder) and see if it connects to your new server.
NOTE: after ordering a VPS server, I recommend to always make sure that the plan in Control Panel - System and Security - Power Options is set to High Performance. Otherwise with some processors (for example i7 4790k) it may result in the CPU being underclocked. |
There’s a separate documentation for the Launcher, you can find it here.
Important! Make sure you have backed up your work or are using version control before proceeding.
If you decide that you don’t need the demo “desert map” in your project, you can remove it to reduce the project’s size:
1) Delete the map itself, Maps/DesertRallyRace
2) Remove all the meshes and effects from the Start Map
3) Delete the DesertRallyAssets/ and StarterContent/ folders.
Q: Why does the engine have to be built from the source?
A: You can only build a dedicated server when using the source-built version of UE4. It's not specific to MMO Starter Kit, it's like that for all UE4 projects
Q: Which ports does the server use?
A: The game server uses the default Unreal 7777 port (UDP), and the chat server uses the port 3457 (TCP).
Q: Are you planning to release the girl model used in the demo?
A: The sword girl model is not by me, it’s by Bunt Games and can be found on Unity Asset Store
Q: Are the future updates going to be free? How can I get them?
A: Yes, all updates will be free and available for download automatically to all customers.
Q: What version control system can you recommend?
A: I’m using Git without the integrated features, just regular Git, SourceTree and GitLab that I host on Linode. Levels that are bigger than 100 MB are shared via Dropbox. I believe that’s the way to go for teams that have 1-4 people working with the editor.
Q: How can I rename the project?
A: I haven't tried renaming the project yet, it's not trivial for code projects in UE4. Here are the instructions posted by UE4 staff member:
https://answers.unrealengine.com/questions/242407/renaming-a-c-project.html
Q: How can I have different armor meshes and/or animation for different gender/class/race?
A: You could add a bool variable isMale to the character blueprint and in variable settings set Replication - RepNotify. In its OnRep function it can go over all equipment and change it to the correct version with SetSkeletalMesh node. CanExecuteCosmeticEvents node can be used to only execute that on the client. The Equipment class should have an additional field for FemaleMesh. When an item is equipped, it uses a Select node + IsMale to determine whether to set female mesh or male mesh.
For different character classes/races you can use the same principle, just a enum instead of a bool. You can also change the animation blueprint by using SetAnimInstanceClass node.
Q: How to ban players?
A: You can handle bans entirely in php - in the ‘users’ table create a new column - bool “isBanned”. Change mmologin.php so it doesn't allow users with isBanned == true to login.
Note that you will also have to change mmoregistration.php, the INSERT query that creates the new user, since the amount of columns in 'users' has changed
Q: How to only allow certain accounts into the game (closed beta testers, customers who’ve purchased the game...)?
You can use one of these two options:
A) distribute game keys, let the user enter the key at registration along with username/email, and check if it’s valid. For example you can make a new “keys” table in your MySQL database, with fields: id, key(varchar) and activated(bool). Add some keys to it manually or using import. Mmoregistration.php should check if the key provided by the user is in the “keys” table and not activated yet. Once a user registers using the key, set “activated” = ‘true’ for that key.
B) you can get Greenlit on Steam and distribute/authorize through Steam. If you’re Greenlit, it is possible to distribute the game through Steam to closed beta testers while not in Early Access yet.
Q: Why do you have several “character” blueprints?
A: MMOCharacter is the base blueprint that both AI characters and players derive from. Modular character blueprint (ModularPlayerCharacter) is not needed if your game doesn't need modular equipment. And MyCharacter is a base movement and camera blueprint almost without any mmo functionality.
Q: How can I persistently store world data, for example player structures?
A: You can save the world data to MySQL database in the same way the character data is saved. You would have to create a new php script similar to savecharacter.php, and handle sending the request in MMOPlayerState blueprint. In MMOGame or some other server blueprint you can set use a Set Timer Delegate node that will call the request every 5 mins or so.
Q: I don’t want the player’s character to destroy immediately on logout. How would I achieve that?
A:
if (GetPawn() != NULL)
{
GetPawn()->Destroy();
SetPawn(NULL);
}
so you can just copy it and comment out the destroy line
3. In the editor, change the parent of MMOPlayerController to your new class
Q: How can I implement travel between zones?
A: In the game I’m working on we use this system: each physical server has several mmo kit dedicated server processes running, one for each zone, each uses a certain fixed port: 7777, 7778, 7779, etc.
For example you could have server shortcuts with these parameters: “PlainsMap -log -port=7777”, “ForestMap -log -port=7778”:
To transfer between server processes, when a player walks into a trigger volume, OpenLevel blueprint node is called on the client with the correct zone's ip and port. Example:
To travel between levels locally (while not connected to a server), you can call Open Level node with the name of your level instead of ip:port, for example “MyNewMap”.
When the client enters world, it should connect to the server process with the zone they last logged off. To do that, you could add a “map” column to the “characters” table in the database and save the map along with other character info (in MMOPlayerState blueprint, CreateSaveCharacterRequest). When the cleint gets the list of its characters with name, level, etc, it should also receive the map and use it to connect to the right server.
After the connection, when the server retrieves the character data from the database (MMOPlayerState blueprint, OnResponseGetCharacter), , it should also receive the map and compare it to the map this server is running. If the map is the same, it means the player has returned from being offline, so the location from the database should be used (the current default behaviour). If the map is different, it means the character has travelled from another map and should be placed at some portal or gate location.
Q: What about instanced zones (instanced dungeons, battlegrounds)?
A: For instanced zones, you would use the same principle but launch the server instances dynamically (you could extend C# chat socket server source code to do that). The game server could send a command to the socket server and the latter would launch the server process with required map parameter and the next available port parameter and send back the port number. The port number is then sent to the players via blueprint so they can connect to the new instance.
Q: How can I have different PvP rules per zone?
A: It is definitely possible. I can see two main features that you would have to add (in blueprints):
1. Different PvP rules per map: the easiest way is to create an bool or enum "PvPMode" in your main GameMode and set the default value, for example "Safe Zone", then create a GameMode derived from your main GameMode and set PvPMode in it to something different, for example "Enabled". Note that GameMode only exists on the server, but you probably need that info on the client as well for some visual effects - for that you can send the map's PvPMode value from the server to the client when the client joins the map.
2. Zone travel - see zone travel question above
Q: How can I implement a no-target combat system?
A: If you know how to make a no-target combat system in a single player UE4 project, it shouldn't be hard to add that to the MMO Kit in place of the default system. You could use Line Trace For Objects for weapons that use crosshair (the line would start at the center of the screen and go forward in the camera direction, its length would be the gun's range) and Sphere Overlap Actors for weapons that don't.
There are tutorials available on the web/YouTube on how to make a simple FPS setup in UE4. I recommend making your system work in a clean TPP/FPP project first, and then transfer it to MMO Kit.
The blueprints that you’d want to change are:
MMOPlayerController - Right-Mouse Button event starts auto-attacking
MMOCharacter - Auto-Attack event
Q: When running the game in editor, the loading screen doesn’t go away
A: Make sure that Run Dedicated Server is checked in the play settings:
If it is checked and the loading screen still doesn’t go away, most likely the error is with your php/mysql, you can check the Output Log (Window - Developer tools - Output log) for the exact error.
If you have a completely black screen (not the one that says “loading”), check that there are no UE4 server processes running in the background.
Q: I can’t connect to my remote dedicated server. The IP address in mmogetserver.php is correct. I can connect just fine when I play in editor or when I run a local dedicated server and use -local parameter on the client.
A: Open your latest server log located in Saved/Logs and search for “Join request”.
If you’ve found a “Join request” in the log:
Most likely the server and client are running different versions of the game. Reupload the packaged game folder to the server and client.
If there was no “Join request” in the log:
Check your firewall settings on your local machine and on the dedicated server machine. You can temporary disable the firewall altogether to quickly see if it was indeed the issue (just remember to turn it back on after that!) If disabling it helps, check that the 7777 and 7778 UDP ports and the client and server UE4 applications are not blocked. If disabling the firewall doesn’t help, try pinging your server ip from the command line - see if you can ping your server at all.
If you’re hosting the dedicated server yourself, check the IP in the server console. If the IP is private (starts with 192.168. ), most likely you are behind a router.
Q: When running the game in editor, I get a crash after I choose a character and try to enter world
A: You can’t enter world from start menu when running in editor. You can package the game to fully test it locally but normally I only do packaging before releasing a new patch to the end users.
Q: When I try to launch the server .exe, I get multiple errors that start with “Error: CDO Constructor”
A: Make sure you’ve packaged the game and copied the server.exe to Binaries folder of the packaged game (where the client .exe is). You should launch the server from that folder, not from the project folder.
Q: I tried to run the packaged game (or server) on another machine and it doesn’t launch at all
A: First of all, make sure you’ve transferred the whole packaged game’s folder (WindowsNoEditor/).
To be able to run UE4 games you have to install the UE4 prerequisites first, located in the packaged game’s Engine/Extras/ folder.
Q: When compiling the project, the compile fails with this error: Cannot open include file: 'windows.h': No such file or directory
A:
1) Make sure that your Windows user name doesn’t contain any special characters.
2) Make sure you’ve included C++ in your installation of visual studio 2015. You can check this by going to Control Panel -> Programs and Features. Select "Microsoft visual studio community 2015", press change , press modify in the installer and look for C++ and hit install.
3) If the steps above didn’t work, try reinstalling Windows SDK: https://msdn.microsoft.com/en-us/windows/desktop/bg162891.aspx
4) Another possible solution: go to Control Panel\System and security \ System -> Advanced system settings -> Environment Variables. Under "System variables" check if "Path" variable has "C:\Windows\System32;C:\Windows\SysWOW64" , if it doesn't, add it
Q: When I open your project in Unreal version *.xx, it crashes
A: Are you using the latest stable version? The “sneak peek” versions and branches can have unexpected behaviour, I recommend you use the latest stable version of Unreal Engine.
Q:When I switch levels, the game crashes with this error: “X not cleaned up by garbage collection!”
A: If you haven’t modified anything in the demo project, check the first question in this section instead. Make sure your persistent classes such as GameInstance(MMOInstance) have no references to the actors in the previous level. Check the log for the information on which classes to look for. You can clear the references by setting them and not attaching anything to the set node. Also, when you create UMG widgets, add to them to an array and destroy the widgets in that array before loading a new level.
Q: The game crashes with BSOD/system reboot, what to do?
A: This is a hardware error, most probably your video card overheats. It can be fixed by running the game with shortcut parameter -VSync (Unreal doesn’t use VSync by default so your frame rate can go very high which can cause the video card to overheat). If it still crashes, but you can play for a few minutes, try entering in console in game: t.maxfps 30, that will set the max fps even lower. If the crash happens right when you start the game, you will have to add t.maxfps=30 to an .ini file instead.
Q: Most people can run the game fine, but a certain customer/tester always gets a crash when trying to launch the game.
A: Let this person try to launch some of UE4 demos: http://www.techpowerup.com/downloads/2369/unreal-engine-4-five-tech-demos/
If the demos launch fine, then probably the antivirus is blocking the game. In this case, usually no error will be thrown, no logs will be created. Try disabling the antivirus.
If the problem persists with the demos, this means it’s not related to your game, and most likely has to do with the videocard / videocard drivers. Known causes:
Q: How do I check if my PHP server is 5.5 or higher?
A: Upload the myphpversion.php found in PHP/ folder of the kit to your webserver to the same folder where you’ve put the other php scripts. Run the script from browser, it should output something like:
Current PHP version: 5.5.16-pl0-gentoo2.0
Q: Everything looks low quality/like the resolution is very low, how to fix this?
A: Setting Resolution Scale to 100% should help:
Q: Where is <some functionality> done in blueprints? I can’t find it.
A: You can ask me on PM/Skype/forum thread, however I recommend you use Edit > Find in blueprints feature to save some time. For example you could search for "Create Widget" to find where the UI is created. :) Note that this search doesn't include level blueprints, except for the currently open level.
Q: When a player character dies, it falls through the terrain
A: Check Using your own map step 6.
Q: I’ve made some changes and now Unreal crashes on play/startup. How do I fix this?
A: First of all, you really should use version control in the future to avoid situations like that. I use regular non-integrated Git and SourceTree.
If you don’t have version control, there are autosaves in Saved/Backup and Saved/AutoSaves folders - if you know what blueprint causes the crash, you could look there to restore an older version of it.
If you don’t know which blueprint causes the error, you could move all of the blueprints from the project folder to a separate folder and check if the error persists. Then move half of them back, etc until you narrow it down.
Q: I walked off the edge of the map and now my character falls when I play in editor
A: In your mysql database, in ‘characters’ table find the character with id 0 and set their posx, posy and posx to some appropriate coordinates in your map.
Q: My inventory item/ability textures show as white sometimes
A: Hi, all item icons should be placed in the same folder as the demo item icons (/Game/MMO/Textures), since they are loaded from that folder when the game starts. (UE4 doesn't load textures which are not referenced automatically, and item icons are not referenced when the game starts)
If you want to change that folder, change this node in MMOPlayerController:
Q: When testing things in editor, I can’t seem to block the controller movement/mouse look in Start map (the one with the login menu). SetIgnoreMouseInput and SetIgnoreMovementInput don’t work.
A: Make sure you are running the starting map with Dedicated server turned off and 1 player.
Q: One of my PHP scripts is not working, how do I find the error?
A: After each VaREST request the response is written to the UE4’s Output Log (Window - Developer tools - Output log). There can be three possible situations here:
a) If the response code is 200, this means the php script is working fine:
b) If the response code is not 200, it will usually also list your php version. If the php version is lower than 5.5, you need to upgrade your php server.
c) If the response code is not 200 and the php version is 5.5+, you have to look for your php error log - it’s location can vary depending on your hosting, some of the hosting providers allow you to access this log from the control panel, others allow ftp access.
If you’ve written the new php script yourself, you can also use the online php checker to check it for syntax errors.