Jump to content

Search the Community

Showing results for 'make server ubuntu'.

  • Search By Author

Content Type


Forums

  • Announcements
    • Rules & Guidelines
    • Community News
    • Development News
    • Ragnarok News
    • Community Crowdfunding
  • Support & Releases
    • General
    • Scripting
    • Database
    • Source
    • Graphic Enhancements
    • Web
    • Client-side
    • Third Party
    • Projects
  • Discussion & Suggestions
    • Database Discussion
    • Script Discussion
    • Source Discussion
    • Renewal Discussion
    • Archives
  • Community
    • rAthena General
    • Arts & Writings
    • Off Topic
  • International Forums
    • Filipino Support
    • German Support
    • Indonesian/Malaysian Support
    • Portuguese Support
    • Russian Support (Русский)
    • Spanish Support

Categories

  • Server Resources
    • Server Managers/Editors
    • Scripts
    • Source Modifications
  • Web Resources
    • General Website Templates
    • Forum Templates
    • FluxCP Themes
    • FluxCP Addons
    • Other Web/CP Scripts
  • Graphics Resources
    • Sprites & Palettes
    • Maps & 3D Resources
    • Other Graphics
  • Client Resources
    • GRF Files
    • Client Tools
    • Spriting & Paletting Tools
    • Texture & Mapping Tools
    • Editors
    • Patchers

Categories

  • Low Rate
  • Mid Rate
  • High Rate
  • Super High Rate

Categories

  • Records Test
  • Complete Installation Guides
  • Client Guides
    • Data Folder
  • MySQL Guides
  • Database Guides
  • Map Guides

Categories

  • rAthena Forums
  • rAthena Development
  • FluxCP Development

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Location


Server


Github


Discord


Interests


Website URL


Yahoo


Skype

  1. In this section we are going to go through the steps to getting you set up with your very own server computer to run Ragnarok Online (and other games). Requirements : A Computer with at least 128 GB of space & 4 GB of RAM (8GB Recommended). Latest rAthena (Download here) Your own pre-made private client. (Not covered in this topic) Stable Internet connection. Ubuntu Bootable drive. (This guide was made using UBUNTU 22.04 LTS) Download Rufus if you don't have a bootable drive made. (Not Portable) Some time to process all of this information. Replace 127.0.0.1 with your Public IPv4 address. Wired Internet connection Optional Requirements : A Domain name SSL Certificates 32 GB Free Space (we will format it) Windows 10 ISO (x64) PRE-GAME SETUP Very Minimum system requirements : Operating System : Windows 95 to 11 CPU : Pentium II, 400MHz (or better) Memory (RAM) : 128 MB (or higher) Hard Disk Space : 7.2 GB (after system installation) Monitor Resolution : 640 x 480 (or higher) Video Card : Any with 3D Acceleration & at least 16MB on-board RAM Sound Card : DirectSound (or compatible with 3D Sound Effect Support) Internet Connection : 56 kbps (or faster) DirectX : 8.1 (or newer) Recommended System specifications : Operating System : Windows 10 CPU : Intel® Core™ i3-1305U Processor - 10M Cache, up to 4.50 GHz (or better) Memory (RAM) : 2 GB (or higher) Hard Disk Space : 128 GB (after system installation) Monitor Resolution : 1080x 720 (or higher) Video Card : Any with 3D Acceleration & at least 16MB on-board RAM Sound Card : DirectSound (or compatible with 3D Sound Effect Support) Internet Connection : 10 MB/ps (or faster) DirectX : 8.1 (or newer) ...... Now that we got a few things to get us moving let's get started... Section 1 - Installation STEP ONE: Making the Bootable (Rufus booter) i1.1.0 Once you've downloaded Rufus (here if still need) you will run it. You will a simple window with a basic user interface. Simple click "Boot selection" and make sure "Disk or ISO image" is selected. We will continue by clicking "SELECT" and choosing the Ubuntu disk image we downloaded earlier. The "Device" will be the USB drive we're making bootable: The default "cluster size" we'll leave as default. The "Volume Label" is what we will name the USB (optional). With that we're ready to click "START"! Here is what mine looks like at the end of it. STEP TWO: Setting up the OS (Ubuntu 22.04) i1.2.0 Upon booting up, you'll want to select "Try or Install Ubuntu". After this it will load up the start up interface. Follow the linear steps to install your new operating system. (NOTE: Ubuntu Pro is optional) We will do a normal installation for our example. After selecting the driver and location, you will need to create your user account. This is very important as it will contain information used further into the guide. Make sure you can remember your credentials. Getting used to the system will be beneficial for you. For this guide, we will navigate to your app menu located by default in the bottom left corner. STEP THREE: Preparing the Server (Adding Utilities & Libraries) i1.3.0 Here we are going to download a few necessary packages and then we will be able to simply update them whenever we need to using our update and upgrade commands. First thing's first. Let's update & upgrade our system. Type inside your terminal the following command: sudo apt update && sudo apt upgrade -y This will update and upgrade the system. Next we will need to install some packaged to run the server. Still inside the terminal, we will enter the following commands: sudo apt update && sudo apt upgrade -y sudo apt install build-essential zlib1g-dev libpcre3-dev -y sudo apt install libmariadb-dev libmariadb-dev-compat -y sudo apt install software-properties-common apt-transport-https -y sudo add-apt-repository ppa:ondrej/php -y sudo apt-get install php phpmyadmin mysql-server mysql-client git make gcc libmysqlclient-dev zlib1g-dev libpcre3-dev -y sudo apt-get install g++ From here we are ready to download rAthena. (If you have it downloaded manually and have a custom directory already ready for it, go ahead and upload it now. If not, follow these next couple steps to download and set the directory.) In this example, we are going to make the rAthena folder inside our Documents folder so we can find it easily. In your terminal enter in the following command to change to your documents directory: (replace the name with your user.) cd /home/raguser/Documents The terminal should now read something along the lines of: raguser@RagServer:~/Documents$ This is where we will create the rAthena directory. We will pull the rAthena trunk to a custom location we will name using the terminal. To do this we must enter in: git clone https://github.com/rathena/rathena.git ~/rAthena This will now clone the rAthena repository to the directory we specified as rAthena inside the Documents folder. Now we need to update the repo to make sure we have the latest files. Change directory using the cd command and entering in the new folder we just created: cd rAthena And pull the latest updates from the repository to ensure we have the correct version: git pull We now have a fully functional rAthena that is ready to be set up with our packet information, SQL database, our website, and more. In the next section we will cover how to set up the SQL server using PMA (phpmyadmin) right from the desktop browser! STEP FOUR: PMA & SQL (Setting up the database) i1.4.0 Now that we have a fresh rAthena installed, it's time to check MySQL to see if it installed correctly at the start. This may not be installed by default so follow the commands if you don't have it. To check the status of MySQL enter in your terminal the following command: service mysql status This will tell you what the status of your MySQL is. If this fails, install MySQL using: sudo apt-get install php phpmyadmin mysql-server mysql-client git make gcc You will want to select apache2 to install. Now we will have full access to MySQL! We need to start our first launch of SQL to get thigns started. To access SQL enter in: sudo mysql -u root -p This will access MySQL as the root user after you enter the password. (The password is the one you set up earlier when initially installing MySQL) Once authenticated and inside we can create a database and populate it with our server account. Creating the database is done using a few simple inputs. Enter in & modify the following details: CREATE DATABASE ragserver; CREATE USER 'raguser'@'localhost' IDENTIFIED BY 'StrongPassword'; CREATE USER 'raguser'@'%' IDENTIFIED BY 'StrongPassword'; GRANT ALL PRIVILEGES ON ragserver. * TO 'raguser'@'localhost' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON * . * TO 'raguser'@'%' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON * . * TO 'raguser'@'localhost' WITH GRANT OPTION; This created the database 'ragserver' and added 'raguser' to the database with full access. Next we need to make the logs and grant privileges to raguser on it. To do this enter in: CREATE DATABASE log; GRANT ALL ON log.* TO raguser@localhost; Now we can leave by entering in: quit This next part of this step is a little more complicated, but very simple to do. rAthena has a database in their files that we are going to pull the columns and rows from so we don't have to manually construct it ourselves piece by piece. Thankfully we can execute it all in two simple commands: mysql -u raguser -p ragserver < /home/raguser/rAthena/sql-files/main.sql mysql -u raguser -p log < /home/raguser/rAthena/sql-files/logs.sql And finally we are going to insert the first player account of our database. To do so we much enter & modify the following details. (This can always be changed later.) sudo mysql -u raguser -p Inside MySQL enter the following lines: INSERT INTO `ragserver`.`login` (`account_id`, `userid`, `user_pass`, `sex`, `email`, `group_id`, `state`, `unban_time`, `expiration_time`, `logincount`, `lastlogin`, `last_ip`, `birthdate`, `character_slots`, `pincode`, `pincode_change`, `vip_time`, `old_group`) VALUES ('20000000', 'admin', 'adminPassword', 'M', '[email protected]', '99', '0', '0', '0', '0', '2022-02-20 00:00:00', '', '2022-02-20', '9', '', '0', '0', '0'); (You can always change this later in the PMA window in the next steps.) It's time to check our SQL to make sure it looks as good as we think. To do this we are going to need to go to your favourite web browser and enter in the following website ( your website! ) http://127.0.0.1/phpmyadmin/ And we're in! Here inside PMA you will find all the accounts and database information. You can load item and mob databases directly to here and read from here instead of the traditional rAthena directory. There are many things to control inside here, especially if you're troubleshooting. (You also have an App icon in your menu.) STEP FOUR-2: PMA (Restricted Access) i1.4.1 Now that we've got PMA up and running we're going to want to restrict access to any users other than the host. To do this we will use our host address and only allow access to PMA using that address. Else, it will throw a forbidden page to the user. Start by editing the following file: sudo nano /etc/apache2/conf-available/phpmyadmin.conf And at the very bottom we will enter a new line for it to read: <Directory /usr/share/phpmyadmin> Order deny,allow Deny from all Allow from 111.222.33.444 </Directory> Be sure to change the address to your machine's IP address. Restart apache2 and you're ready to go! sudo systemctl restart apache2 STEP FIVE: Getting Green (Online) i1.5.0 Great! You're this far. Not much more to do from here. We're going to now navigate to your rAthena directory and edit the "char_athena.conf" script located in: /home/raguser/rAthena/conf/char_athena.conf Open the file with any text editor, the default one will work. Inside this file, near the top, will be the lines that show your Name & Password. These are for your Login database we set up earlier for phpMyAdmin (PMA). Search for and change the values to a random name and password: // Server Communication username and password. userid: s1 passwd: p1 For this step it is recommended to use random password generator of some sort. This never needs to be entered in manually anywhere. You can copy-paste it everywhere in this guide. In this example we are changing it to: userid: 4Xy3NAKxnl3sk6Aj passwd: 79y59S3m8lWmMDMS Now the Server's username and password are set, we can change the "inter_athena.conf" file so that the server can read our database we set up. Navigate to: /home/raguser/rAthena/conf/inter_athena.conf This is where we are going to change some access information so the server can read through our MySQL login we made earlier. Find and change: // MySQL Login server login_server_ip: 127.0.0.1 login_server_port: 3306 login_server_id: raguser login_server_pw: StrongPassword login_server_db: ragserver login_codepage: login_case_sensitive: yes ipban_db_ip: 127.0.0.1 ipban_db_port: 3306 ipban_db_id: raguser ipban_db_pw: StrongPassword ipban_db_db: ragserver ipban_codepage: // MySQL Character server char_server_ip: 127.0.0.1 char_server_port: 3306 char_server_id: raguser char_server_pw: StrongPassword char_server_db: ragserver // MySQL Map Server map_server_ip: 127.0.0.1 map_server_port: 3306 map_server_id: raguser map_server_pw: StrongPassword map_server_db: ragserver // MySQL Web Server web_server_ip: 127.0.0.1 web_server_port: 3306 web_server_id: raguser web_server_pw: StrongPassword web_server_db: ragserver // MySQL Log Database log_db_ip: 127.0.0.1 log_db_port: 3306 log_db_id: raguser log_db_pw: StrongPassword log_db_db: log log_codepage: log_login_db: loginlog The last location we need to navigate to are our map server configurations. For this we will navigate to: /home/raguser/rAthena/conf/map_athena.txt Change the username and password for the server. It's the same as earlier: userid: 4Xy3NAKxnl3sk6Aj passwd: 79y59S3m8lWmMDMS Now add (or uncomment) the following lines: char_ip: 127.0.0.1 char_port: 6121 map_ip: 127.0.0.1 map_port: 5121 In this part of the step we will configure the client to match your packet version. First we need to ensure "make" is installed. Enter in: sudo apt install make We'll need to give execution access to the configure file. Enter inside the rAthena directory (cd /home/raguser/rAthena) : sudo chmod a+x ./configure Then we are going to configure the server packet to match the client we downloaded. ./configure --enable-packetver=YYYYMMDD The YYYMMDD is your client version for your server.exe. Our example is going to be 20211103: ./configure --enable-packetver=20211103 Once you've done that we're all ready to get the green light. Let's test it out! Let's make a clean slate! Enter in the command while still inside your rAthena directory: make clean Now let's start constructing the server: make server After that's done loading, let's give execution access to the start files & servers: sudo chmod a+x login-server && sudo chmod a+x char-server && sudo chmod a+x map-server Time to start it up! (Make sure you're inside the rAthena directory) To start the server: sudo ./athena-start start To stop the server: sudo ./athena-start stop To restart the server: sudo ./athena-start restart To check the status: sudo ./athena-start status We're online! EXTRA STEPS (OPTIONAL) STEP SIX: DNS. (Mask your IP) i1.6.0 So many of you, like myself, would like to mask your IP address and the best way to do this is to use a domain name service to mask our IP. But does this mean you can't find my IP? No. This does not mean your IP is hidden completely. It just means people have an easier way of accessing your website on a more reliable and trusted connection. In this part of the guide we will go through the process of obtaining and setting up the DNS on your personal dedicated server. Let's start by understanding what DNS means. I'll be quick. What this is telling is, is that we can now take one thing (our IP) and mask it with another thing (domain name). That's short enough. Now some might be wondering... "Don't I need a website and a host for all of that?" The answer is Yes. We set that all up in the previous steps of this guide. You're all ready good to go. The first step is to navigate to your favourite (and trusted) domain name service provider. There are many out there that a simple google search can discover. In this example we are going to use Domain.com. It's affordable, takes Paypal, and has everything we need neatly displayed. Right in the middle of the landing page, you'll notice a search bar. It's large and ahrd to miss. This is where you will type your domain name you want to look for. Don't worry about attaching the endings onto it (.com, .net, etc) as it will give you a list of all the available ones. Purchasing a domain will create an account for you using the details entered in during the billing process. The basic domain I purchased costs slightly more because it's a ".net", which holds a premium standard these days. You don't need to worry about protection and SSL either. We will be managing that all from the server computer as well. For free. Once you find a domain name that fits what you want to achieve and your account was successfully created, it's time to navigate to your email and verify the website. This process is necessary to get the site online. We are now authenticated and ready to move onto the next part of this step. Now that we have a domain, what do we do now? How do we ge this domain name we now own onto mask your personal address? Keep following along. We're almost there! To confirm we have everything, in case there was an issue before, we're going run, in the terminal, the command: sudo apt update && sudo apt upgrade -y && sudo apt install apache2 -y Next we'll need a couple library files for the server to read the data. The following command will give us those libraries: sudo apt install php libapache2-mod-php php-mysql -y Now that we made some changes, it's always good to verify things are still where we left them. Let's verify PHP again to make sure it's the same version as before (8.2.2) php -v Earlier we made a web server. Now it is time to configure it! Enter in and customise the name: sudo mkdir /var/www/customName sudo chown -R raguser /var/www/customName This creates a folder and gives us full ownership of it inside the webserver directory. The custom name is for security measures. This is where we will upload our website and all the web files later. First we need to make a configuration file to run it properly. To do that we must enter in and adjust the name of: sudo nano /etc/apache2/sites-available/customName.conf An empty screen will appear. This is what we want. Now we can populate it with all the information necessary to maintain the web server. I recommend pasting this into a notepad and changing the values as needed. You will need your web site name, user name,custom folder name we made moments ago and your public IP address (v4). Change the values and paste it in to the blank page: <VirtualHost *:80> ServerName localhost ServerAlias kingsman-gaming.net ServerAdmin [email protected] DocumentRoot /var/www/customName ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost> Now the website is almost ready. We've given it instructions where to go. All we have to do now is verify it and enable scripts for the site to operate. Let's start by reloading our web server. sudo systemctl reload apache2 You may have to reload the apache2 service. If this appears simply run the command again: sudo systemctl reload apache2 This will appear a couple times through this part. Next we need to enable the default script. To do this we will run a command called "a2dissite". What this does is uses system links to run the website and disaables them when needed. Once enabled, we can set and forget even after reboots. sudo a2dissite 000-default Now we're going to do the same thing, except for the config file we just created above. The name must be exact: sudo a2ensite customName Let's test the config to see if it throws any errors: sudo apache2ctl configtest It looks like we got an error! It reads: If you encounter this, it's a simple fix! Enter the command to edit the following file: sudo nano /etc/apache2/apache2.conf Now we need to go to the bottom of the page and insert (at the very bottom) : ServerName localhost And now we want to reload the apache2 service one more time: sudo systemctl reload apache2 Finally, we must route our public IP to the domain name. This is done in that DNS menu on our domain host website. Let's navigate back to Domain.com and set this up. Here we want to edit (or add if it's not here) the "A record" that points to the host configured IP address. We will simply click edit to change the existing record and have it reflect (and edit to match your public IP) the values below: A @ 127.0.1.1 And to prepare things for the next steps, we are going to navigate to back to our basic domain settings and make sure the settings reflect the following: (Auto-renew optional) This is telling us all the options are disabled. We won't be needing any of them supplied by the host. That's it for this part! Our web server is ready for a website to be added and for the DNS to be redirected in our network settings. In the next step we will go through securing the website with a security certificate. It's free and easy to set up. STEP SEVEN: Getting SSL Certified (HTTPS) i1.7.0 In this step we're going to get that SSL set up. Currently when we access our website it says HTTP. We are going to make it say HTTPS. Start by registering to SSL For Web. It's free and easy to set up. After registering, we're going to go right to the top right and click the create button. You will be given two options. DNS & HTTP. We are going to select DNS to continue. You'll also need to enter your domain name to continue. This is where it gets a little more complicated, so follow closly. You will be given two codes to enter into your DNS register. To find this, you will navigate to where you purchased the domain name and modify the existing DNS service to include these values. Simple, right? In our example we used Domain.com. So we will continue using them. Log in and navigate to your domain. On the left side panel you will have some options. Select the one that says DNS & Nameservers. You will get a window like this: We are going to click DNS Records. This is where we will enter those values SSL generated for us. Go back to the SSL page and copy the first value on the left. This is a challenge domain for your domain name. Go back to your DNS records and enter in a new record. The record type we want is TXT. Paste inside the "Name" box the value we just copied. Go back to SSL and copy the value on the left. This is going to be pasted in the "Content" box. Set the value to 1/2 hour and hit confirm. Finally go back and verify that it worked. (It can take up to 30 minutes to fully work, but is usually quicker dependingon the service.) There is a status checker so you don't need to submit every time. Use the scroll bar to go to the right and check the status. Now that we have the green light and a security certificate is added to the domain, we can download the certificates and add them to the server. There are two main types of certificate for use and a bundled version. All we need in this example is the Certificate and Private Key. Now that we have them, how do we add them? Leave this page open for now, as we will need it shortly, and navigate back to your terminal. We're going to enter a few commands to get things set up on our dedicate server. Enter in to edit your certificate file: (rename to your website) sudo nano /etc/ssl/certs/kingsman-gaming.net.crt Then paste your certificate value that was given to you. We're looking for the Certificate. It now looks good to save! (CTRL-X, then enter Y to confirm) Now we must give it the key to the certificate. Enter in and edit the file: sudo nano /etc/ssl/private/kingsman-gaming.net.key We want to populate it with the key that SSLForWeb gave us. Go ahead and paste that in, then save the file. The last certificate we're going to add is the CA bundle. This will be used in the later steps, but let's add it now since we're here. Create a new file and give it adifferent name. In this example we just added ca. to it: sudo nano /etc/ssl/certs/kingsman-gaming.net.ca.crt Certificates are added and ready to go. Here we will go back to our server config file we made earlier and set it up for SSL encryption. Open: sudo nano /etc/apache2/sites-available/customName.conf We want to change the values to reflect: <VirtualHost *:443> SSLEngine on SSLCertificateKeyFile /etc/ssl/private/kingsman-gaming.net.key SSLCertificateFile /etc/ssl/certs/kingsman-gaming.net.crt ServerName localhost ServerAlias kingsman-gaming.net ServerAdmin [email protected] DocumentRoot /var/www/customName ErrorLog ${APACHE_LOG_DIR}/kingsman-gaming.net_error.log CustomLog ${APACHE_LOG_DIR}/kingsman-gaming.net_access.log combined <Directory /var/www/customName> Options FollowSymlinks AllowOverride All Require all granted </Directory> </VirtualHost> Then enable SSL to run scripts: sudo a2enmod ssl Let's break that down.... <VirtualHost *:80> is set to a standard, non-secured, port. We updated this to a secure port to allow the security certificates through. We added three lines to the top. These lines will be read first and indicate we are turning the SSL Engine ON, setting the Certificate Key file to our private ssl folder, and setting the Standard Certificate file to our certificate folder. And at the bottom we added some additional options for some System Links, Overrides, and Permission granting. Now the server can read all the security changes we made! Once we save that file we are going to enable the SSL scripts in the server. This was done simply with one command. With all this done, we have only one more step left to complete before we can fully set up SSL on the server. We need to allow our SSL access through the firewall. We can do this very easily with the following commands: sudo ufw allow 443 Your firewall should now appear with these ports for all of default Ragnarok services: (Check out open allowed services with sudo ufw status) 443 ALLOW Anywhere 5121 ALLOW Anywhere 6121 ALLOW Anywhere 6900 ALLOW Anywhere 80 ALLOW Anywhere 22 ALLOW Anywhere If you don't ahve an active firewall you can enable it with: sudo ufw enable With all this added, we are now going to check the syntax for the apache2 configuration to make sure it's still "OK" and restart the apache2 service: sudo apache2ctl -t sudo systemctl restart apache2 Common issue after this step: This is caused because the SSL scripts have to be passed through the system still. To do this we can enter in two commands to set this up: sudo a2enmod ssl sudo systemctl restart apache2 That's it for this step! We now have an SSL connection for our webserver. In the next section we will go through various methods of setting up the File Transfer Protocol (FTP) for our webserver. This is great for setting up files from your server for others to download. Users can download files directly from the web server. STEP EIGHT: File Trasnfer Protocol (FTP) i1.8.0 We're going to enable this on our server to allow users to download various files we set up in the download folder. Let's start by making that folder. Change directory to your web directory. We modified it earlier above: cd /var/www/kingsman/ Now create a directory: mkdir download We now have a folder where we will be adding out downloadable files. Let's get the libraries ready for the web server. Enter in: sudo apt-get update && sudo apt-get install openssh-server It will be a linear installation. Once it completes we can check the status of it: sudo systemctl status ssh If it failed to start load it again with: sudo systemctl start ssh Once we set the configs we're all ready to go. Edit the file: sudo nano /etc/ssh/sshd_config These settings will be added at the very bottom of this document. Scroll to the bottom, add & edit the following values: Match User raguser ForceCommand internal-sftp PasswordAuthentication yes ChrootDirectory /var/www/kingsman/download PermitTunnel no AllowAgentForwarding no AllowTcpForwarding no X11Forwarding no Save the document and exit. (CTRL + X then Y & Enter) Restart SSH with: sudo systemctl restart ssh We now have a fully functional FTP server attached to the web server. Now to get links for your files, you'll need to understand how the folders work in the web server. This part is completely ignored in the link you will generate: /var/www/kingsman/ Your link will be the default web address, so let's start with that: https://kingsman-gaming.net/ That's the start. Now we need to add our download folder. We know the default location is /var/www/kingsman/ directory, so this means kingsman-gaming.net is that location. To add the downloads folder we simply just separate it with a " / " and add the download directoy, exactly how it's spelt,in the file hierarchy: So /var/www/kingsman/download becomes: https://kingsman-gaming.net/download/ You can add as many directories as you can fit into the web address search bar and break off from the download folder to download other parts of the site. You'll add the file name to the link for which ever file you want to download. For example, I want to download VLRO.zip: https://kingsman-gaming.net/download/vlro.zip Now we have a place players can download our server from. Simply upload your files inside this download folder and send the link to your players to download. In the next step we will go through how to create a launchable version of Windows 10 wil your Ragnarok Online server set up on it. We will also go through various tools that will be useful to development. STEP NINE: Emulating Windows 10, Ragnarok & RO Tools (QEMU/KVM) i1.9.0 In this step we will be going through how to build and run a virtual machine based on Windows 10 operating system with our Ragnarok Online server installed onto it. Make sure to download Windows 10 ISO while we work. This will save some time later. You may also want to consider moving it to a new directory inside your Documents folder. We'll be doing this for our example moving forward, as well. Start by check that your system is Virtualization Ready. Enter in the terminal: egrep -c '(vmx|svm)' /proc/cpuinfo If your system is Virtualization Ready it will appear with a number greater than 0. My number came out as 16, so we're good to check if the system is supported. To do this enter in: kvm-ok If the system does not have the checker, you can enter this command to enable it: sudo apt install cpu-checker -y Now that we found out we can support virtualization it's time to install it, along with the librarfies neeeded to run it. Enter the following command to run all of this in one go: sudo apt install qemu-kvm virt-manager virtinst libvirt-clients bridge-utils libvirt-daemon-system -y We're going to run two more commands to make sure we have the virtualization daemon. Enter in: sudo systemctl enable --now libvirtd sudo systemctl start libvirtd Now check the status of to make sure it's online and everything is green:\ sudo systemctl status libvirtd Everything looks good so far! Before we can run the program we need to give our user specific permissions to access the daemon. To do this we will enter in: sudo usermod -aG kvm $USER sudo usermod -aG libvirt $USER We are now ready to launch! You can start the application in the application menu using the icon it supplies. (It can take a minute to populate) If you can't find it, or it hasn't appeared yet, you can manually run it with the command: sudo virt-manager You should now have a window that looks like this: If you experience an error trying to connect after finishing up to this part of the step and it reads something along the lines of: Unable to connect to libvirt qemu:///system.Verify that the 'libvirtd' daemon is running. Error: Failed to connect socket to '/var/run/libvirt/libvirt-sock': Permission denied It is recommended to restart your computer and try connecting. Sometimes after the installation it won't have all permissions set properly. A full restart of the system can resolve this. Now that we are set up, it's time to create a virtual machine! Go ahead and click the New Machine button at the top left. We're going to select Local install media from the list and select the ISO file we downloaded at the start of this step. (If you didn't donwload it before, now is a good time to. While you're waiting you can reflect over the steps you've went through to get this far. It is good to understand the system and how you got here.) We'll want to click "Browse..." and a new window will appear. Here we have our default filesystem directory. This is a default directory that is given with the application. We don't have files in this folder so we won't focus on this. At the bottom left, there's green " + ". Click it. Now we are presented with options for renaming the pool, changing the type of file it is, and setting the target path for where to read and write data. We are only going to focus on two of these options in this step. Name & Target Path. We'll give it the name "DiskImages", though you can name it anything you want, and we want to select the path to be the folder we created inside our Documents which holds the Windows 10 ISO. We now have a link to this folder inside the KVM. If we select it, we can now see the Windows 10 64 bit ISO is there. We will click it and Choose Volume. The applicatiion will likely guess that it is Windows 11, so we need to uncheck that box and change it from an 11 to a 10. Change to Press Forward and agree to the promt. You can click the Don't Ask button for future changes. Now we must set the amount of RAM and Cores to use. We can change this any time after shutting the virtual machine down. For now, we will use the default 8G and 4 Cores. (Recommend: 3G RAM or more, 2 cores or more for this setup) The next part of this step is to create the virtuale machine's hard drive. To do this we need to let the VMM do a rather long process to the 32 GB of space that will add a system file to a size we pre-determine, and it will allow us to boot Windows 10 off that space and dedicate it a hard drive to store files. It sounds complicated, but it's really simple to do. It just takes some time if you have larger spaces to work with. Moving forward, we much select "Enable Storage for this virtual machine" and we will then go to the bottom and select "Create a dusk image for the virtual machine" and click "Forward". If we get asked to grant search permissions for the path. Click YES. Now we are ready to create the Windows 10 disk space. Double check the information is correct, mainly the Windows 10 operating system doesn't say Windows 11. It will launch automatically for the first time on Finish. You will now be able to set up your emulated Windows 10. (If you encounter...) ERROR: If you experience an error, roughly like the one I created above, it's possible that the QEMU user does not have access to this directory still. You can manuall add this access very easily. Enter in the command to check the permissions, first: The output should look close to this: This is showing us that our QEMU is not here on the list. Let's add it: sudo setfacl -m u:libvirt-qemu:rx /home/raguser/RagDisk Now if we run the command to check it again: sudo getfacl -e /home/raguser/RagDisk We can see that the user is added successfully. Finally, Restart the Virtualization library and you're ready to continue on to the next parts of this step: sudo systemctl restart libvirtd You should be ready to launch now! We've got Windows 10 running and Updated as much as it can get. We're going to install a few necessary applications to run our programs and the game itself. Download the following files from the following (trusted) sources: -Microsoft Direct X Runtime -Visual C++ Redistributable for Visual Studio 2015 -.NET 6.0 or 7.0 -(Optional) RO Tools List With everything installed, and the system fully rebooted for good measure, we're ready to get started with the game installation. STEP TEN: Setting up rAthena Source (Game Files) i1.10.0 Now it's time to get rAthena set up so we can get players connecting to the server. First thing's first! Organise and familiarise yourself with the files. This is where you will be spending lots of your time. This will be an ongoing process once you complete these steps. In this guide, it will give you some organization pointers. Take your time with this and get used to how you lay things out. You will navigate back and forth a lot during a maintenance. If you have not already downloaded rAthena we will go ahead and do that now. The following commands will change your directory to the root for your profile, next it will make a "Server" folder for you to operate in, and finally it will download the rAthena trunk to that directory. Finally we will enter that directory to process the remaining steps. cd sudo mkdir Server git clone https://github.com/rathena/rathena.git ~/rAthena cd rAthena To update rAthena to the latest verison we need to process a git-pull while inside the rAthena diretory. git pull Now we've got rAthena's latest trunk and all the updates! It is important to get a good, or at least an okay, understanding of how rAthena has all their files organized. Things are in a specific place and named specific things for a reason. If you move or rename a file or folder it will cause you many problems. Source files are where you will make changes that will affect the entire game and the way it functions. Be very careful when editing these files and stay within the lines of the cave if you don't know what you're doing. Config files are where you will make the majority of changes to your server. This is where things like Drop rates, EXP rates, and all your Server settings will be located. In the continued steps below, we will go through how to set up the remainder of the server. It's time to create a database for all the player accounts to be saved to. To get started be sure you've followed the previous steps for setting up PMA (phpMyAdmin). Now that we have access to MySQL we can start by entering in some commands to give us access to the databases involved. Open the terminal and enter in the following: (Note: You set the username and password earlier) CREATE DATABASE ragserver; CREATE USER 'raguser'@'localhost' IDENTIFIED BY 'StrongPassword'; CREATE USER 'raguser'@'%' IDENTIFIED BY 'StrongPassword'; GRANT ALL PRIVILEGES ON ragserver. * TO 'raguser'@'localhost' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON * . * TO 'raguser'@'%' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON * . * TO 'raguser'@'localhost' WITH GRANT OPTION; This created the database 'ragserver' and added 'raguser' to the database with full access. Next we need to make the logs and grant privileges to raguser on it. Enter in: CREATE DATABASE log; GRANT ALL ON log.* TO raguser@localhost; Now we can leave by entering in: quit Majoirty of the database is set up now! This next step is a little more complicated, but very simple to do. rAthena has a database in the server files that we are going to pull the columns and rows from so we don't have to manually construct it ourselves piece by piece. Thankfully we can execute it all in two simple commands: mysql -u raguser -p ragserver < /home/raguser/rAthena/sql-files/main.sql mysql -u raguser -p log < /home/raguser/rAthena/sql-files/logs.sql Now we have an almost-fully functional database for the server. It's time to create the first account! Back to the terminal, we are going to enter and log in to MySQL again: sudo mysql In MySQL enter in: (Before submitting this to the database, we are going to change the Login Name, User Name, Password, & Email) INSERT INTO `ragserver `.`login` (`account_id`, `userid`, `user_pass`, `sex`, `email`, `group_id`, `state`, `unban_time`, `expiration_time`, `logincount`, `lastlogin`, `last_ip`, `birthdate`, `character_slots`, `pincode`, `pincode_change`, `vip_time`, `old_group`) VALUES ('20000000', 'admin', 'adminPassword', 'M', '[email protected]', '99', '0', '0', '0', '0', '2022-02-20 00:00:00', '', '2022-02-20', '9', '', '0', '0', '0'); Great! You're this far. Not much more to do from here. Navigate in WinSCP/FileZilla (or other FTP access app) and go to your directory: /home/raguser/Server/rAthena/conf/char_athena.conf Inside this, near the top, will be the lines that show your Name and Password. These are for your Login database we set up earlier for PMA. If you haven't changed these yet, do so now. I recommend a random generator for the values. A simple Google search for this will help. Search for and change the values to a random name and password: // Server Communication username and password. userid: s1 passwd: p1 These values must reflect what is inside the login database or the server won't be able to connect. Do not share these values. With anyone. Now the Server's username and password are set, we can navigate to: /home/raguser/rAthena/conf/inter_athena.conf This is where we are going to change some access information so the server can read through our MySQL login we made earlier.Find and change: // MySQL Login server login_server_ip: 127.0.0.1 login_server_port: 3306 login_server_id: raguser login_server_pw: StrongPassword login_server_db: ragserver login_codepage: login_case_sensitive: yes ipban_db_ip: 127.0.0.1 ipban_db_port: 3306 ipban_db_id: raguser ipban_db_pw: StrongPassword ipban_db_db: ragserver ipban_codepage: // MySQL Character server char_server_ip: 127.0.0.1 char_server_port: 3306 char_server_id: raguser char_server_pw: StrongPassword char_server_db: ragserver // MySQL Map Server map_server_ip: 127.0.0.1 map_server_port: 3306 map_server_id: raguser map_server_pw: StrongPassword map_server_db: ragserver // MySQL Web Server web_server_ip: 127.0.0.1 web_server_port: 3306 web_server_id: raguser web_server_pw: StrongPassword web_server_db: ragserver // MySQL Log Database log_db_ip: 127.0.0.1 log_db_port: 3306 log_db_id: raguser log_db_pw: StrongPassword log_db_db: log log_codepage: log_login_db: loginlog The last locations we need to navigate to are our map server & subnet configurations. Navigate to: /home/raguser/rAthena/conf/map_athena.txt Change the username and password for the server. It's the same as earlier: userid: 4Xy3NAKxnl3sk6Aj passwd: 79y59S3m8lWmMDMS Now add (or uncomment) the following lines: char_ip: 127.0.0.1 char_port: 6121 map_ip: 127.0.0.1 map_port: 5121 And finally adjust the subnet to match your server's IP address. This step can be a little tricky if you don't understand how a subnet works. So simply follow below and replace x.x.x.x with your server's IP address: subnet: 255.0.0.0:127.0.0.1:127.0.0.1 subnet: 255.0.0.0:x.x.x.x:x.x.x.x Excellent! You're near the end. It's time to configure the client to your packet version. Let's give execution access to the configure file: sudo chmod a+x ./configure Then we are going to configure the server: ./configure --enable-packetver=YYYYMMDD The YYYMMDD is your client version for your server.exe. An example of how this looks is: ./configure --enable-packetver=20211103 Congratulations on making it to the end of setting up your server. It's time to start it up now! Let's make a clean slate! Enter in: make clean Then let's start constructing that server. Enter in: make server After that's done loading, let's give execution access to the start files & servers: sudo chmod a+x login-server && sudo chmod a+x char-server && sudo chmod a+x map-server Time to start it up! (Make sure you're inside the rAthena directory) To start the server: ./athena-start start To stop the server: ./athena-start stop To restart the server: ./athena-start restart To check the status: ./athena-start status That's it for this step. If you followed up to here you'll have a all server files downloaded and ready on the server side with a database ready to accept logs and registrations. In this next step we will go through the systemd.service files to get your server running automatically when the system restart or if it crashes. STEP ELEVEN: Setting up UFW (Firewall) i1.11.0 When setting up the firewall, we want to make sure we know exactly what ports we are adding in before we add them. This will save us from having to deny thema ccess later. Let's gather the ports we know of for all the services we've set up thus far. We know of our Web ports, which should be automatically added when installed, but sometimes this isn't the case. We've also got the FTP ports for the download servers, if we want to use them. There's also the PMA & SSH ports. Are you writing this down? sudo ufw allow 443 sudo ufw allow 80 sudo ufw allow 20/tcp sudo ufw allow 21 sudo ufw allow 22 sudo ufw allow 3306 sudo ufw allow 6900 sudo ufw allow 5121 sudo ufw allow 6121 sudo ufw allow 8888 Sometimes you might still get some issues with the firewall blocking you. You may be required to let the firewall know what type of conneciton to allow, either TCP or UDP; but what is TCP/UDP you might ask? Very simply put... TCP means Transmission Control Protocol which runs a more reliable connection, however, it can lack in transfer speed. UDP means User Datagram Protocol and it has a much faster transfer rate of data, but can be unreliable in sending said data. What does this mean for you? You can choose to do UDP all accross the board since Ragnarok uses small packets of data compared to a much larger scale game. Just my recommendation. However, if you want absolute data transfer at the highest success rate to avoid lost packets and data, then do TCP. Still confused? Do both in the firewall. An example of what the command will look like for adding TCP/UDP: sudo ufw allow 5121/udp sudo ufw allow 5121/tcp Now that we've got an understanding of the firewall and the ports we have added we can now relax knowing the firewall will protect us from majority of threats. STEP TWELVE: Setting & Forgetting (Auto-Start scripts) i1.12.0 I hate when the server crashes. But you know what's worse? When it doesn't come back up until an admin turns it on. In this step we will go through the simple setup process to get your server ready to start when you load your system and reboot if it crashes. Start by opening up the terminal and entering in the following command to create a new system.service file: sudo nano /etc/systemd/system/ro-login.service This will create a system service file which we will enable later to start automatically. Inside these service files will be a series of commands that will allow the server to boot up automatically when it experiences an outage for a speificied amount of time & when starts the system after a reboot. Populate the file and edit the values to match your rAthena directory and User Login name: [Unit] Description=Ragnarok Login-Server After=syslog.target network.target mysqld.service [Service] WorkingDirectory=/home/raguser/rAthena User=raguser ExecStart=/home/raguser/rAthena/login-server ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure RestartSec=15s [Install] WantedBy=multi-user.target We are going to do this two more times. Once for Character Server & another for the Map Server. sudo nano /etc/systemd/system/ro-char.service Populate with: [Unit] Description=Ragnarok Character-Server After=syslog.target network.target mysqld.service [Service] WorkingDirectory=/home/raguser/rAthena User=raguser ExecStart=/home/raguser/Server/rAthena/char-server ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure RestartSec=15s [Install] WantedBy=multi-user.target And now: sudo nano /etc/systemd/system/ro-map.service Populate with: [Unit] Description=Ragnarok Map-Server After=syslog.target network.target mysqld.service [Service] WorkingDirectory=/home/raguser/rAthena User=raguser ExecStart=/home/raguser/Server/rAthena/map-server ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure RestartSec=15s [Install] WantedBy=multi-user.target We will now start them all and check their status: sudo systemctl start ro-char sudo systemctl start ro-map sudo systemctl start ro-login sudo systemctl status ro-char sudo systemctl status ro-map sudo systemctl status ro-login Once we have the Green light on the status we can go ahead and enable the scripts to automatically start on boot. Enter in: sudo systemctl enable ro-char sudo systemctl enable ro-map sudo systemctl enable ro-login That's it! You're set to boot up automatically after a crash and upon system restart. Well done! Section 2 - After-Installation Now that we've got everything set up this far, we can continue maintaining & updating what we've started. Continue below to learn more on how to maintain the server after you've set it up. Requirements : Latest NEMO release An executable update from NEMO's website Latest FluxCP from rAthena STEP ONE: FluxCP (Registration & Logins) i2.1.0 Everyone needs to register somehow, right? We're mostly all aware of the high risks with enabling registration via "_M/_F", if you're not... In short: Don't use it if you're opening the server to the public. It can enable botters, spammers, & hackers the ability to just create infinite accounts and continue their schemes easier. With FluxCP we can help avoid this by limiting the amount of registrations allowed per person. Let's dive into it now. Gather your resources! You'll need to download the latest FluxCP by clicking that link. If you missed it, here's the link again: https://github.com/rathena/FluxCP This is where we will manage all the registrations to the game as well as many other fun functions we will get into later. For now download & extract this entire directory into your webserver. I put mine in the primary (root) directory of my webserver. That's the folder we created earlier with the custom name we provided. In this example we used "kingsman" as the custom name. The folder path is: /var/www/customName Our final output will look like not include the folder. This means we must drag all the contents into the root directory of the webserver. Now we should look like this at after extraction: Enter the config folder first. This is where we will be doing all the work for setting up this control panel. Inside the config folder you will have 31 files to select from. We're only going to work in two of these for this step. Open servers.php and you will see a set up similar to earlier where we added some settings for rAthena configs. They are the exact same configs. Go ahead and add that in there exactly as you did in the configs earlier. Now that we have our config looking good, let's scroll down towards the bottom and edit our rates to reflect that of our server's. This will display the rates set up in your databse as well so players can use that to search drop rates on your server. Change accordingly! That's it for the servers.php! Save that & move to the next file. Let's now open up application.php and edit the first few lines we see. We want to change the base URI to be blank. This will set it to the root directory where we hold the control panel. Server Address is going to remain localhost since we are running it on the localhost. And finally we need a storng password to gain access to the administration panel to set it up. 'ServerAddress' => 'localhost', // This value is the hostname:port under which Flux runs. (e.g., example.com or example.com:80) 'BaseURI' => '', // The base URI is the base web root on which your application lies. 'InstallerPassword' => 'superduperstrongpassword,man', // Installer/updater password. Save that and open your website now! You'll likely get several permission errors. Copy waht they say for you to do, it will be a sudo chmod command giving access to the logs. This is necessary to proceed to the next part. Add sudo before each command or it won't work. You'll need to enter your password into the control panel shown after granting permissions to FluxCP. After the password is successfully added it will update your PMA database with all the new information for FluxCP's registration and logins. Your panel should look like this by default now: You now have a palce where you can register and manage accounts! Navigate through the application.php file to change some various settings like your control panel name and what is displayed. You can also adjust the ports if they are different during the previous set up. STEP TWO: My First EXE (Making an Executable) i2.2.0 Now that we've got everything set up on the server-side of things it's time to work on the client-side of things now. Let us start first by making an executable. this will be the CustomRO.exe that players will use to run the game. Launch NEMO and give it a moment to load up. In a compact form, this is waht you'll see. What this is showing us is that we can Load a client, which we downloaded from the "Requirements" section above, we can apply patches, select the recommended patches, select previously loaded patches, load a pre-saved profile, and save an existing setup as a profile to load later. for this example we are going to use the current recommended version in rAthena's trunk. This is version "2021-11-03". We are presented with a file that will launch a terminal to download the latest executable. It will look similar to this: Now we have the executable ready to be patched. Back inside NEMO, we want to browse to that file we just downloaded and select it. You can change the saved outpute file name here or rename it anytime later. Here we will change it now. Click "Load Client" and a list of patches will populate. Now we want to "Select Recommended" patches given for for the executable. To apply these patches simply click the "Apply Selected" button and it will pack it for you. Brose the patches and select any patches that will help you or you might use in the future. For this example we are changing the Client Title name, the ItemInfo.lub or ItemInfo.lua and a majority of other changes that will allow the client to read LUA files over LUB files. Take your time going through the list. It will take a while the first time around. With all the patches applied we now have en executable in our output folder. But it came with other files, what do I do with those? You only need the custom executable we made (CustomRO.exe). This is going to be sent to the players and the rest will be removed from the client folder You're now ready to send this to other players! STEP THREE: My First Patcher (Making a Patcher) i2.3.0 We've got a client executable and it's fully patched the way we like. This is a great start! Now it's tie to send players an update. Through the patcher. But we don't have one yet! In this example we will go through the steps to creating a patcher using Thor Patcher from rAthena download section. Your extracted package should reflect similar to this: We want to enter the Configuration folder and edit the config.ini file located inside. Inside this config file are the lines necessary to connect the client to the server and send files from the server to the client. In the first few mines we'll edit the values to reflect our server values: The IP can be our website, this example is just a localhost address. Remote config file we will leave as default. Status file we can name server.dat. This can be anything, however. The custom GRF we have for our server, listed as number 0= in the data.ini. Finally our custom client executable we made earlier. Further down the page we have the title of the patcher. This can be anything. And lastly our notice page which will have a brief text description for the updates on the patcher front page. Save that and we're ready to launch the config generator. Drag the config into your .../Thor_Patcher/Patcher folder and it you're ready to copy them to your CustomRO client files. When compelte you'll have a patcher similar to this: You're made your Patcher now, well done! STEP FOUR: My First Patch (Making a Patch) i2.4.0 Keeping organised is key to staying sane. Let's start off by making a couple folders. A Patches folder & a data folder. It should look like this now: Patches/data This should look familiar. It's the same set up as the GRF. We will now be able to drag all the files we want to patch into this directory. One more folder we want to make is going to be the Output folder. This is where all the patches will be saved. There will be two more options to deal with. We want to set compression to HIGH and in the Options tab we want to set the file type to ACSII. It should reflect the below image. Once that's set we can click "Generate" to make the first patch. It will be create in the Output folder we selected. That's all there is too it! You've created your first patch. STEP FIVE: Sending The Patch (Sending Patches) i2.5.0 We now have it all. The Patcher & The Patch. Things are great. But how do we send it to players withing them having to redownload the entire GRF? Great question! In this next step we will cover how to add the patch to the webserver and get it ready for players to recieve when they load their patchers. In step i2.3.0 we covered how to set the patcher up in the web server. This is the file structure we will continue to follow moving forward. Let's open open up our file browser for accessing the server trunk, if needed, or it you're running your own system you can also navigate to the web server folder. The directories are the same either way. /var/www/custom/patch/ This is the directory we wil be working in regarding the patcher. It should now represent the image below: Let's break this down first... We have: The data folder. This is where we will add the patches into after we name them. The Background image. This will be a back ground image for the patcher to load. You can even leave this transparent if you want. Our main.ini is where we will configure the settings for the patcher. We will go through this soon. The notice page will be need to be updated with each news change. This is a very simple text edit. Keep it short and simple. Our patch list text file is where we will add the patches. The format will be discussed soon. Our Style sheet. This is the style arrangements for the pages. We usually don't need to modify this unless we know what we're doing. First thing to do after we have a patch made is to give it a name. What do you ask? A very specific name. In this example we will follow a date format with a part value in the event of more than one patch in a day. Our name in this example will be the date followed by a version number, or update number. 24012024-1 This well tell me that the patch was set for today and it's the first path released of that day. Now we can edit the plist.txt and add this patch into the list. Inside the patch list we will enter in the exact namme of the patch. Including the ending. Our names will start with an index number first. This is the order at which the patcher will read the patches. The index starts at 0 and is followed by a SPACE and then the item name. 1 24012024-1.thor Save and it's ready to load through the patcher! Finally we need to tell the website to send patches to players. Open up the main.ini file with a text editor. We're going to modify the line that asks for a website address. Search for "file_url=" ad edit that to be your website. Save and it's ready to go! That's pretty much it for uploading patches to the server. You're all set to start updating players with new content! STEP SIX: Adding/Removing Maps (map_cache.dat) i2.6.0 Got a enw map you want to try out or is your current map not up to date with your pathing? In this step we're going to add maps to the map_cache.dat, remove maps if needed and update the list with our new maps. First start by downloading the Map Cache Editor from the trusted rAthena source: HERE You'll be presented with a window that looks like this: What we want to do next is download our map_cache.dat from the server trunk: rAthena/db/map_cache.dat Once downloaded it will be able to drag and drop that file into this window. We now are presented with a list of maps. From here what we want to do is drag and drop all our map's .gat files from our GRFs into this window. this will update the walkable paths for the map. This is especially important when you cannot walk on certain maps due to old GAT configurations, It still thinks there are structures in the way. To delete a map you can select it and click delete. Simple as that. Save the Map Cache and reupload it to your server. That's it! Nice and quick. Section 3 - Optional Options Things are running now, yeah? That's great to hear. Sometimes they may require additional software, maybe another step or two, or maybe you need something else for it all to work. Below are some steps that are completely optional but might just help you out in some situations. STEP ONE: Forwarding a Router (Port Forwarding) o3.1.0 Understanding what port forwarding is will be an important start to not having your network breached. In this step we will go through the basics of forwarding your port through your router. The user interface (menus) will look different for each router brand, however, the concept will remain the same universally. Check your router software for updates before making any changes. Let's begin! Accessing the Router To access the router we want to first ensure we are connected to the internet using it. Next we will open the trouter software through our web-browser. To access that page we will have to enter the local domain IP to gain access to the initial menu. In your address bar enter in: 192.168.1.1 If this DOES NOT work try entering in: 192.168.0.1 My basic Netgear modem has a menu that looks like this. I'm going to want to click into Advanced Settings & open up the Port Forwarding option. We are now presented with a window similar to this. It will give us all options for forwarding our ports. Let's get an understanding of what's here before we continue... We will select between Forwarding and Triggering. Since we don't need to trigger a port we will focus only on Forwarding it. There are many types of services that might be precompiled in your router. For our Ragnarok Online server will be making a custom service. It's not as hard as it sounds, don't worry! The device IP we want to connect is a little different. It has to be exactly what device you have the server under. Let's navigate to the device list on the router. This will be under the "basic" settings, usually. It shows here I have 3 devices listed. An Amazon Fire stick, My cell phone and a PC I built specifcally for this guide. That's exactly what we are looking for, too! It looks like the device I am forwarding resides under the IP ending with 7. Okay, so we now understand where the ports are going to and waht device has them. So it's time to make that custom service we spoke of earlier. This interface has a button, making it very convenient to start. We're going to go ahead and click the "Add Custom Service" button. With the custom port window we can now add our ports for Ragnarok to run. We will need to process this 1 number of times as we have more than one port for Ragnarok Online services. The ports we need to add are: 3306, 6900, 5121, 6121, 8888 Make sure to select the proper device for it to work as we want it to. After they are all applied, it will represent something similar to this: That's it! Your ports are now open & ready for users to connect through to. Make sure firewalls are enabled at all times. STEP TWO: Automatic Server Backups (World Runner) o3.2.0 This script will automatically save your server to your server_backup folder every 24 hours. This time is completely adjustable in time and destination. I originally made this for Minecraft hence the name World Runner. Open the terminal and enter in the command: sudo nano /etc/systemd/system/worldrunner.service This will create a service script we will set to run on start up. Inside this document we are going to add int the following script and change the destination values to match our back up folder destination: [Unit] Description=This will copy the Server folder to a back-up location [Service] Restart=always RuntimeMaxSec=1d User=raguser ExecStart=cp -r /home/raguser/Server/rAthena /var/www/raguser/Documents/server_backups/ RemainAfterExit=yes [Install] WantedBy=multi-user.target Now we want to enable it on start-up: sudo systemctl enable worldrunner If you're having issues with it executing properly we can simply grant permissions to the file to do so: sudo chmod 600 /etc/systemd/system/worldrunner.service We now have the trunk backing up now, but what about the SQL server? For that we need to edit a default file structure in Ubuntu called Cron. Cron can hold automated tasks on a timer, or schedule, just like what we want to do for backing up MySQL. Enter in the terminal: sudo nano /etc/crontab You'll be presented with a window simial to this: As you can see here they are displaying each value for the job. First digits represents Minutes and the second digits represents Hours. These are the two we'll primarily need for daily backups to occur. At the very bottom we are going to add the following line: (NOTE: Include your password after the -p. My password is "69SuperStrongPass69" so the password section will look like -p69SuperStrongPass69 ) 0 0 * * * root mysqldump -u raguser -p69SuperStrongPass69 --all-databases | gzip > /home/raguser/Documents/Rag_SQL/ragserver_`date +%d%m%Y-%H:%M:%S`.sql.gz This will set the back up time to be at Midnight each night using the PMA login we set up earlier, backing up our ragserver database into a zip file at the directory ~/Documents/Rag_SQL. NOTE: Avoid use of these symbols in the password field: ) ( ' ` Finally we need to restart the service for it to take effect: sudo /etc/init.d/cron restart That's all there is to it! Keep up to date with the latest changes & updates to this guide. Want to see something included? Suggest it below!
  2. Hi everyone. I'm trying to set-up a new server on a running AWS EC2 Instance (t2.micro), but I'm getting stuck at building clif.cpp while running make server. I tried to create different instances with different SO's but nothing seems to work. The EC2 instance has 1v CPU core, 1 GB RAM and 16 GB of storage. I'm missing something else? g++ -v output: Thank you!
  3. Hello, thank you very much for considering helping me on this and I hope this can help other people too! I just successfully installed and enjoyed a great time playing my own RO server locally running on my Docker with this Ubuntu image and sending below... The thing is... how do I go one step further and expose it to the internet using zerotier/Hamachi/customize my router? I'm asking this because I got stuck at this point of changing config and running it offline... I really would be glad if I could invite some friends to join my server! That said, I just want to thank this community for now and see if I can help a bit more in the future too! (PLEASE IGNORE WHAT COMES NEXT BELOW IF YOU DON'T WANT TO CHECK HOW I'M RUNNING MY APP WITH DOCKER) Dockerfile: ``` # Use Ubuntu 22.04 as base image FROM ubuntu:22.04 # Update and upgrade packages RUN apt-get update -y && apt-get upgrade -y # Install necessary packages RUN apt-get install -y build-essential git libz-dev libssl-dev libcurl4-gnutls-dev libexpat1-dev gettext cmake gcc RUN apt-get install -y libpcre3 libpcre3-dev make libmysqlclient-dev zlib1g-dev RUN apt-get install -y apache2 RUN DEBIAN_FRONTEND=noninteractive apt-get install -y mariadb-server supervisor RUN DEBIAN_FRONTEND=noninteractive apt-get install -y php # Install the PDO MySQL driver RUN apt-get install -y php-mysql # Install Neovim just cause I want it: RUN apt install -y neovim # Install the cURL and XML PHP extensions RUN apt-get install -y php-curl php-xml # Configure Apache RUN chown -R www-data:www-data /var/www/html RUN chmod -R 755 /var/www/html # Start MariaDB and configure users and database RUN service mariadb start && \ sleep 3 && \ mysql -e "SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456');" && \ mysql -e "DELETE FROM mysql.global_priv WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');" && \ mysql -e "DELETE FROM mysql.global_priv WHERE User='';" && \ mysql -e "DROP DATABASE IF EXISTS test;" && \ mysql -e "FLUSH PRIVILEGES;" && \ mysql -e "CREATE USER 'ragnarok'@'%' IDENTIFIED BY 'ragnarok';" && \ mysql -e "CREATE DATABASE ragnarok;" && \ mysql -e "GRANT ALL PRIVILEGES ON ragnarok.* TO 'ragnarok'@'%';" && \ mysql -e "FLUSH PRIVILEGES;" # Copy configuration files COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf COPY zeus-login.sql /opt/app/zeus-login.sql RUN git clone https://github.com/rathena/rathena.git /opt/app/rathena RUN git clone https://github.com/projetoeaBrasil/rathena_pt-br /opt/app/rathena_pt-br WORKDIR /opt/app/rathena RUN ./configure --enable-packetver=20190605 && make clean && make server # Expose ports EXPOSE 80 443 8888 5121 3306 6900 # Run supervisor CMD ["/usr/bin/supervisord"] ``` docker-compose.yml: ``` version: "3.9" services: zeus_server: container_name: zeus build: context: . dockerfile: Dockerfile volumes: - type: bind source: ./ubuntu_root target: /root ports: - "80:80" - "443:443" - "6900:6900" - "6121:6121" - "5121:5121" networks: - zeus_network networks: zeus_network: driver: bridge ``` supervisord.conf: ``` [supervisord] nodaemon=true [program:apache2] command=/usr/sbin/apache2ctl -D FOREGROUND [program:mariadb] command=/usr/bin/mysqld_safe [program:rathena-fluxcp] command=bash -c 'git clone https://github.com/rathena/FluxCP.git /root/FluxCP || true' autostart=true autorestart=false startretries=0 [program:apache2-cleanup] command=bash -c 'mv /var/www/html/index.html /var/www/html/index.bkp.html || true' autostart=true autorestart=false startretries=0 priority=2 [program:fluxcp-configure] command=bash -c 'cp -r /root/FluxCP/* /var/www/html || true \ && service apache2 restart' autostart=true autorestart=false startretries=0 priority=2 [program:import_initial_sql] command=sh -c 'sleep 6; mysql ragnarok < /opt/app/rathena/sql-files/main.sql \ && mysql ragnarok < /opt/app/zeus-login.sql' startsecs = 0 autorestart = false [program:rathena-translate] command=bash -c 'cp -rf /opt/app/rathena_pt-br/* /opt/app/rathena/ || true' autostart=true autorestart=false startretries=0 priority=2 [program:rathena-configure] command=bash -c 'sleep 3; cd /opt/app/rathena \ && ./configure --enable-packetver=20190605 \ && make clean && make server \ && ./athena-start start || true' autostart=true autorestart=false startretries=0 priority=3 ``` And I also created this file `zeus-login.sql` in the same folder to create a new user for me: ``` INSERT INTO `login` (`userid`, `user_pass`, `sex`, `email`, `group_id`) VALUES ('zeus', '256854', 'M', '[email protected]', '99'); ```
  4. Hello. Decided to try to run a server and encountered some issues while running make server. Here's a little information on the steps I took: 1. apt-get install php5 phpmyadmin mysql-server mysql-client git make gcc libmysqlclient-dev zlib1g-dev libpcre3-dev 2. sudo apt-get install php5 phpmyadmin mysql-server mysql-client git make gcc libmysqlclient-dev zlib1g-dev libpcre3-dev 3. git clone https://github.com/rathena/rathena.git ~/rAthena 4. all kinds of other db stuff and conf file stuff 5. ./configure --enable-packetver=20170614 6. make clean 7. make server That is when the errors occur. I have searched through the forums and have not found a concrete answer or situation similar to mine. In file included from clif.cpp:21:0: clif.cpp: In function ‘void clif_npc_market_open(map_session_data*, npc_data*)’: clif.cpp:2158:58: error: invalid application of ‘sizeof’ to incomplete type ‘clif_npc_market_open(map_session_data*, npc_data*)::PACKET_ZC_NPC_MARKET_OPEN’ WFIFOHEAD( fd, sizeof( struct PACKET_ZC_NPC_MARKET_OPEN ) + nd->u.shop.count * sizeof( struct PACKET_ZC_NPC_MARKET_OPEN_sub ) ); ^ ../common/socket.hpp:30:71: note: in definition of macro ‘WFIFOHEAD’ #define WFIFOHEAD(fd, size) do{ if((fd) && session[fd]->wdata_size + (size) > session[fd]->max_wdata ) realloc_writefifo(fd, size); }while(0) ^~~~ clif.cpp:2158:126: error: invalid application of ‘sizeof’ to incomplete type ‘clif_npc_market_open(map_session_data*, npc_data*)::PACKET_ZC_NPC_MARKET_OPEN_sub’ WFIFOHEAD( fd, sizeof( struct PACKET_ZC_NPC_MARKET_OPEN ) + nd->u.shop.count * sizeof( struct PACKET_ZC_NPC_MARKET_OPEN_sub ) ); ^ ../common/socket.hpp:30:71: note: in definition of macro ‘WFIFOHEAD’ #define WFIFOHEAD(fd, size) do{ if((fd) && session[fd]->wdata_size + (size) > session[fd]->max_wdata ) realloc_writefifo(fd, size); }while(0) ^~~~ clif.cpp:2158:58: error: invalid application of ‘sizeof’ to incomplete type ‘clif_npc_market_open(map_session_data*, npc_data*)::PACKET_ZC_NPC_MARKET_OPEN’ WFIFOHEAD( fd, sizeof( struct PACKET_ZC_NPC_MARKET_OPEN ) + nd->u.shop.count * sizeof( struct PACKET_ZC_NPC_MARKET_OPEN_sub ) ); ^ ../common/socket.hpp:30:126: note: in definition of macro ‘WFIFOHEAD’ #define WFIFOHEAD(fd, size) do{ if((fd) && session[fd]->wdata_size + (size) > session[fd]->max_wdata ) realloc_writefifo(fd, size); }while(0) ^~~~ clif.cpp:2158:126: error: invalid application of ‘sizeof’ to incomplete type ‘clif_npc_market_open(map_session_data*, npc_data*)::PACKET_ZC_NPC_MARKET_OPEN_sub’ WFIFOHEAD( fd, sizeof( struct PACKET_ZC_NPC_MARKET_OPEN ) + nd->u.shop.count * sizeof( struct PACKET_ZC_NPC_MARKET_OPEN_sub ) ); ^ ../common/socket.hpp:30:126: note: in definition of macro ‘WFIFOHEAD’ #define WFIFOHEAD(fd, size) do{ if((fd) && session[fd]->wdata_size + (size) > session[fd]->max_wdata ) realloc_writefifo(fd, size); }while(0) ^~~~ clif.cpp:2160:3: error: invalid use of incomplete type ‘struct clif_npc_market_open(map_session_data*, npc_data*)::PACKET_ZC_NPC_MARKET_OPEN’ p->packetType = HEADER_ZC_NPC_MARKET_OPEN; ^~ clif.cpp:2159:9: note: forward declaration of ‘struct clif_npc_market_open(map_session_data*, npc_data*)::PACKET_ZC_NPC_MARKET_OPEN’ struct PACKET_ZC_NPC_MARKET_OPEN *p = (struct PACKET_ZC_NPC_MARKET_OPEN *)WFIFOP( fd, 0 ); ^~~~~~~~~~~~~~~~~~~~~~~~~ clif.cpp:2160:18: error: ‘HEADER_ZC_NPC_MARKET_OPEN’ was not declared in this scope p->packetType = HEADER_ZC_NPC_MARKET_OPEN; ^~~~~~~~~~~~~~~~~~~~~~~~~ clif.cpp:2160:18: note: suggested alternative: ‘PACKET_ZC_NPC_MARKET_OPEN’ p->packetType = HEADER_ZC_NPC_MARKET_OPEN; ^~~~~~~~~~~~~~~~~~~~~~~~~ PACKET_ZC_NPC_MARKET_OPEN clif.cpp:2176:4: error: invalid use of incomplete type ‘struct clif_npc_market_open(map_session_data*, npc_data*)::PACKET_ZC_NPC_MARKET_OPEN’ p->list[count].nameid = client_nameid( item->nameid ); ^~ clif.cpp:2159:9: note: forward declaration of ‘struct clif_npc_market_open(map_session_data*, npc_data*)::PACKET_ZC_NPC_MARKET_OPEN’ struct PACKET_ZC_NPC_MARKET_OPEN *p = (struct PACKET_ZC_NPC_MARKET_OPEN *)WFIFOP( fd, 0 ); ^~~~~~~~~~~~~~~~~~~~~~~~~ clif.cpp:2177:4: error: invalid use of incomplete type ‘struct clif_npc_market_open(map_session_data*, npc_data*)::PACKET_ZC_NPC_MARKET_OPEN’ p->list[count].type = itemtype( item->nameid ); ^~ clif.cpp:2159:9: note: forward declaration of ‘struct clif_npc_market_open(map_session_data*, npc_data*)::PACKET_ZC_NPC_MARKET_OPEN’ struct PACKET_ZC_NPC_MARKET_OPEN *p = (struct PACKET_ZC_NPC_MARKET_OPEN *)WFIFOP( fd, 0 ); ^~~~~~~~~~~~~~~~~~~~~~~~~ clif.cpp:2178:4: error: invalid use of incomplete type ‘struct clif_npc_market_open(map_session_data*, npc_data*)::PACKET_ZC_NPC_MARKET_OPEN’ p->list[count].price = item->value; ^~ clif.cpp:2159:9: note: forward declaration of ‘struct clif_npc_market_open(map_session_data*, npc_data*)::PACKET_ZC_NPC_MARKET_OPEN’ struct PACKET_ZC_NPC_MARKET_OPEN *p = (struct PACKET_ZC_NPC_MARKET_OPEN *)WFIFOP( fd, 0 ); ^~~~~~~~~~~~~~~~~~~~~~~~~ clif.cpp:2179:4: error: invalid use of incomplete type ‘struct clif_npc_market_open(map_session_data*, npc_data*)::PACKET_ZC_NPC_MARKET_OPEN’ p->list[count].qty = item->qty; ^~ clif.cpp:2159:9: note: forward declaration of ‘struct clif_npc_market_open(map_session_data*, npc_data*)::PACKET_ZC_NPC_MARKET_OPEN’ struct PACKET_ZC_NPC_MARKET_OPEN *p = (struct PACKET_ZC_NPC_MARKET_OPEN *)WFIFOP( fd, 0 ); ^~~~~~~~~~~~~~~~~~~~~~~~~ clif.cpp:2180:4: error: invalid use of incomplete type ‘struct clif_npc_market_open(map_session_data*, npc_data*)::PACKET_ZC_NPC_MARKET_OPEN’ p->list[count].weight = id->weight; ^~ clif.cpp:2159:9: note: forward declaration of ‘struct clif_npc_market_open(map_session_data*, npc_data*)::PACKET_ZC_NPC_MARKET_OPEN’ struct PACKET_ZC_NPC_MARKET_OPEN *p = (struct PACKET_ZC_NPC_MARKET_OPEN *)WFIFOP( fd, 0 ); ^~~~~~~~~~~~~~~~~~~~~~~~~ clif.cpp:2184:3: error: invalid use of incomplete type ‘struct clif_npc_market_open(map_session_data*, npc_data*)::PACKET_ZC_NPC_MARKET_OPEN’ p->packetLength = sizeof( struct PACKET_ZC_NPC_MARKET_OPEN ) + count * sizeof( struct PACKET_ZC_NPC_MARKET_OPEN_sub ); ^~ clif.cpp:2159:9: note: forward declaration of ‘struct clif_npc_market_open(map_session_data*, npc_data*)::PACKET_ZC_NPC_MARKET_OPEN’ struct PACKET_ZC_NPC_MARKET_OPEN *p = (struct PACKET_ZC_NPC_MARKET_OPEN *)WFIFOP( fd, 0 ); ^~~~~~~~~~~~~~~~~~~~~~~~~ clif.cpp:2184:61: error: invalid application of ‘sizeof’ to incomplete type ‘clif_npc_market_open(map_session_data*, npc_data*)::PACKET_ZC_NPC_MARKET_OPEN’ p->packetLength = sizeof( struct PACKET_ZC_NPC_MARKET_OPEN ) + count * sizeof( struct PACKET_ZC_NPC_MARKET_OPEN_sub ); ^ clif.cpp:2184:118: error: invalid application of ‘sizeof’ to incomplete type ‘clif_npc_market_open(map_session_data*, npc_data*)::PACKET_ZC_NPC_MARKET_OPEN_sub’ p->packetLength = sizeof( struct PACKET_ZC_NPC_MARKET_OPEN ) + count * sizeof( struct PACKET_ZC_NPC_MARKET_OPEN_sub ); ^ clif.cpp:2185:17: error: invalid use of incomplete type ‘struct clif_npc_market_open(map_session_data*, npc_data*)::PACKET_ZC_NPC_MARKET_OPE’ WFIFOSET( fd, p->packetLength ); ^~ clif.cpp:2159:9: note: forward declaration of ‘struct clif_npc_market_open(map_session_data*, npc_data*)::PACKET_ZC_NPC_MARKET_OPEN’ struct PACKET_ZC_NPC_MARKET_OPEN *p = (struct PACKET_ZC_NPC_MARKET_OPEN *)WFIFOP( fd, 0 ); ^~~~~~~~~~~~~~~~~~~~~~~~~ In file included from clif.cpp:21:0: clif.cpp: In function ‘void clif_npc_market_purchase_ack(map_session_data*, uint8, uint8, s_npc_buy_list*)’: clif.cpp:2212:69: error: invalid application of ‘sizeof’ to incomplete type ‘clif_npc_market_purchase_ack(map_session_data*, uint8, uint8, s_npc_buy_list*)::PACKET_ZC_NPC_MARKET_PURCHASE_RESULT’ WFIFOHEAD( fd, sizeof( struct PACKET_ZC_NPC_MARKET_PURCHASE_RESULT ) + n * sizeof( struct PACKET_ZC_NPC_MARKET_PURCHASE_RESULT_sub ) ); ^ ../common/socket.hpp:30:71: note: in definition of macro ‘WFIFOHEAD’ #define WFIFOHEAD(fd, size) do{ if((fd) && session[fd]->wdata_size + (size) > session[fd]->max_wdata ) realloc_writefifo(fd, size); }while(0) ^~~~ clif.cpp:2212:69: error: invalid application of ‘sizeof’ to incomplete type ‘clif_npc_market_purchase_ack(map_session_data*, uint8, uint8, s_npc_buy_list*)::PACKET_ZC_NPC_MARKET_PURCHASE_RESULT’ WFIFOHEAD( fd, sizeof( struct PACKET_ZC_NPC_MARKET_PURCHASE_RESULT ) + n * sizeof( struct PACKET_ZC_NPC_MARKET_PURCHASE_RESULT_sub ) ); ^ ../common/socket.hpp:30:126: note: in definition of macro ‘WFIFOHEAD’ #define WFIFOHEAD(fd, size) do{ if((fd) && session[fd]->wdata_size + (size) > session[fd]->max_wdata ) realloc_writefifo(fd, size); }while(0) ^~~~ clif.cpp:2214:3: error: invalid use of incomplete type ‘struct clif_npc_market_purchase_ack(map_session_data*, uint8, uint8, s_npc_buy_list*)::PACKET_ZC_NPC_MARKET_PURCHASE_RESULT’ p->PacketType = HEADER_ZC_NPC_MARKET_PURCHASE_RESULT; ^~ clif.cpp:2213:9: note: forward declaration of ‘struct clif_npc_market_purchase_ack(map_session_data*, uint8, uint8, s_npc_buy_list*)::PACKET_ZC_NPC_MARKET_PURCHASE_RESULT’ struct PACKET_ZC_NPC_MARKET_PURCHASE_RESULT *p = (struct PACKET_ZC_NPC_MARKET_PURCHASE_RESULT *)WFIFOP( fd, 0 ); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ clif.cpp:2214:18: error: ‘HEADER_ZC_NPC_MARKET_PURCHASE_RESULT’ was not declared in this scope p->PacketType = HEADER_ZC_NPC_MARKET_PURCHASE_RESULT; ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ clif.cpp:2214:18: note: suggested alternative: ‘PACKET_ZC_NPC_MARKET_PURCHASE_RESULT’ p->PacketType = HEADER_ZC_NPC_MARKET_PURCHASE_RESULT; ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PACKET_ZC_NPC_MARKET_PURCHASE_RESULT clif.cpp:2219:3: error: invalid use of incomplete type ‘struct clif_npc_market_purchase_ack(map_session_data*, uint8, uint8, s_npc_buy_list*)::PACKET_ZC_NPC_MARKET_PURCHASE_RESULT’ p->result = ( res == 0 ? 1 : 0 ); ^~ clif.cpp:2213:9: note: forward declaration of ‘struct clif_npc_market_purchase_ack(map_session_data*, uint8, uint8, s_npc_buy_list*)::PACKET_ZC_NPC_MARKET_PURCHASE_RESULT’ struct PACKET_ZC_NPC_MARKET_PURCHASE_RESULT *p = (struct PACKET_ZC_NPC_MARKET_PURCHASE_RESULT *)WFIFOP( fd, 0 ); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ clif.cpp:2224:7: error: invalid use of incomplete type ‘struct clif_npc_market_purchase_ack(map_session_data*, uint8, uint8, s_npc_buy_list*)::PACKET_ZC_NPC_MARKET_PURCHASE_RESULT’ if( p->result ){ ^~ clif.cpp:2213:9: note: forward declaration of ‘struct clif_npc_market_purchase_ack(map_session_data*, uint8, uint8, s_npc_buy_list*)::PACKET_ZC_NPC_MARKET_PURCHASE_RESULT’ struct PACKET_ZC_NPC_MARKET_PURCHASE_RESULT *p = (struct PACKET_ZC_NPC_MARKET_PURCHASE_RESULT *)WFIFOP( fd, 0 ); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ clif.cpp:2233:5: error: invalid use of incomplete type ‘struct clif_npc_market_purchase_ack(map_session_data*, uint8, uint8, s_npc_buy_list*)::PACKET_ZC_NPC_MARKET_PURCHASE_RESULT’ p->list[count].ITID = client_nameid( list[i].nameid ); ^~ clif.cpp:2213:9: note: forward declaration of ‘struct clif_npc_market_purchase_ack(map_session_data*, uint8, uint8, s_npc_buy_list*)::PACKET_ZC_NPC_MARKET_PURCHASE_RESULT’ struct PACKET_ZC_NPC_MARKET_PURCHASE_RESULT *p = (struct PACKET_ZC_NPC_MARKET_PURCHASE_RESULT *)WFIFOP( fd, 0 ); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ clif.cpp:2234:5: error: invalid use of incomplete type ‘struct clif_npc_market_purchase_ack(map_session_data*, uint8, uint8, s_npc_buy_list*)::PACKET_ZC_NPC_MARKET_PURCHASE_RESULT’ p->list[count].qty = list[i].qty; ^~ clif.cpp:2213:9: note: forward declaration of ‘struct clif_npc_market_purchase_ack(map_session_data*, uint8, uint8, s_npc_buy_list*)::PACKET_ZC_NPC_MARKET_PURCHASE_RESULT’ struct PACKET_ZC_NPC_MARKET_PURCHASE_RESULT *p = (struct PACKET_ZC_NPC_MARKET_PURCHASE_RESULT *)WFIFOP( fd, 0 ); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ clif.cpp:2235:5: error: invalid use of incomplete type ‘struct clif_npc_market_purchase_ack(map_session_data*, uint8, uint8, s_npc_buy_list*)::PACKET_ZC_NPC_MARKET_PURCHASE_RESULT’ p->list[count].price = nd->u.shop.shop_item[j].value; ^~ clif.cpp:2213:9: note: forward declaration of ‘struct clif_npc_market_purchase_ack(map_session_data*, uint8, uint8, s_npc_buy_list*)::PACKET_ZC_NPC_MARKET_PURCHASE_RESULT’ struct PACKET_ZC_NPC_MARKET_PURCHASE_RESULT *p = (struct PACKET_ZC_NPC_MARKET_PURCHASE_RESULT *)WFIFOP( fd, 0 ); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ clif.cpp:2240:3: error: invalid use of incomplete type ‘struct clif_npc_market_purchase_ack(map_session_data*, uint8, uint8, s_npc_buy_list*)::PACKET_ZC_NPC_MARKET_PURCHASE_RESULT’ p->PacketLength = sizeof( struct PACKET_ZC_NPC_MARKET_PURCHASE_RESULT ) + count * sizeof( struct PACKET_ZC_NPC_MARKET_PURCHASE_RESULT_sub ); ^~ clif.cpp:2213:9: note: forward declaration of ‘struct clif_npc_market_purchase_ack(map_session_data*, uint8, uint8, s_npc_buy_list*)::PACKET_ZC_NPC_MARKET_PURCHASE_RESULT’ struct PACKET_ZC_NPC_MARKET_PURCHASE_RESULT *p = (struct PACKET_ZC_NPC_MARKET_PURCHASE_RESULT *)WFIFOP( fd, 0 ); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ clif.cpp:2240:72: error: invalid application of ‘sizeof’ to incomplete type ‘clif_npc_market_purchase_ack(map_session_data*, uint8, uint8, s_npc_buy_list*)::PACKET_ZC_NPC_MARKET_PURCHASE_RESULT’ p->PacketLength = sizeof( struct PACKET_ZC_NPC_MARKET_PURCHASE_RESULT ) + count * sizeof( struct PACKET_ZC_NPC_MARKET_PURCHASE_RESULT_sub ); ^ clif.cpp:2241:17: error: invalid use of incomplete type ‘struct clif_npc_market_purchase_ack(map_session_data*, uint8, uint8, s_npc_buy_list*)::PACKET_ZC_NPC_MARKET_PURCHASE_RESULT’ WFIFOSET( fd, p->PacketLength ); ^~ clif.cpp:2213:9: note: forward declaration of ‘struct clif_npc_market_purchase_ack(map_session_data*, uint8, uint8, s_npc_buy_list*)::PACKET_ZC_NPC_MARKET_PURCHASE_RESULT’ struct PACKET_ZC_NPC_MARKET_PURCHASE_RESULT *p = (struct PACKET_ZC_NPC_MARKET_PURCHASE_RESULT *)WFIFOP( fd, 0 ); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ clif.cpp: In function ‘void clif_hotkeys_send(map_session_data*, int)’: clif.cpp:10836:37: error: aggregate ‘clif_hotkeys_send(map_session_data*, int)::PACKET_ZC_SHORTCUT_KEY_LIST p’ has incomplete type and cannot be defined struct PACKET_ZC_SHORTCUT_KEY_LIST p; ^ clif.cpp:10838:17: error: ‘HEADER_ZC_SHORTCUT_KEY_LIST’ was not declared in this scope p.packetType = HEADER_ZC_SHORTCUT_KEY_LIST; ^~~~~~~~~~~~~~~~~~~~~~~~~~~ clif.cpp:10838:17: note: suggested alternative: ‘PACKET_ZC_SHORTCUT_KEY_LIST’ p.packetType = HEADER_ZC_SHORTCUT_KEY_LIST; ^~~~~~~~~~~~~~~~~~~~~~~~~~~ PACKET_ZC_SHORTCUT_KEY_LIST clif.cpp:10852:50: error: ‘MAX_HOTKEYS_PACKET’ was not declared in this scope for( int i = 0, offset = tab * MAX_HOTKEYS; i < MAX_HOTKEYS_PACKET; i++ ){ ^~~~~~~~~~~~~~~~~~ clif.cpp:10852:50: note: suggested alternative: ‘MAX_HOTKEYS_DB’ for( int i = 0, offset = tab * MAX_HOTKEYS; i < MAX_HOTKEYS_PACKET; i++ ){ ^~~~~~~~~~~~~~~~~~ MAX_HOTKEYS_DB clif.cpp:10858:58: error: invalid application of ‘sizeof’ to incomplete type ‘clif_hotkeys_send(map_session_data*, int)::PACKET_ZC_SHORTCUT_KEY_LIST’ clif_send( &p, sizeof(struct PACKET_ZC_SHORTCUT_KEY_LIST), &sd->bl, SELF ); ^ Makefile:83: recipe for target 'obj/clif.o' failed make[1]: *** [obj/clif.o] Error 1 make[1]: Leaving directory '/home/chappo/Repos/rathena/src/map' Makefile:50: recipe for target 'map' failed make: *** [map] Error 2 chmod: cannot access 'map-server': No such file or directory To attempt to remedy this issue I have: deleted the clone and re-pulled chmod -R 777 the entire repo (why not?) ensured that the clif.cpp and socket.hpp exist down/upgraded from gcc/g++ 5-8 (currently back to 5) Searched the following: search 1 search 2 google search Any help would be appreciated. Notes: o LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.4 LTS Release: 18.04 Codename: bionic Using built-in specs. COLLECT_GCC=g++ COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper OFFLOAD_TARGET_NAMES=nvptx-none OFFLOAD_TARGET_DEFAULT=1 Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.5.0-3ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu Thread model: posix gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04) This is what it looks like now. (I am still messing around trying to get it working) Thanks! socket.hpp clif.cpp
  5. Hi,I used to play ragnarok alot as a kid and now I kinda want to come and enjoy the game I loved.Trough various guides I managed to setup a hercules dedicated server on ubuntu (SVN). I realized there are some sprites/items and maps my current patched ragexe doesn't have.Now I spent the last probably 24hrs figuring out how to make my own client with english translations and (for now) no costum items - just a plain old pre-renewal client.Somehow I cannot wrap my head around this topic at all, I run into errors all the time, trying to fix one issue brings up further.I am giving up. Spent alot of time looking for guides, those were mostly ages ago and didn't work in the end.It may be that I am the issue for not understanding what I need to do. At this point I am desperately looking for help - either coaching me to do what needs to be done or build me the client I need.I am willing to pay a fair price, maybe someone is interested OR could provide an up-to-date guide on how to handle stuff.Thank you for your time and any help is appreciated.my discord huptiq#4993 PS I did post it on hercules board aswell and asked in serveral discord channel, nothing yet edit: solved, do not use a new client for pre-renewal server // 2019-05-30aRagexe works with NEMO + translation
  6. Edit: I somehow got a bad version of the files from GitHub, after re-cloning the git it worked fine. I am having issues compiling the server. I am running on Ubuntu and even after Rebooting/Updating/Upgrading/Fresh Pull from Git/etc. I am having errors during the build and I'm not sure what I'm doing wrong. Attached is the output from make. make[1]: Entering directory '/root/rathena/src/map' MKDIR obj CXX achievement.cpp In file included from achievement.cpp:21: battle.hpp:714:9: error: invalid digit "8" in octal constant 714 | >>>>>>> 0828ff00c630d6bcfa7a42826919867f0b8e5250 | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from itemdb.hpp:16, from achievement.cpp:25: status.hpp:95:9: error: invalid digit "8" in octal constant 95 | >>>>>>> 0828ff00c630d6bcfa7a42826919867f0b8e5250 | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ status.hpp:115:9: error: invalid digit "8" in octal constant 115 | >>>>>>> 0828ff00c630d6bcfa7a42826919867f0b8e5250 | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from achievement.cpp:29: pc.hpp:396:9: error: invalid digit "8" in octal constant 396 | >>>>>>> 0828ff00c630d6bcfa7a42826919867f0b8e5250 | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from achievement.cpp:29: pc.hpp:1079:9: error: invalid digit "8" in octal constant 1079 | >>>>>>> 0828ff00c630d6bcfa7a42826919867f0b8e5250 | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from achievement.cpp:21: battle.hpp:692:1: error: version control conflict marker in file 692 | <<<<<<< HEAD | ^~~~~~~ battle.hpp:713:1: error: version control conflict marker in file 713 | ======= | ^~~~~~~ In file included from itemdb.hpp:16, from achievement.cpp:25: status.hpp:92:1: error: version control conflict marker in file 92 | <<<<<<< HEAD | ^~~~~~~ status.hpp:94:1: error: version control conflict marker in file 94 | ======= | ^~~~~~~ status.hpp:102:1: error: version control conflict marker in file 102 | <<<<<<< HEAD | ^~~~~~~ status.hpp:109:1: error: version control conflict marker in file 109 | ======= | ^~~~~~~ status.hpp:111:30: error: ‘YAML’ does not name a type 111 | uint64 parseBodyNode( const YAML::Node& node ); | ^~~~ status.hpp:111:40: error: expected unqualified-id before ‘&’ token 111 | uint64 parseBodyNode( const YAML::Node& node ); | ^ status.hpp:111:40: error: expected ‘)’ before ‘&’ token 111 | uint64 parseBodyNode( const YAML::Node& node ); | ~ ^ | ) status.hpp:111:40: error: expected ‘;’ at end of member declaration 111 | uint64 parseBodyNode( const YAML::Node& node ); | ^ | ; status.hpp:111:42: error: ‘node’ does not name a type 111 | uint64 parseBodyNode( const YAML::Node& node ); | ^~~~ status.hpp:114:39: error: ‘std::shared_ptr<s_refine_level_info> RefineDatabase::findLevelInfo(const item_data&, item&)’ cannot be overloaded with ‘std::shared_ptr<s_refine_level_info> RefineDatabase::findLevelInfo(const item_data&, item&)’ 114 | std::shared_ptr<s_refine_level_info> findLevelInfo( const struct item_data& data, struct item& item ); | ^~~~~~~~~~~~~ status.hpp:107:39: note: previous declaration ‘std::shared_ptr<s_refine_level_info> RefineDatabase::findLevelInfo(const item_data&, item&)’ 107 | std::shared_ptr<s_refine_level_info> findLevelInfo( const struct item_data& data, struct item& item ); | ^~~~~~~~~~~~~ status.hpp:115:1: error: version control conflict marker in file 115 | >>>>>>> 0828ff00c630d6bcfa7a42826919867f0b8e5250 | ^~~~~~~ status.hpp:118:23: error: cannot declare variable ‘refine_db’ to be of abstract type ‘RefineDatabase’ 118 | extern RefineDatabase refine_db; | ^~~~~~~~~ status.hpp:89:7: note: because the following virtual functions are pure within ‘RefineDatabase’: 89 | class RefineDatabase : public TypesafeYamlDatabase<uint16, s_refine_info>{ | ^~~~~~~~~~~~~~ In file included from achievement.hpp:15, from achievement.cpp:4: ../common/database.hpp:77:28: note: ‘virtual const string YamlDatabase::getDefaultLocation()’ 77 | virtual const std::string getDefaultLocation() = 0; | ^~~~~~~~~~~~~~~~~~ In file included from achievement.cpp:29: pc.hpp:390:1: error: version control conflict marker in file 390 | <<<<<<< HEAD | ^~~~~~~ pc.hpp:395:1: error: version control conflict marker in file 395 | ======= | ^~~~~~~ In file included from achievement.cpp:29: pc.hpp:1063:1: error: version control conflict marker in file 1063 | <<<<<<< HEAD | ^~~~~~~ pc.hpp: In function ‘bool pc_cant_act(map_session_data*)’: pc.hpp:1073:37: error: ‘pc_cant_act2’ was not declared in this scope 1073 | return sd->npc_id || sd->chatID || pc_cant_act2( sd ); | ^~~~~~~~~~~~ pc.hpp:1073:37: note: the macro ‘pc_cant_act2’ had not yet been defined pc.hpp:1078: note: it was later defined here 1078 | #define pc_cant_act2(sd) ( (sd)->state.vending || (sd)->state.buyingstore || ((sd)->sc.opt1 && (sd)->sc.opt1 != OPT1_BURNING) || (sd)->state.trading || (sd)->state.storage_flag || (sd)->state.prevend || (sd)->state.refineui_open ) | pc.hpp: At global scope: pc.hpp:1075:1: error: version control conflict marker in file 1075 | ======= | ^~~~~~~ make[1]: *** [Makefile:84: obj/achievement.o] Error 1 make[1]: Leaving directory '/root/rathena/src/map' make: *** [Makefile:50: map] Error 2
  7. Hello can anyone help me. I've tried everything.. both on ubuntu server and on CentOS but when I compile [rathena4444@vps ~]$ ./configure -bash: ./configure: No such file or directory " -------later----- [rathena4444@vps rAthena]$ make clean server make: *** No rule to make target `clean'. Stop. -------later----- [rathena4444@coquine rAthena]$ make server make: *** No rule to make target `server'. Stop. [rathena4444@coquine rAthena]$ "It doesn't work and when I try to start it appears" [rathena4444@coquine rAthena]$ chmod a+x athena-start [rathena4444@coquine rAthena]$ ./athena-start start rAthena is starting... (c) 2021 rAthena Project checking... login-server does not exist... exiting... [rathena4444@coquine rAthena]$ please some blessed soul to help me? explain to me what is going on?
  8. Sory how to solve this?? CXX unit.cpp CXX vending.cpp LD map-server obj/channel.o: In function `channel_send(Channel*, map_session_data*, char const*)': /home/rathena/src/map/channel.cpp:460: undefined reference to `discord_send(char const*, char const*, char const*)' obj/map.o: In function `do_init(int, char**)': /home/rathena/src/map/map.cpp:5257: undefined reference to `discord_init()' obj/mob.o: In function `mob_dead(mob_data*, block_list*, int)': /home/rathena/src/map/mob.cpp:2802: undefined reference to `discord_announce_drop(char const*)' obj/script.o: In function `buildin_discord(script_state*)': /home/rathena/src/map/../custom/script.inc:27: undefined reference to `discord_script(char const*, char const*)' collect2: error: ld returned 1 exit status Makefile:72: recipe for target 'map-server' failed make[1]: *** [map-server] Error 1 make[1]: Leaving directory '/home/rathena/src/map' Makefile:50: recipe for target 'map' failed make: *** [map] Error 2 root@ubuntu:/home/rathena# and where file name index.js ?? thx for answer
  9. So I decided to start from scratch. Spun up a new 18.04 and installed only what was needed. I am still having the same issue with (I believe) no interfering applications. I've attached a full copy of the output for review as well. Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Ubuntu 5.5.0-12ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu Thread model: posix gcc version 5.5.0 20171010 (Ubuntu 5.5.0-12ubuntu1) Using built-in specs. COLLECT_GCC=g++ COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Ubuntu 5.5.0-12ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu Thread model: posix gcc version 5.5.0 20171010 (Ubuntu 5.5.0-12ubuntu1) chappo@chappie-linux:~/Repos/rathena/shell-scripts$ make-server-dump.txt
  10. I'm currently trying to build my server on a PC with Ubuntu But when I try to "make server" it shows a lot of warning and Makefile 50 : recipe for target 'map' failed (as shown in the picture) Seems like it fail to create the "map server" I was following the tutorial from here: https://www.vultr.com/docs/setup-ragnarok-online-server-on-ubuntu-14-04-x64 Is there anything wrong in the tutorial? or in what part I probably mess up?
  11. Hi, first of all, this package just for "education purposes". The main mission of it does not give you or any other guy a complete solution, but just give you simple entry point to start from. I know how hard for newbies do everything that done by 10-15 minutes by me in the package without proper documentation and so on. This is just very primitive template how +- everything looks like. Nothing more. If you wish to make a RO server where others will connect to from their homes, you should follow the template, edit some settings and make your own one and host it on linux server (Digital Ocean for example). The main ideas and "howtos" explained in the first post of the topic. Rest is on users own. But the abstract basic things will be always the same. That means you always need some mysql-like server, some client, server-side compiled (for linux platform, or for windows, depends on where will you host the server), you need configuring clientinfo.xml in your grf and etc. So, if answer directly to your question "Could others connect to this server in the package from their homes"? I will answer -> yes they can. Easier way -> make sure you have white IP (IP address which is accessed from the internet) or you have rent windows server (which is costly to be clear) and just follow few mini-steps explained in the first post (like you do it when launching on windows) but with only one difference. You should edit inside grf clientinfo.xml and change 127.0.0.1 to your public ip address of your white ip address to make able others to connect. But this is very insecure, and not recommend method at all. The "true" way how to make an RO server is: Buy any linux-based VPS (cent-os, or ubuntu, or debian) with at least 1GB of RAM (there are really a lot of providers which selling it) Follow official guide and try to setup everything (install mysql server, install important software required for server compiling) Configure server-side config files to make able others to connect to the server Configure mysql-server, create databases, create users with permissions which will be able to connect to mysql-server and read/write to the database setup client test everything play
  12. Hi there, I'm having an issue compiling the latest build on Ubuntu, full compile is below; rathena@roserver:/home/rathena# git pull Already up-to-date. rathena@roserver:/home/rathena# ./configure --enable-64bit --with-MYSQL_LIBS=/usr/lib/x86_64-linux-gnu/libmysqlclient.so.18 checking for gcc... gcc checking whether the C compiler works... yes checking for C compiler default output file name... a.out checking for suffix of executables... checking whether we are cross compiling... no checking for suffix of object files... o checking whether we are using the GNU C compiler... yes checking whether gcc accepts -g... yes checking for gcc option to accept ISO C89... none needed checking how to run the C preprocessor... gcc -E checking for grep that handles long lines and -e... /bin/grep checking for egrep... /bin/grep -E checking for ANSI C header files... yes checking for sys/types.h... yes checking for sys/stat.h... yes checking for stdlib.h... yes checking for string.h... yes checking for memory.h... yes checking for strings.h... yes checking for inttypes.h... yes checking for stdint.h... yes checking for unistd.h... yes checking minix/config.h usability... no checking minix/config.h presence... no checking for minix/config.h... no checking whether it is safe to define __EXTENSIONS__... yes checking whether make sets $(MAKE)... yes checking for gcc... (cached) gcc checking whether we are using the GNU C compiler... (cached) yes checking whether gcc accepts -g... (cached) yes checking for gcc option to accept ISO C89... (cached) none needed checking for g++... g++ checking whether we are using the GNU C++ compiler... yes checking whether g++ accepts -g... yes checking for ar... /usr/bin/ar checking whether byte ordering is bigendian... no checking whether gcc produces 32bit code... no checking whether gcc supports __thread specifier (TLS)... yes checking whether gcc supports -ffat-lto-objects... yes checking whether gcc supports -flto -fuse-linker-plugin... yes checking whether gcc supports -Wno-unused-parameter... yes checking whether gcc can actually use -Wno-unused-parameter... not needed but enabled checking whether gcc supports -Wempty-body... yes checking whether gcc supports -Wno-switch... yes checking whether gcc supports -Wno-missing-field-initializers... yes checking whether compiler is clang... no checking whether gcc supports -Wno-maybe-uninitialized... yes checking whether gcc supports -Wno-clobbered... yes checking whether gcc supports -Wshadow... yes checking whether gcc can efficiently use -Wshadow... yes checking whether gcc supports -fPIC... yes checking how to make shared objects... not supported configure: compiler is unable to generate shared objects, disabled plugins (optional) checking whether gcc supports -fno-strict-aliasing... yes checking for setrlimit... yes checking for strnlen... yes checking for uselocale... yes checking for newlocale... yes checking for freelocale... yes checking for xlocale.h... yes checking for library containing inflateEnd... -lz checking for zlib.h... yes checking for library containing sqrt... none required checking for library containing clock_gettime... none required checking whether CLOCK_MONOTONIC is supported and works... yes checking for library containing pthread_create... -lpthread checking for library containing pthread_sigmask... none required checking for library containing pthread_attr_init... none required checking for library containing pthread_attr_setstacksize... none required checking for library containing pthread_attr_destroy... none required checking for library containing pthread_cancel... none required checking for library containing pthread_join... none required checking for mysql_config... /usr/bin/mysql_config checking for mysql_init in -lmysqlclient... yes checking mysql.h usability... yes checking mysql.h presence... no configure: WARNING: mysql.h: accepted by the compiler, rejected by the preprocessor! configure: WARNING: mysql.h: proceeding with the compiler's result checking for mysql.h... yes checking MySQL library (required)... yes (5.5.57) checking for library containing pcre_study... -lpcre checking PCRE library (optional)... yes (8.31) checking host OS... Linux checking for MinGW... no configure: Configure finish configure: CPPFLAGS= -DMAXCONN=16384 -I../common -DHAS_TLS -DHAVE_SETRLIMIT -DHAVE_STRNLEN -I/usr/include -DHAVE_MONOTONIC_CLOCK configure: CFLAGS= -flto -fuse-linker-plugin -g -O2 -pipe -ffast-math -Wall -Wempty-body -Wno-switch -Wno-missing-field-initializers -Wno-maybe-uninitialized -Wno-clobbered -Wshadow -fno-strict-aliasing configure: CFLAGS_AR= -flto -fuse-linker-plugin -ffat-lto-objects -flto -fuse-linker-plugin -g -O2 -pipe -ffast-math -Wall -Wempty-body -Wno-switch -Wno-missing-field-initializers -Wno-maybe-uninitialized -Wno-clobbered -Wshadow -fno-strict-aliasing configure: LDFLAGS= -L/usr/lib configure: output name = login-server, char-server, map-server configure: creating ./config.status config.status: creating Makefile config.status: creating src/common/Makefile config.status: creating 3rdparty/mt19937ar/Makefile config.status: creating 3rdparty/libconfig/Makefile config.status: creating 3rdparty/yaml-cpp/Makefile config.status: creating src/char/Makefile config.status: creating src/login/Makefile config.status: creating src/map/Makefile config.status: creating src/tool/Makefile rathena@roserver:/home/rathena# make clean make[1]: Entering directory `/home/rathena/src/common' CLEAN common make[1]: Leaving directory `/home/rathena/src/common' make[1]: Entering directory `/home/rathena/3rdparty/mt19937ar' CLEAN mt19937ar make[1]: Leaving directory `/home/rathena/3rdparty/mt19937ar' make[1]: Entering directory `/home/rathena/3rdparty/libconfig' CLEAN libconfig make[1]: Leaving directory `/home/rathena/3rdparty/libconfig' make[1]: Entering directory `/home/rathena/3rdparty/yaml-cpp' CLEAN yaml-cpp make[1]: Leaving directory `/home/rathena/3rdparty/yaml-cpp' make[1]: Entering directory `/home/rathena/src/login' CLEAN login make[1]: Leaving directory `/home/rathena/src/login' make[1]: Entering directory `/home/rathena/src/char' CLEAN char make[1]: Leaving directory `/home/rathena/src/char' make[1]: Entering directory `/home/rathena/src/map' CLEAN map make[1]: Leaving directory `/home/rathena/src/map' make[1]: Entering directory `/home/rathena/src/tool' CLEAN tool make[1]: Leaving directory `/home/rathena/src/tool' rathena@roserver:/home/rathena# make server make[1]: Entering directory `/home/rathena/3rdparty/mt19937ar' CC mt19937ar.c make[1]: Leaving directory `/home/rathena/3rdparty/mt19937ar' make[1]: Entering directory `/home/rathena/3rdparty/libconfig' MKDIR obj CC grammar.c CC libconfig.c CC scanctx.c CC scanner.c CC strbuf.c AR obj/libconfig.a make[1]: Leaving directory `/home/rathena/3rdparty/libconfig' make[1]: Entering directory `/home/rathena/3rdparty/yaml-cpp' MKDIR obj/src/contrib CXX src/memory.cpp In file included from include/yaml-cpp/node/detail/node.h:14:0, from src/memory.cpp:2: include/yaml-cpp/node/detail/node_ref.h: In member function 'void YAML::detail::node_ref::set_mark(const YAML::Mark&)': include/yaml-cpp/node/detail/node_ref.h:33:35: warning: declaration of 'mark' shadows a member of 'this' [-Wshadow] void set_mark(const Mark& mark) { m_pData->set_mark(mark); } ^ include/yaml-cpp/node/detail/node_ref.h: In member function 'void YAML::detail::node_ref::set_type(YAML::NodeType::value)': include/yaml-cpp/node/detail/node_ref.h:34:39: warning: declaration of 'type' shadows a member of 'this' [-Wshadow] void set_type(NodeType::value type) { m_pData->set_type(type); } ^ include/yaml-cpp/node/detail/node_ref.h: In member function 'void YAML::detail::node_ref::set_tag(const string&)': include/yaml-cpp/node/detail/node_ref.h:35:40: warning: declaration of 'tag' shadows a member of 'this' [-Wshadow] void set_tag(const std::string& tag) { m_pData->set_tag(tag); } ^ include/yaml-cpp/node/detail/node_ref.h: In member function 'void YAML::detail::node_ref::set_scalar(const string&)': include/yaml-cpp/node/detail/node_ref.h:37:46: warning: declaration of 'scalar' shadows a member of 'this' [-Wshadow] void set_scalar(const std::string& scalar) { m_pData->set_scalar(scalar); } ^ include/yaml-cpp/node/detail/node_ref.h: In member function 'void YAML::detail::node_ref::set_style(YAML::EmitterStyle::value)': include/yaml-cpp/node/detail/node_ref.h:38:45: warning: declaration of 'style' shadows a member of 'this' [-Wshadow] void set_style(EmitterStyle::value style) { m_pData->set_style(style); } ^ In file included from src/memory.cpp:2:0: include/yaml-cpp/node/detail/node.h: In member function 'void YAML::detail::node::set_mark(const YAML::Mark&)': include/yaml-cpp/node/detail/node.h:69:35: warning: declaration of 'mark' shadows a member of 'this' [-Wshadow] void set_mark(const Mark& mark) { m_pRef->set_mark(mark); } ^ include/yaml-cpp/node/detail/node.h: In member function 'void YAML::detail::node::set_type(YAML::NodeType::value)': include/yaml-cpp/node/detail/node.h:71:39: warning: declaration of 'type' shadows a member of 'this' [-Wshadow] void set_type(NodeType::value type) { ^ include/yaml-cpp/node/detail/node.h: In member function 'void YAML::detail::node::set_scalar(const string&)': include/yaml-cpp/node/detail/node.h:80:46: warning: declaration of 'scalar' shadows a member of 'this' [-Wshadow] void set_scalar(const std::string& scalar) { ^ include/yaml-cpp/node/detail/node.h: In member function 'void YAML::detail::node::set_tag(const string&)': include/yaml-cpp/node/detail/node.h:84:40: warning: declaration of 'tag' shadows a member of 'this' [-Wshadow] void set_tag(const std::string& tag) { ^ include/yaml-cpp/node/detail/node.h: In member function 'void YAML::detail::node::set_style(YAML::EmitterStyle::value)': include/yaml-cpp/node/detail/node.h:90:45: warning: declaration of 'style' shadows a member of 'this' [-Wshadow] void set_style(EmitterStyle::value style) { ^ CXX src/stream.cpp CXX src/exp.cpp CXX src/scanner.cpp src/scanner.cpp: In member function 'void YAML::Scanner::ThrowParserException(const string&) const': src/scanner.cpp:379:8: warning: declaration of 'mark' shadows a member of 'this' [-Wshadow] Mark mark = Mark::null_mark(); ^ CXX src/parse.cpp In file included from include/yaml-cpp/node/detail/node.h:14:0, from include/yaml-cpp/node/impl.h:13, from src/parse.cpp:7: include/yaml-cpp/node/detail/node_ref.h: In member function 'void YAML::detail::node_ref::set_mark(const YAML::Mark&)': include/yaml-cpp/node/detail/node_ref.h:33:35: warning: declaration of 'mark' shadows a member of 'this' [-Wshadow] void set_mark(const Mark& mark) { m_pData->set_mark(mark); } ^ include/yaml-cpp/node/detail/node_ref.h: In member function 'void YAML::detail::node_ref::set_type(YAML::NodeType::value)': include/yaml-cpp/node/detail/node_ref.h:34:39: warning: declaration of 'type' shadows a member of 'this' [-Wshadow] void set_type(NodeType::value type) { m_pData->set_type(type); } ^ include/yaml-cpp/node/detail/node_ref.h: In member function 'void YAML::detail::node_ref::set_tag(const string&)': include/yaml-cpp/node/detail/node_ref.h:35:40: warning: declaration of 'tag' shadows a member of 'this' [-Wshadow] void set_tag(const std::string& tag) { m_pData->set_tag(tag); } ^ include/yaml-cpp/node/detail/node_ref.h: In member function 'void YAML::detail::node_ref::set_scalar(const string&)': include/yaml-cpp/node/detail/node_ref.h:37:46: warning: declaration of 'scalar' shadows a member of 'this' [-Wshadow] void set_scalar(const std::string& scalar) { m_pData->set_scalar(scalar); } ^ include/yaml-cpp/node/detail/node_ref.h: In member function 'void YAML::detail::node_ref::set_style(YAML::EmitterStyle::value)': include/yaml-cpp/node/detail/node_ref.h:38:45: warning: declaration of 'style' shadows a member of 'this' [-Wshadow] void set_style(EmitterStyle::value style) { m_pData->set_style(style); } ^ In file included from include/yaml-cpp/node/impl.h:13:0, from src/parse.cpp:7: include/yaml-cpp/node/detail/node.h: In member function 'void YAML::detail::node::set_mark(const YAML::Mark&)': include/yaml-cpp/node/detail/node.h:69:35: warning: declaration of 'mark' shadows a member of 'this' [-Wshadow] void set_mark(const Mark& mark) { m_pRef->set_mark(mark); } ^ include/yaml-cpp/node/detail/node.h: In member function 'void YAML::detail::node::set_type(YAML::NodeType::value)': include/yaml-cpp/node/detail/node.h:71:39: warning: declaration of 'type' shadows a member of 'this' [-Wshadow] void set_type(NodeType::value type) { ^ include/yaml-cpp/node/detail/node.h: In member function 'void YAML::detail::node::set_scalar(const string&)': include/yaml-cpp/node/detail/node.h:80:46: warning: declaration of 'scalar' shadows a member of 'this' [-Wshadow] void set_scalar(const std::string& scalar) { ^ include/yaml-cpp/node/detail/node.h: In member function 'void YAML::detail::node::set_tag(const string&)': include/yaml-cpp/node/detail/node.h:84:40: warning: declaration of 'tag' shadows a member of 'this' [-Wshadow] void set_tag(const std::string& tag) { ^ include/yaml-cpp/node/detail/node.h: In member function 'void YAML::detail::node::set_style(YAML::EmitterStyle::value)': include/yaml-cpp/node/detail/node.h:90:45: warning: declaration of 'style' shadows a member of 'this' [-Wshadow] void set_style(EmitterStyle::value style) { ^ CXX src/node.cpp CXX src/regex_yaml.cpp CXX src/singledocparser.cpp CXX src/node_data.cpp In file included from include/yaml-cpp/node/detail/node.h:14:0, from src/node_data.cpp:7: include/yaml-cpp/node/detail/node_ref.h: In member function 'void YAML::detail::node_ref::set_mark(const YAML::Mark&)': include/yaml-cpp/node/detail/node_ref.h:33:35: warning: declaration of 'mark' shadows a member of 'this' [-Wshadow] void set_mark(const Mark& mark) { m_pData->set_mark(mark); } ^ include/yaml-cpp/node/detail/node_ref.h: In member function 'void YAML::detail::node_ref::set_type(YAML::NodeType::value)': include/yaml-cpp/node/detail/node_ref.h:34:39: warning: declaration of 'type' shadows a member of 'this' [-Wshadow] void set_type(NodeType::value type) { m_pData->set_type(type); } ^ include/yaml-cpp/node/detail/node_ref.h: In member function 'void YAML::detail::node_ref::set_tag(const string&)': include/yaml-cpp/node/detail/node_ref.h:35:40: warning: declaration of 'tag' shadows a member of 'this' [-Wshadow] void set_tag(const std::string& tag) { m_pData->set_tag(tag); } ^ include/yaml-cpp/node/detail/node_ref.h: In member function 'void YAML::detail::node_ref::set_scalar(const string&)': include/yaml-cpp/node/detail/node_ref.h:37:46: warning: declaration of 'scalar' shadows a member of 'this' [-Wshadow] void set_scalar(const std::string& scalar) { m_pData->set_scalar(scalar); } ^ include/yaml-cpp/node/detail/node_ref.h: In member function 'void YAML::detail::node_ref::set_style(YAML::EmitterStyle::value)': include/yaml-cpp/node/detail/node_ref.h:38:45: warning: declaration of 'style' shadows a member of 'this' [-Wshadow] void set_style(EmitterStyle::value style) { m_pData->set_style(style); } ^ In file included from src/node_data.cpp:7:0: include/yaml-cpp/node/detail/node.h: In member function 'void YAML::detail::node::set_mark(const YAML::Mark&)': include/yaml-cpp/node/detail/node.h:69:35: warning: declaration of 'mark' shadows a member of 'this' [-Wshadow] void set_mark(const Mark& mark) { m_pRef->set_mark(mark); } ^ include/yaml-cpp/node/detail/node.h: In member function 'void YAML::detail::node::set_type(YAML::NodeType::value)': include/yaml-cpp/node/detail/node.h:71:39: warning: declaration of 'type' shadows a member of 'this' [-Wshadow] void set_type(NodeType::value type) { ^ include/yaml-cpp/node/detail/node.h: In member function 'void YAML::detail::node::set_scalar(const string&)': include/yaml-cpp/node/detail/node.h:80:46: warning: declaration of 'scalar' shadows a member of 'this' [-Wshadow] void set_scalar(const std::string& scalar) { ^ include/yaml-cpp/node/detail/node.h: In member function 'void YAML::detail::node::set_tag(const string&)': include/yaml-cpp/node/detail/node.h:84:40: warning: declaration of 'tag' shadows a member of 'this' [-Wshadow] void set_tag(const std::string& tag) { ^ include/yaml-cpp/node/detail/node.h: In member function 'void YAML::detail::node::set_style(YAML::EmitterStyle::value)': include/yaml-cpp/node/detail/node.h:90:45: warning: declaration of 'style' shadows a member of 'this' [-Wshadow] void set_style(EmitterStyle::value style) { ^ src/node_data.cpp: In member function 'void YAML::detail::node_data::set_mark(const YAML::Mark&)': src/node_data.cpp:31:42: warning: declaration of 'mark' shadows a member of 'this' [-Wshadow] void node_data::set_mark(const Mark& mark) { m_mark = mark; } ^ src/node_data.cpp: In member function 'void YAML::detail::node_data::set_type(YAML::NodeType::value)': src/node_data.cpp:33:46: warning: declaration of 'type' shadows a member of 'this' [-Wshadow] void node_data::set_type(NodeType::value type) { ^ src/node_data.cpp: In member function 'void YAML::detail::node_data::set_tag(const string&)': src/node_data.cpp:64:47: warning: declaration of 'tag' shadows a member of 'this' [-Wshadow] void node_data::set_tag(const std::string& tag) { m_tag = tag; } ^ src/node_data.cpp: In member function 'void YAML::detail::node_data::set_style(YAML::EmitterStyle::value)': src/node_data.cpp:66:52: warning: declaration of 'style' shadows a member of 'this' [-Wshadow] void node_data::set_style(EmitterStyle::value style) { m_style = style; } ^ src/node_data.cpp: In member function 'void YAML::detail::node_data::set_scalar(const string&)': src/node_data.cpp:73:53: warning: declaration of 'scalar' shadows a member of 'this' [-Wshadow] void node_data::set_scalar(const std::string& scalar) { ^ CXX src/emitter.cpp CXX src/convert.cpp In file included from include/yaml-cpp/node/detail/node.h:14:0, from include/yaml-cpp/node/impl.h:13, from include/yaml-cpp/node/convert.h:18, from src/convert.cpp:3: include/yaml-cpp/node/detail/node_ref.h: In member function 'void YAML::detail::node_ref::set_mark(const YAML::Mark&)': include/yaml-cpp/node/detail/node_ref.h:33:35: warning: declaration of 'mark' shadows a member of 'this' [-Wshadow] void set_mark(const Mark& mark) { m_pData->set_mark(mark); } ^ include/yaml-cpp/node/detail/node_ref.h: In member function 'void YAML::detail::node_ref::set_type(YAML::NodeType::value)': include/yaml-cpp/node/detail/node_ref.h:34:39: warning: declaration of 'type' shadows a member of 'this' [-Wshadow] void set_type(NodeType::value type) { m_pData->set_type(type); } ^ include/yaml-cpp/node/detail/node_ref.h: In member function 'void YAML::detail::node_ref::set_tag(const string&)': include/yaml-cpp/node/detail/node_ref.h:35:40: warning: declaration of 'tag' shadows a member of 'this' [-Wshadow] void set_tag(const std::string& tag) { m_pData->set_tag(tag); } ^ include/yaml-cpp/node/detail/node_ref.h: In member function 'void YAML::detail::node_ref::set_scalar(const string&)': include/yaml-cpp/node/detail/node_ref.h:37:46: warning: declaration of 'scalar' shadows a member of 'this' [-Wshadow] void set_scalar(const std::string& scalar) { m_pData->set_scalar(scalar); } ^ include/yaml-cpp/node/detail/node_ref.h: In member function 'void YAML::detail::node_ref::set_style(YAML::EmitterStyle::value)': include/yaml-cpp/node/detail/node_ref.h:38:45: warning: declaration of 'style' shadows a member of 'this' [-Wshadow] void set_style(EmitterStyle::value style) { m_pData->set_style(style); } ^ In file included from include/yaml-cpp/node/impl.h:13:0, from include/yaml-cpp/node/convert.h:18, from src/convert.cpp:3: include/yaml-cpp/node/detail/node.h: In member function 'void YAML::detail::node::set_mark(const YAML::Mark&)': include/yaml-cpp/node/detail/node.h:69:35: warning: declaration of 'mark' shadows a member of 'this' [-Wshadow] void set_mark(const Mark& mark) { m_pRef->set_mark(mark); } ^ include/yaml-cpp/node/detail/node.h: In member function 'void YAML::detail::node::set_type(YAML::NodeType::value)': include/yaml-cpp/node/detail/node.h:71:39: warning: declaration of 'type' shadows a member of 'this' [-Wshadow] void set_type(NodeType::value type) { ^ include/yaml-cpp/node/detail/node.h: In member function 'void YAML::detail::node::set_scalar(const string&)': include/yaml-cpp/node/detail/node.h:80:46: warning: declaration of 'scalar' shadows a member of 'this' [-Wshadow] void set_scalar(const std::string& scalar) { ^ include/yaml-cpp/node/detail/node.h: In member function 'void YAML::detail::node::set_tag(const string&)': include/yaml-cpp/node/detail/node.h:84:40: warning: declaration of 'tag' shadows a member of 'this' [-Wshadow] void set_tag(const std::string& tag) { ^ include/yaml-cpp/node/detail/node.h: In member function 'void YAML::detail::node::set_style(YAML::EmitterStyle::value)': include/yaml-cpp/node/detail/node.h:90:45: warning: declaration of 'style' shadows a member of 'this' [-Wshadow] void set_style(EmitterStyle::value style) { ^ CXX src/emitterutils.cpp CXX src/contrib/graphbuilderadapter.cpp CXX src/contrib/graphbuilder.cpp CXX src/simplekey.cpp CXX src/scantag.cpp CXX src/nodeevents.cpp In file included from include/yaml-cpp/node/detail/node.h:14:0, from src/nodeevents.cpp:4: include/yaml-cpp/node/detail/node_ref.h: In member function 'void YAML::detail::node_ref::set_mark(const YAML::Mark&)': include/yaml-cpp/node/detail/node_ref.h:33:35: warning: declaration of 'mark' shadows a member of 'this' [-Wshadow] void set_mark(const Mark& mark) { m_pData->set_mark(mark); } ^ include/yaml-cpp/node/detail/node_ref.h: In member function 'void YAML::detail::node_ref::set_type(YAML::NodeType::value)': include/yaml-cpp/node/detail/node_ref.h:34:39: warning: declaration of 'type' shadows a member of 'this' [-Wshadow] void set_type(NodeType::value type) { m_pData->set_type(type); } ^ include/yaml-cpp/node/detail/node_ref.h: In member function 'void YAML::detail::node_ref::set_tag(const string&)': include/yaml-cpp/node/detail/node_ref.h:35:40: warning: declaration of 'tag' shadows a member of 'this' [-Wshadow] void set_tag(const std::string& tag) { m_pData->set_tag(tag); } ^ include/yaml-cpp/node/detail/node_ref.h: In member function 'void YAML::detail::node_ref::set_scalar(const string&)': include/yaml-cpp/node/detail/node_ref.h:37:46: warning: declaration of 'scalar' shadows a member of 'this' [-Wshadow] void set_scalar(const std::string& scalar) { m_pData->set_scalar(scalar); } ^ include/yaml-cpp/node/detail/node_ref.h: In member function 'void YAML::detail::node_ref::set_style(YAML::EmitterStyle::value)': include/yaml-cpp/node/detail/node_ref.h:38:45: warning: declaration of 'style' shadows a member of 'this' [-Wshadow] void set_style(EmitterStyle::value style) { m_pData->set_style(style); } ^ In file included from src/nodeevents.cpp:4:0: include/yaml-cpp/node/detail/node.h: In member function 'void YAML::detail::node::set_mark(const YAML::Mark&)': include/yaml-cpp/node/detail/node.h:69:35: warning: declaration of 'mark' shadows a member of 'this' [-Wshadow] void set_mark(const Mark& mark) { m_pRef->set_mark(mark); } ^ include/yaml-cpp/node/detail/node.h: In member function 'void YAML::detail::node::set_type(YAML::NodeType::value)': include/yaml-cpp/node/detail/node.h:71:39: warning: declaration of 'type' shadows a member of 'this' [-Wshadow] void set_type(NodeType::value type) { ^ include/yaml-cpp/node/detail/node.h: In member function 'void YAML::detail::node::set_scalar(const string&)': include/yaml-cpp/node/detail/node.h:80:46: warning: declaration of 'scalar' shadows a member of 'this' [-Wshadow] void set_scalar(const std::string& scalar) { ^ include/yaml-cpp/node/detail/node.h: In member function 'void YAML::detail::node::set_tag(const string&)': include/yaml-cpp/node/detail/node.h:84:40: warning: declaration of 'tag' shadows a member of 'this' [-Wshadow] void set_tag(const std::string& tag) { ^ include/yaml-cpp/node/detail/node.h: In member function 'void YAML::detail::node::set_style(YAML::EmitterStyle::value)': include/yaml-cpp/node/detail/node.h:90:45: warning: declaration of 'style' shadows a member of 'this' [-Wshadow] void set_style(EmitterStyle::value style) { ^ CXX src/scanscalar.cpp CXX src/parser.cpp CXX src/emitfromevents.cpp CXX src/tag.cpp CXX src/ostream_wrapper.cpp src/ostream_wrapper.cpp: In member function 'void YAML::ostream_wrapper::write(const string&)': src/ostream_wrapper.cpp:21:51: warning: declaration of 'str' shadows a member of 'this' [-Wshadow] void ostream_wrapper::write(const std::string& str) { ^ src/ostream_wrapper.cpp: In member function 'void YAML::ostream_wrapper::write(const char*, std::size_t)': src/ostream_wrapper.cpp:34:62: warning: declaration of 'str' shadows a member of 'this' [-Wshadow] void ostream_wrapper::write(const char* str, std::size_t size) { ^ CXX src/scantoken.cpp src/scantoken.cpp: In member function 'void YAML::Scanner::ScanDocStart()': src/scantoken.cpp:68:8: warning: declaration of 'mark' shadows a member of 'this' [-Wshadow] Mark mark = INPUT.mark(); ^ src/scantoken.cpp: In member function 'void YAML::Scanner::ScanDocEnd()': src/scantoken.cpp:81:8: warning: declaration of 'mark' shadows a member of 'this' [-Wshadow] Mark mark = INPUT.mark(); ^ src/scantoken.cpp: In member function 'void YAML::Scanner::ScanFlowStart()': src/scantoken.cpp:94:8: warning: declaration of 'mark' shadows a member of 'this' [-Wshadow] Mark mark = INPUT.mark(); ^ src/scantoken.cpp: In member function 'void YAML::Scanner::ScanFlowEnd()': src/scantoken.cpp:120:8: warning: declaration of 'mark' shadows a member of 'this' [-Wshadow] Mark mark = INPUT.mark(); ^ src/scantoken.cpp: In member function 'void YAML::Scanner::ScanFlowEntry()': src/scantoken.cpp:147:8: warning: declaration of 'mark' shadows a member of 'this' [-Wshadow] Mark mark = INPUT.mark(); ^ src/scantoken.cpp: In member function 'void YAML::Scanner::ScanBlockEntry()': src/scantoken.cpp:167:8: warning: declaration of 'mark' shadows a member of 'this' [-Wshadow] Mark mark = INPUT.mark(); ^ src/scantoken.cpp: In member function 'void YAML::Scanner::ScanKey()': src/scantoken.cpp:186:8: warning: declaration of 'mark' shadows a member of 'this' [-Wshadow] Mark mark = INPUT.mark(); ^ src/scantoken.cpp: In member function 'void YAML::Scanner::ScanValue()': src/scantoken.cpp:215:8: warning: declaration of 'mark' shadows a member of 'this' [-Wshadow] Mark mark = INPUT.mark(); ^ src/scantoken.cpp: In member function 'void YAML::Scanner::ScanAnchorOrAlias()': src/scantoken.cpp:231:8: warning: declaration of 'mark' shadows a member of 'this' [-Wshadow] Mark mark = INPUT.mark(); ^ src/scantoken.cpp: In member function 'void YAML::Scanner::ScanPlainScalar()': src/scantoken.cpp:314:8: warning: declaration of 'mark' shadows a member of 'this' [-Wshadow] Mark mark = INPUT.mark(); ^ src/scantoken.cpp: In member function 'void YAML::Scanner::ScanQuotedScalar()': src/scantoken.cpp:355:8: warning: declaration of 'mark' shadows a member of 'this' [-Wshadow] Mark mark = INPUT.mark(); ^ src/scantoken.cpp: In member function 'void YAML::Scanner::ScanBlockScalar()': src/scantoken.cpp:383:8: warning: declaration of 'mark' shadows a member of 'this' [-Wshadow] Mark mark = INPUT.mark(); ^ CXX src/directives.cpp CXX src/binary.cpp CXX src/null.cpp CXX src/exceptions.cpp CXX src/emitterstate.cpp CXX src/emit.cpp CXX src/nodebuilder.cpp In file included from include/yaml-cpp/node/detail/node.h:14:0, from src/nodebuilder.cpp:5: include/yaml-cpp/node/detail/node_ref.h: In member function 'void YAML::detail::node_ref::set_mark(const YAML::Mark&)': include/yaml-cpp/node/detail/node_ref.h:33:35: warning: declaration of 'mark' shadows a member of 'this' [-Wshadow] void set_mark(const Mark& mark) { m_pData->set_mark(mark); } ^ include/yaml-cpp/node/detail/node_ref.h: In member function 'void YAML::detail::node_ref::set_type(YAML::NodeType::value)': include/yaml-cpp/node/detail/node_ref.h:34:39: warning: declaration of 'type' shadows a member of 'this' [-Wshadow] void set_type(NodeType::value type) { m_pData->set_type(type); } ^ include/yaml-cpp/node/detail/node_ref.h: In member function 'void YAML::detail::node_ref::set_tag(const string&)': include/yaml-cpp/node/detail/node_ref.h:35:40: warning: declaration of 'tag' shadows a member of 'this' [-Wshadow] void set_tag(const std::string& tag) { m_pData->set_tag(tag); } ^ include/yaml-cpp/node/detail/node_ref.h: In member function 'void YAML::detail::node_ref::set_scalar(const string&)': include/yaml-cpp/node/detail/node_ref.h:37:46: warning: declaration of 'scalar' shadows a member of 'this' [-Wshadow] void set_scalar(const std::string& scalar) { m_pData->set_scalar(scalar); } ^ include/yaml-cpp/node/detail/node_ref.h: In member function 'void YAML::detail::node_ref::set_style(YAML::EmitterStyle::value)': include/yaml-cpp/node/detail/node_ref.h:38:45: warning: declaration of 'style' shadows a member of 'this' [-Wshadow] void set_style(EmitterStyle::value style) { m_pData->set_style(style); } ^ In file included from src/nodebuilder.cpp:5:0: include/yaml-cpp/node/detail/node.h: In member function 'void YAML::detail::node::set_mark(const YAML::Mark&)': include/yaml-cpp/node/detail/node.h:69:35: warning: declaration of 'mark' shadows a member of 'this' [-Wshadow] void set_mark(const Mark& mark) { m_pRef->set_mark(mark); } ^ include/yaml-cpp/node/detail/node.h: In member function 'void YAML::detail::node::set_type(YAML::NodeType::value)': include/yaml-cpp/node/detail/node.h:71:39: warning: declaration of 'type' shadows a member of 'this' [-Wshadow] void set_type(NodeType::value type) { ^ include/yaml-cpp/node/detail/node.h: In member function 'void YAML::detail::node::set_scalar(const string&)': include/yaml-cpp/node/detail/node.h:80:46: warning: declaration of 'scalar' shadows a member of 'this' [-Wshadow] void set_scalar(const std::string& scalar) { ^ include/yaml-cpp/node/detail/node.h: In member function 'void YAML::detail::node::set_tag(const string&)': include/yaml-cpp/node/detail/node.h:84:40: warning: declaration of 'tag' shadows a member of 'this' [-Wshadow] void set_tag(const std::string& tag) { ^ include/yaml-cpp/node/detail/node.h: In member function 'void YAML::detail::node::set_style(YAML::EmitterStyle::value)': include/yaml-cpp/node/detail/node.h:90:45: warning: declaration of 'style' shadows a member of 'this' [-Wshadow] void set_style(EmitterStyle::value style) { ^ AR obj/yaml-cpp.a make[1]: Leaving directory `/home/rathena/3rdparty/yaml-cpp' make[1]: Entering directory `/home/rathena/src/common' MKDIR obj CXX core.cpp CC socket.c CC timer.c CC db.c CC nullpo.c CC malloc.c CC showmsg.c CC strlib.c CC utils.c CC grfio.c CC mapindex.c CC ers.c CC md5calc.c CXX core.cpp CC socket.c CC malloc.c CC random.c CC des.c CC conf.c CC thread.c CC mutex.c CC raconf.c CC mempool.c CC msg_conf.c CC cli.c CC sql.c CXX yamlwrapper.cpp In file included from ../../3rdparty/yaml-cpp/include/yaml-cpp/node/detail/node.h:14:0, from ../../3rdparty/yaml-cpp/include/yaml-cpp/node/impl.h:13, from ../../3rdparty/yaml-cpp/include/yaml-cpp/yaml.h:17, from yamlwrapper.h:32, from yamlwrapper.cpp:23: ../../3rdparty/yaml-cpp/include/yaml-cpp/node/detail/node_ref.h: In member function 'void YAML::detail::node_ref::set_mark(const YAML::Mark&)': ../../3rdparty/yaml-cpp/include/yaml-cpp/node/detail/node_ref.h:33:35: warning: declaration of 'mark' shadows a member of 'this' [-Wshadow] void set_mark(const Mark& mark) { m_pData->set_mark(mark); } ^ ../../3rdparty/yaml-cpp/include/yaml-cpp/node/detail/node_ref.h: In member function 'void YAML::detail::node_ref::set_type(YAML::NodeType::value)': ../../3rdparty/yaml-cpp/include/yaml-cpp/node/detail/node_ref.h:34:39: warning: declaration of 'type' shadows a member of 'this' [-Wshadow] void set_type(NodeType::value type) { m_pData->set_type(type); } ^ ../../3rdparty/yaml-cpp/include/yaml-cpp/node/detail/node_ref.h: In member function 'void YAML::detail::node_ref::set_tag(const string&)': ../../3rdparty/yaml-cpp/include/yaml-cpp/node/detail/node_ref.h:35:40: warning: declaration of 'tag' shadows a member of 'this' [-Wshadow] void set_tag(const std::string& tag) { m_pData->set_tag(tag); } ^ ../../3rdparty/yaml-cpp/include/yaml-cpp/node/detail/node_ref.h: In member function 'void YAML::detail::node_ref::set_scalar(const string&)': ../../3rdparty/yaml-cpp/include/yaml-cpp/node/detail/node_ref.h:37:46: warning: declaration of 'scalar' shadows a member of 'this' [-Wshadow] void set_scalar(const std::string& scalar) { m_pData->set_scalar(scalar); } ^ ../../3rdparty/yaml-cpp/include/yaml-cpp/node/detail/node_ref.h: In member function 'void YAML::detail::node_ref::set_style(YAML::EmitterStyle::value)': ../../3rdparty/yaml-cpp/include/yaml-cpp/node/detail/node_ref.h:38:45: warning: declaration of 'style' shadows a member of 'this' [-Wshadow] void set_style(EmitterStyle::value style) { m_pData->set_style(style); } ^ In file included from ../../3rdparty/yaml-cpp/include/yaml-cpp/node/impl.h:13:0, from ../../3rdparty/yaml-cpp/include/yaml-cpp/yaml.h:17, from yamlwrapper.h:32, from yamlwrapper.cpp:23: ../../3rdparty/yaml-cpp/include/yaml-cpp/node/detail/node.h: In member function 'void YAML::detail::node::set_mark(const YAML::Mark&)': ../../3rdparty/yaml-cpp/include/yaml-cpp/node/detail/node.h:69:35: warning: declaration of 'mark' shadows a member of 'this' [-Wshadow] void set_mark(const Mark& mark) { m_pRef->set_mark(mark); } ^ ../../3rdparty/yaml-cpp/include/yaml-cpp/node/detail/node.h: In member function 'void YAML::detail::node::set_type(YAML::NodeType::value)': ../../3rdparty/yaml-cpp/include/yaml-cpp/node/detail/node.h:71:39: warning: declaration of 'type' shadows a member of 'this' [-Wshadow] void set_type(NodeType::value type) { ^ ../../3rdparty/yaml-cpp/include/yaml-cpp/node/detail/node.h: In member function 'void YAML::detail::node::set_scalar(const string&)': ../../3rdparty/yaml-cpp/include/yaml-cpp/node/detail/node.h:80:46: warning: declaration of 'scalar' shadows a member of 'this' [-Wshadow] void set_scalar(const std::string& scalar) { ^ ../../3rdparty/yaml-cpp/include/yaml-cpp/node/detail/node.h: In member function 'void YAML::detail::node::set_tag(const string&)': ../../3rdparty/yaml-cpp/include/yaml-cpp/node/detail/node.h:84:40: warning: declaration of 'tag' shadows a member of 'this' [-Wshadow] void set_tag(const std::string& tag) { ^ ../../3rdparty/yaml-cpp/include/yaml-cpp/node/detail/node.h: In member function 'void YAML::detail::node::set_style(YAML::EmitterStyle::value)': ../../3rdparty/yaml-cpp/include/yaml-cpp/node/detail/node.h:90:45: warning: declaration of 'style' shadows a member of 'this' [-Wshadow] void set_style(EmitterStyle::value style) { ^ AR obj/common.a make[1]: Leaving directory `/home/rathena/src/common' make[1]: Entering directory `/home/rathena/src/login' MKDIR obj CC account.c CC ipban.c CC loginchrif.c CC loginclif.c CC logincnslif.c CC loginlog.c CXX login.cpp LD login-server make[1]: Leaving directory `/home/rathena/src/login' make[1]: Entering directory `/home/rathena/src/char' MKDIR obj CC char_clif.c CC char_cnslif.c CC char_logif.c CC char_mapif.c CC int_achievement.c CC int_auction.c CC int_clan.c CC int_elemental.c CC int_guild.c CC int_homun.c CC int_mail.c CC int_mercenary.c CC int_party.c CC int_pet.c CC int_quest.c CXX char.cpp CXX int_storage.cpp CXX inter.cpp LD char-server make[1]: Leaving directory `/home/rathena/src/char' make[1]: Entering directory `/home/rathena/src/map' MKDIR obj CC achievement.c CC atcommand.c CC battle.c CC battleground.c CC buyingstore.c CC cashshop.c CC channel.c CC chat.c CC chrif.c CC clan.c CC date.c CC duel.c CC elemental.c CC guild.c CC homunculus.c CC instance.c CC intif.c CC itemdb.c CC log.c CC mail.c CC mapreg.c CC mercenary.c CC mob.c CC npc.c CC npc_chat.c CC party.c CC path.c CC pc.c CC pc_groups.c CC pet.c CC quest.c CC searchstore.c CC skill.c CC status.c status.c: In function 'status_yaml_readdb_refine_sub': status.c:14239:3: error: 'for' loop initial declarations are only allowed in C99 mode for (yamlwrapper* type = yaml_iterator_first(it); yaml_iterator_has_next(it); type = yaml_iterator_next(it)) { ^ status.c:14239:3: note: use option -std=c99 or -std=gnu99 to compile your code status.c:14273:3: error: 'for' loop initial declarations are only allowed in C99 mode for (yamlwrapper* level = yaml_iterator_first(it); yaml_iterator_has_next(it); level = yaml_iterator_next(it)) { ^ status.c: In function 'status_yaml_readdb_refine': status.c:14323:2: error: 'for' loop initial declarations are only allowed in C99 mode for (int i = 0; i < ARRAYLENGTH(labels); i++) { ^ make[1]: *** [obj/status.o] Error 1 make[1]: Leaving directory `/home/rathena/src/map' make: *** [map] Error 2 rathena@roserver:/home/rathena# Any help would be appreciated! Thanks in advance! -Keanu
  13. erm.. all linux distro has GUI (Desktop version) & non GUI (Server version). but if u gonna rent a vps, it will always be ubuntu server or centos server.. it is just rarely for the vps to put desktop version for linux. to compile it? by using terminal. just execute ./configure && make clean server
  14. just go for ubuntu... if u working on rAthena using git diff command, u will see the diff more clearly on ubuntu.. the diff on ubuntu comes with green & red color which make u easier to notice the changes.. see the below screenshot... if u really optimize & utilize git diff & git status command, u will loves using ubuntu.. there are some mores advantages using ubuntu rather than on centos... customization & modification of apache webserver (adding virtual server) & phpmyadmin.. but for these 2, i don't think u will go that far for the customization & modification.. i'm prefer ubuntu not because of its stability reason, but bcoz it is more on handy & easy to use & manage (if u loves doing lots of customization & modification). if just doing default setup, i think it shouldn't be a problem (especially for beginners who are just to get things work around)
  15. After I have updated the emulator and the database, I proceed to compile and get the following errors, after using the make server command: script.c: In function ‘script_getitem_randomoption’: script.c:6730:22: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] it->option[i].id = (short)__64BPRTSIZE(get_val2(st,reference_uid(opt_id_id,opt_id_idx+i),opt_id_ref)); ^ script.c:6732:25: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] it->option[i].value = (short)__64BPRTSIZE(get_val2(st,reference_uid(opt_val_id,opt_val_idx+i),opt_val_ref)); ^ script.c:6734:25: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] it->option[i].param = (char)__64BPRTSIZE(get_val2(st,reference_uid(opt_param_id,opt_param_idx+i),opt_param_ref)); I compiled using the following command line: ./configure --enable-packetver=20150513 --disable-64bit make clean make server I installed g ++, solved conflicts after update... Ubuntu 16.04 lts 32 bits Renewal Please help :c Regards!
  16. Hi guys, Ive been trying to add this to the end of script.c at line 23440 int viewpointmap_sub(struct block_list *bl, va_list ap) { struct map_session_data *sd; int npc_id, type, x, y, id, color; npc_id = va_arg(ap, int); type = va_arg(ap, int); x = va_arg(ap, int); y = va_arg(ap, int); id = va_arg(ap, int); color = va_arg(ap, int); sd = (struct map_session_data *)bl; clif_viewpoint(sd, npc_id, type, x, y, id, color); return 0; } BUILDIN_FUNC(viewpointmap) { int type, x, y, id, color, m; const char *map_name; map_name = script_getstr(st, 2); if ((m = map_mapname2mapid(map_name)) < 0) return true; // Invalid Map type = script_getnum(st, 3); x = script_getnum(st, 4); y = script_getnum(st, 5); id = script_getnum(st, 6); color = script_getnum(st, 7); map_foreachinmap(viewpointmap_sub, m, BL_PC, st->oid, type, x, y, id, color); return true; } // Add this to the list of script commands defined, look through the code, should be self explanitory. BUILDIN_DEF(viewpointmap,"siiiii"), but i receive this error script.c:23441:2: error: expected expression before ‘int’ int viewpointmap_sub(struct block_list *bl, va_list ap) { ^ Makefile:76: recipe for target 'obj/script.o' failed make[1]: *** [obj/script.o] Error 1 make[1]: Leaving directory '/home/rob/rathena/src/map' Makefile:51: recipe for target 'map' failed make: *** [map] Error 2 the file i got the code from ask me to add the code anywhere in between BUILDING_FUNC's i believe i have done that but obviously i haven't as it is giving errors out while compiling on Ubuntu server Any help will be appreciated Kind regards
  17. How to "Clean" my emulator ? Congrats for the post, i should trying forever without this information. Since now Thank you Edited: "Make Clean" is the awnser but still having the error... already tryeed all of https://k3dt.eu/Ragexe/unpacked/ with nemo, xdiffv2 etc... becoming boredd and pissed =/ By "Disable Packet Encryption in the xDiffPatcher" i got another packet error with same client... Already tryed Hercules Judas pack and nothing... its like 3 entires nights, like a 10000 virus, 10000 rebuilds, 4 ro folders with kro and bro and i can't log in... Any good place to find more ragexe ? It's a server problem ? Ech new try i do in ubuntu: ./configure --enable-packetver=20130807 make clean make server chmod a+x login-server && chmod a+x char-server && chmod a+x map-server ./athena-start start Change the <version> in clientinfo.xml <?xml version="1.0" encoding="euc-kr" ?> <clientinfo> <servicetype>korea</servicetype> <servertype>primary</servertype> <connection> <display>Test</display> <desc>As DESCRIPTION</desc> <address>192.168.155.128</address> <port>6900</port> <version>45</version> <langtype>12</langtype> <registrationweb></registrationweb> <aid> <admin></admin> </aid> </connection> </clientinfo> and diff the ragexe with recomended features and after select my char it still: [Info]: clif_parse: Disconnecting session #8 with unknown packet version (p:0x0XXX,l:19). [Info]: Closed connection from '192.168.155.1'. and with some ragexes: [Info]: clif_parse: Disconnecting session #8 with unknown packet version (p:0xXXXX,l:19). [Info]: Closed connection from '192.168.155.1'. Am I missing something ?
  18. can anyone help? I'm having issue on compiling sudo make server chmod a+x login-server && chmod a+x char-server && chmod a+x map-server I keep getting this error make[1]: Leaving directory '/home/skeith/Ragnarok/rAthena/src/map' building conf/import, conf/msg_conf/import and db/import folder... make: *** No rule to make target 'chmod'. Stop. OS is Ubuntu 16.04 LTS 64-bit
  19. Hi, guys! I'm trying to install rAthena on a ubuntu machine and utilizes roBrowser as client in other to make a server that would be "client-less". But I do not have idea of how things exactally work, and then I got stuck because I guess I installed both rA and roBrowser right, so it should return an error at login saying wrong username or something like that as my players database is empty. But in says "Please wait ..." forever. Does someone here ever used roBrowser? Or know how do I know were is the problem (maybe network configuration)? I've done this on my home computer and when I do start Athena it does not notice any errors. (I do not have any windows machines avaliable at the moment, but I can get a VM in some weeks if it's really needed, also attached a dump of the console) dump.txt
  20. No its 512mb 728mb burst.Cheap server just to make sure they were stable before getting decent package. EDIT: I finally got it complied.But now when i start it i get [Fatal Error]: Memory manager::memmgr_alloc failed (allocating 56+421888 bytes at script.c:759). So my question is 512mb not even enough to start a server for 1 person just so i can test latency and stuff before upgrading It's obvious that the ram is insufficient to run the server. If I'm still updated, a 512 MB - Linux VPS will be able to do it. But, I'm not somehow sure about now. Are you running another services? like apache, KVM, or such things like GUI Environment (I mean Desktop, that thing, what is it? KDE thing?) or others? try to shut them down first then run it again. By the way, If you're using Ubuntu, then you may need more. I still believe that the server will run in a 512MB Centos.
  21. Skorm

    website panel

    Alright here's some notes I recorded for myself when installing a server... GL installing Ragnarok Server on Ubuntu: Installing Mysql: sudo apt-get install mysql-server sudo netstat -tap | grep mysql sudo /etc/init.d/mysql restart mysql -u root -p (mysql -u root if you didn't make a password) create database ragnarok; create database log; grant usage on *.* to root@localhost identified by ‘passwordhere’; grant all privileges on ragnarok.* to root@localhost ; grant all privileges on log.* to root@localhost ; use ragnarok; source path/to/sql-files/main.sql; use log; source path/to/sql-files/log.sql; Installing C Compiler: sudo apt-get update sudo apt-get -yqq install libc6-dev g++ gcc sudo apt-get install zlib1g-dev apt-get install libmysqlclient-dev chmod 775 for promissions chmod -R 755 *.sh if files aren't meant for Unix sudo apt-get dos2unix dose2unix filename ./filename 1. cd Path/RO/trunk 2. chmod +x configure 3. ./configure 4. make clean 5. make sql 6. ./athena-start restart install Webserver for flux: sudo apt-get update sudo apt-get aptitude sudo aptitude install apache2 sudo aptitiude install php5 libapache2-mod-php5 sudo apt-get php5-mysql sudo a2enmod php5 sudo apache2ctl restart You might also need to add the following to /etc/php5/apache2/php.ini extension=pdo.so extension=pdo_mysql.so if /usr/lib/php5/20060613+lfs/pdo.so or pdo_mysql.so are missing from the file directory add them. if you're still having problems try: sudo apt-get install libmysqlclient15-dev sudo apt-get install pdo_mysql sudo apache2ctl restart Installing and configuring SSH: sudo apt-get update sudo apt-get install openssh-server sudo groupadd groupnamehere cat /etc/group (group id is at the bottom) sudo useradd [user name] -d / -g [groupnamehere group id] -M -N -o -u [groupnamehere group id] sudo passwd [user name] (will display command to enterpassword) sudo apt-get update sudo apt-get nano sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak sudo nano +76 /etc/ssh/sshd_config The line Subsystem sftp /usr/lib/openssh/sftp-server Needs to be replaced with Subsystem sftp internal-sftp CTRL+O to save CTRL+X to exit sudo mkdir /var/www cd /var/www sudo mkdir flux sudo chown root:sftponly flux ( Alternativly sudo chown -R owned directory ) sudo chmod -R 775 flux sudo /etc/init.d/ssh restart ip -o -f inet addr (if you need the IP address) Then download WinSCP or FileZilla and input your info.
  22. To help double-check each commit and also test compatibility on other operating systems, we have setup a BuildBot. http://build.rathena.org/ These are the current BuildSlave operating systems we test rAthena on: CentOS x64 (provided by @Maki) Debian (provided by @Gepard) Ubuntu (provided by @Maki) Ubuntu x64 (provided by @Maki) Windows (provided by @flaviojs) If you would like to contribute a VPS or server for running a BuildSlave, please read on. BuildSlave requirements: internet connection (it's okay if the computer is behind a router) BuildBot installed (http://trac.buildbot.net/) all programs required to checkout/compile/run rAthena installed (optional) If you want us to configure BuildBot - SSH access or Remote Desktop for Windows buildslaves turned on 24/7 - its important the buildslaves are always online so as soon as a commit is made, the buildslaves can test it. (i.e. a desktop computer you only turn on 4 hours a day would not meet this requirement) (recommended) 256 MB of ram. 1 GB free disk space After you setup the VPS/server to meet those requirements, please: Create a non-root account (recommended username: buildslave). Make sure the buildslave user has at least 1 GB free space in its home dir (disk space will be used to checkout and compile rAthena). Make sure BuildBot is installed: buildbot --version test and make sure you can checkout and compile rAthena svn co https://rathena.svn.sourceforge.net/svnroot/rathena/trunk/ cd trunk/ ./configure make sql Send me a PM with the following info: Thank you for helping make rAthena better! Post here if you have any questions. PS: we would prefer if YOU installed BuildBot and everything (less work for us, and less access to your server), but if you are lazy or are having trouble installing BuildBot, we'll do our best to help.
  23. **I just followed this post, because I want make server on my Ubuntu too at least for my offline**
  24. No. Probably not, since adaboost already ran 'dpkg' and showed he has all the MySQL stuff installed.Also, 'apt-get update' only fetches the update list. You have to do upgrade to install them: apt-get update apt-get upgrade@adaboost: I'm not sure why it's not working for you.When I setup rAthena on Ubuntu/Debian (with an external MySQL Server), these are the only packages I have to install: apt-get install cmake gcc libmysqlclient-dev libpcre3-dev make subversion
  25. I think Ubuntu Server is light then centOS. First time when i met linux for RO Server is centOS that make me feel slow, then i come to Ubuntu Server and i like it. Anyway when i use ./configure, do i need to ./configure --enable-64bit? What version of centOS you used?
×
×
  • Create New...