Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 07/26/13 in all areas

  1. Hello guys!! This is my first time to write a tutorial. I hope it can help many beginner that don't know how to create your own ragnarok world. This server setting is just made to play offline. So if you want to make your own private server there are several things you need to learn more on setting ip, opening ports etc, and i'm not going to explain it in here Credits goes to: Nickyzai for kRO client K3dt for decompiled ragexe Mleo1 for Loki launcher Shakto, Yommy, MStream for xDiffPatcher Michieru, Dastgirpojee for Data folder translation Magicaltux for Grf Builder Ai4rei for Open Setup Okay let's get started, please follow all the steps correctly! This is all the things you need to create your own ragnarok world: 1. TortoiseSVN - http://tortoisesvn.net/downloads.html 2. Visual Basic - http://www.microsoft.com/visualstudio/eng/products/visual-studio-express-products 3. MySQL - http://dev.mysql.com/downloads/installer/ 4. MySQL Workbench 5.2.47 http://dev.mysql.com/downloads/tools/workbench/ 5. rAthena SVN Repository - https://rathena.svn.sourceforge.net/svnroot/rathena/ 6. kRO client by nickyzai - http://www.nickyzai.com/?p=kro 7. Loki Launcher by mleo1 - http://hercules.ws/board/topic/1070-loki-launcher/ 8. Decompiled ragexe by k3dt - http://k3dt.eu/Ragexe/unpacked/ 9. xDiffPatcher v2 - http://www.mediafire.com/?fibc47gzvdshp8o 10. DiffFiles - http://k3dt.eu/Ragexe/unpacked/Diffs/ 11. Data folder translation - https://subversion.assembla.com/svn/client-side-translation/ 12. Grf Builder - http://www.grfbuilder.com/#download 13. RO Open Setup - http://rathena.org/board/topic/63177-ro-open-setup-v280277-last-updated-20130702/ After you download all that things, do this: 1. Install tortoise 2. Install visual basic 3. Install MySQL (please remember your root password! If you change it but if you did not change then the default root password is ‘root’) 4. Install MySQL Workbench 5. Install kRO client After you install all of that, let’s prepare the client: 1. Open your kRO client and update it until completed. 2. Download your ragexe file in this (http://k3dt.eu/Ragexe/unpacked/) In this tutorial i used 2013-07-03aRagexe.exe 3. Download your xDiffFiles in this (http://k3dt.eu/Ragexe/unpacked/Diffs/) in this tutorial I used 2013-07-03aRagexe.exe so I must download the same date for Diff files which is “Diff 2013-07-03 v1” in order the xDiffPatcher to work. 4. Open your xDiffPatcher.exe select your ragexe file you download before which is I used (2013-07-03aRagexe.exe) and then select your Diff files which is I used (Diff 2013-07-03 v1) and click LOAD. Now look in “diff option” there are several choice to pick, I recommended you to check this option: - Disable Ragexe Filename Check - Disable HShield - Disable Packet Encryption - Enable Multiple GRFs -@ Bug Fix - Ignore Missing File Error - Ignore Missing Palette Error - Increase Headgear ViewID to 5000 - Increase Zoom - Load ItemInfo.lua before lub - Read Data Folder First - Read msgstringtable.txt - Read questid2display.txt - Translate Client In English - Use Normal Guild Brackets - Use Ragnarok Icon - eXtract MsgStringTable.txt - eXtract txt file strings After you finish check the option click Diff’n’Save! Move the patched ragexe you made to your kRO client folder 5. Open the loki launcer folder and right-click loki.ini, change this: ; Must be on same dir of Loki Exe = "ragexe.exe" Into ; Must be on same dir of Loki Exe = "2013-07-03aRagexe_patched.exe" (I change into 2013-07-03aRagexe_patched.exe because I patched my 2013-07-03aRagexe.exe. if you use another ragexe please changed into yours) Save it and move all of file in loki launcher folder into your kRO client folder. 6. Create new folder and name it ‘Data Folder Translation' right-click on ‘Data Folder Translation’ folder and choose ‘SVN checkout…’ Fill this link https://subversion.a...de-translation/ in “url of repository” and click ok, this will download your 'data translation folder' from latest revision. After complete click ok. Open your data translation folder you download before then open folder “data” right click clientinfo.xml and choose edit. Edit into your version, I’m changed it into 38 because I used 2013-07-03aRagexe.exe. You can find your version in folder Server\trunk\db\packet_db.txt note: If you can’t find clientinfo.xml just open notepad and copy code below to your notepad and save it as clientinfo.xml <?xml version="1.0" encoding="euc-kr" ?> <clientinfo> <servicetype>korea</servicetype> <servertype>primary</servertype> <connection> <display>Ragnarok</display> <balloon>Ragnarok</balloon> <desc>Ragnarok</desc> <address>127.0.0.1</address> <port>6900</port> <version>38</version> <langtype>0</langtype> <registrationweb></registrationweb> <aid> <admin></admin> <yellow></yellow> </aid> </connection> </clientinfo> 7. Open your grfbuilder click ‘new’ to create grf, name it to rathena and save it, then choose ‘merge dir’ find your data translation folder you download before. And then choose the folder ‘data’ inside data translation folder then click Ok. wait after complete. click close. Move the rathena.grf you’ve made to kRO client folder. 8. Now change all lua extension to lub extension in your data translation folder you've download place this script in your data translation folder data/luafiles514 folder And run it. Script Link: http://www.mediafire.com/download/jvtac0j8f6m604v/luatolub.bat note: rename 'luatolub.bat.txt' into 'luatolub.bat and double click (to run) it. After you done. Copy the 'data' and 'system' folder inside the data translation foder you've download to your kRO client and replace any same files with that. 9. Edit your DATA.ini in your kRO client folder into this: [Data] 0=rathena.grf 1=data.grf 2=rdata.grf Then save it. note: If you can’t find DATA.ini just open notepad and copy code up there to your notepad and save it as DATA.ini 10. Extract the 'Open Setup' you've download before and move the 'opensetup.exe' into your kRO client folder Now your kRO client is ready. Now for the Server 1. Create new folder and name it ‘Server’ 2. right-click on ‘Server’ folder and choose ‘SVN checkout…’ 3. Fill this link (https://rathena.svn.sourceforge.net/svnroot/rathena/) in “url of repository” and click ok, this will download your server files from latest rathena server. After complete click ok. 4. Open Server\trunk\conf then rename ‘import-tmpl’ folder into ‘import’ 5. Open Server\trunk\conf open file ‘char_athena.conf’ with notepad and look for this: // Server Communication username and password. userid: s1 (change ‘s1’ to whatever you want but here I use ‘username’ as userid for tutorial only) passwd: p1 (change ‘p1’ to whatever you want but here I used ‘password’ as password) *note: I suggest you to fill the username and password as I do, to prevent human error, because if you put wrong userid and passwd the server connection between login and map can’t be establish. //login_ip: 127.0.0.1 (REMOVE THE ‘//’ IN FRONT OF login_ip: 127.0.0.1 so it will look like this login_ip: 127.0.0.1) //char_ip: 127.0.0.1 (REMOVE THE ‘//’ IN FRONT OF char_ip: 127.0.0.1 so it will look like this char_ip: 127.0.0.1) Once you done save it. 6. Still in Server Server\trunk\conf now you open file ‘inter_athena.conf’ with notepad and search for all of this: sql.db_username: ragnarok (change ‘ragnarok’ into your MySQL username which is I use default ‘root’) sql.db_password: ragnarok (change ‘ragnarok’ into your MySQL password which is I use default ‘root’) sql.db_database: ragnarok (change ‘ragnarok’ into ‘rathena’ because later we make database using name ‘rathena’) char_server_id: ragnarok (change ‘ragnarok’ into ‘root’) char_server_pw: ragnarok (change ‘ragnarok’ into ‘root’) char_server_db: ragnarok (change ‘ragnarok’ into ‘rathena’) map_server_id: ragnarok (change ‘ragnarok’ into ‘root’) map_server_pw: ragnarok (change ‘ragnarok’ into ‘root’) map_server_db: ragnarok (change ‘ragnarok’ into ‘rathena’) log_db_id: ragnarok (change ‘ragnarok’ into ‘root’) log_db_pw: ragnarok (change ‘ragnarok’ into ‘root’) log_db_db: ragnarok (THIS ONE YOU CHANGE INTO ‘logs’ because later we make database ‘logs’ Once you’ve done SAVE it. 7. Still in Server Server\trunk\conf now you open file ‘map_athena.conf’ with notepad and search for: // Interserver communication passwords, set in account.txt (or equiv.) userid: s1 (Change ‘s1’ into ‘username’ because as I explain on up there before) passwd: p1 (Change ‘p1’ into ‘password’ because as I explain on up there before) // Character Server IP // The map server connects to the character server using this IP address. // NOTE: This is useful when you are running behind a firewall or are on // a machine with multiple interfaces. //char_ip: 127.0.0.1 (Remove the ‘//’) // Map Server IP // The IP address which clients will use to connect. // Set this to what your server's public IP address is. //map_ip: 127.0.0.1 (Remove the ‘//’) Done and Save it. 8. Still in Server Server\trunk\conf now you open file ‘subnet_athena.conf’ with notepad and change this: subnet: 255.0.0.0:127.0.0.1:127.0.0.1 you must find your subnet by opening ‘command prompt’ (start menu > all programs> accessories> command prompt) after you open your command prompt, type this ‘-ipconfig’ it will look like this 9. Open your MySQL Workbench double click on ‘Local instance MySQL’ as in the picture to open. Input your password which is ‘root’ if you haven’t change it on first time you install it. 10. Click on ‘Create new Schema’ just like on the pic below to create new ‘schema’ and name it ‘rathena’ then click ‘apply’ and then ‘apply’ and ‘finish’. Now close and reopen your MySQL workbench. 11. repeat the step 10 but name the schema as a ‘logs’ then click ‘apply’ and then ‘apply’ and ‘finish’. Now close and reopen your MySQL Workbench. 12. Enter again to you ‘Local instance MySQL’ just like the step 9 and double click on ‘rathena’ to select it, and then click ‘file’ and choose ‘Open SQL Script’ and go to rAthena\trunk\sql-files and open ‘main.sql’ click OPEN and click the ‘Lightning button’ on picture below. Wait until its done and close your MySQL Workbench and Open it again to refresh. repeat step 12 but now you 'Open SQL Script’ and go to rAthena\trunk\sql-files open 'logs.sql' click OPEN and click the ‘Lightning button’ on picture below. Wait until its done and close your MySQL Workbench and Open it again to refresh. 13. After you re-open your MySQL Workbench, double click on ‘rathena’ then double click on ‘table’ and find ‘login’ right click on it and choose ‘Select Rows – Limit 1000’ just like the picture below: 14. Change the ‘s1’ and ‘p1’ on the right table to ‘username’ and ‘password’ by double click on each of them and type it. Just like the picture below, when you done click ‘apply’ then ‘apply’ and ‘finish’ 15. Now Open folder Server\trunk\src\common and right-click mmo.h choose edit and search this line #define PACKETVER YYYYMMDD Change it with the date version you choose for your client before Example: #define PACKETVER 20130703 (My client ragexe is 2013-07-03aRagexe.exe that’s why I write 20130703) And save it. 15. Now let’s recompile your server, open Server\trunk\ right-click ‘rAthena-10.sln’ open with Microsoft Visual c++ 16. Change the ‘debug’ into ‘release’ like the picture below. 17. Block (select) char-server.sql, login-server.sql, map-server.sql, mapcache and then right click and choose ‘build selection’ like in the picture below: 18. Go to your Server\trunk\db and open file ‘packet_db.txt’ with notepad and add this line in bottom //2013-07-03 Ragexe packet_ver: 38 0x0369,7,actionrequest,2:6 0x083C,10,useskilltoid,2:4:6 0x0437,5,walktoxy,2 0x035F,6,ticksend,2 0x0930,5,changedir,2:4 0x07E4,6,takeitem,2 0x0362,6,dropitem,2:4 0x07EC,8,movetokafra,2:4 0x0364,8,movefromkafra,2:4 0x0438,10,useskilltopos,2:4:6:8 0x0366,90,useskilltoposinfo,2:4:6:8:10 0x096A,6,getcharnamerequest,2 0x0368,6,solvecharname,2 0x0838,12,searchstoreinfolistitemclick,2:6:10 0x0835,2,searchstoreinfonextpage,0 0x0819,-1,searchstoreinfo,2:4:5:9:13:14:15 0x0811,-1,reqtradebuyingstore,2:4:8:12 0x0202,6,reqclickbuyingstore,2 0x0817,2,reqclosebuyingstore,0 0x0815,-1,reqopenbuyingstore,2:4:8:9:89 0x0365,18,bookingregreq,2:4:6 // 0x0363,8 CZ_JOIN_BATTLE_FIELD 0x0281,-1,itemlistwindowselected,2:4:8:12 0x022D,19,wanttoconnection,2:6:10:14:18 0x0802,26,partyinvite2,2 // 0x0436,4 CZ_GANGSI_RANK 0x0360,26,friendslistadd,2 0x094A,5,hommenu,2:4 0x0873,36,storagepassword,2:4:20 If you choose another date of your ragexe you can find your ‘packet’ in this link http://rathena.org/board/topic/82726-2013-ragexe-and-diff-up-to-date-2013-07-03/ Just copy and paste it to your ‘packet_db.txt’ like I did. 19. Now you are ready to start your server, open rAthena\trunk and open file ‘runserver-sql.bat’ wait until all server loaded like the pic below: 20. Now go to your kRO client Folder and open ‘Loki.exe’ in the login screen you can create account by doing this; In ID you can fill your ID with _M for male and _F for female And then input your password, After that you may login to your id without _M or _F anymore. 21. Some Screenshoot in the game I think that's all guys. sorry for any mistake and good luck creating your own Ragnarok World don't forget to clik the button if you found this post useful and thx for reading this bad tutorial ________________________________________________________________________________________________________ Note: only do this step if you found the problem below. Problem 1: setup resolution problem: there is missing file in kRO client\system\lua514\ that file name is optioninfo.lub you may download from here and put on that folder. Problem 2: 'queryNavi_Distance_Map' problem: go to Data Folder Translation\Data\luafiles514\lua files\navigation then deleted the file below: navi_linkdistance_krpri.lub navi_linkdistance_krsak.lub navi_npcdistance_krpri.lua navi_npcdistance_krsak.lua _________________________________________________________________________________________________________ edited : - adding missing step in client - adding new file Open Setup from Ai4rei - adding missing step in server (repeat step 12 but now you 'Open SQL Script’ and go to rAthena\trunk\sql-files open 'logs.sql' click OPEN and click the ‘Lightning button’ on picture below. Wait until its done and close your MySQL Workbench and Open it again to refresh.) - fixing some step in client about grf builder because if change lua to lub first then merge give error query_navi_map but don't worry now the step are correct. - adding missing step about downloading 'data translation folder' from repository link - fix some unclear words and fix the repository link. - deleted fixcamera angle from patch list because for shift right click issue, and add some note about setup resolution problem - fix xdiff files link
    1 point
  2. Euphy's Scripts Disclaimer You may use, modify, and host all of my released scripts. You may not sell them, re-release them in any way (modified or otherwise), or remove the credits. < Event Manager > < Hunting Missions > < Queue System > < Euphy's WOE Controller > < All-In-One NPC > < Euphy's Quest Shop > < Euphy's Warper > < Item Rewards > < Custom Currency Multi-Shop > < Build Manager + > < Class Mastery System > < Class Specialization > < Badge System > < Guarantee Refine Ticket > < Item Fusion > < Euphy's MVP Ladder > < Card Trader > < NPC Duplicate Generator > < Auto-Potion >
    1 point
  3. Hi! It came to my mind, why do we use half txt half sql dbs while we could use either fully sql or fully txt db. Obviously the txt one exists already, so the only question is why not make it possible to use a fully sql based database instead of this mixed one? What I mean is that for example items can be imoprted into SQL, but item_combo-s can't. Mob skills are in SQL, mercenary skills are not. And the list could go on. I was thinking that this is because some dbs are more like configs and not real transactional dbs, but as you can see even tables from the same kind are not handled consistently. So what I propose is to convert every single table into sql file, and if someone chooses to use the server with sql support, then everything would be used from sql. Why is this good? -We can write advanced queries for NPC scripts, web pages, and administrative tasks, that work form only rA db, and we wouldn't need custom tables to store the missing informations, like map indexes/names, itemcombo infos ,etc.. -We can manage the database via a web admin site (if the database application supports.). -Better performance (searching a B-tree/hash indexed database is always faster than iterating a plain text document.) Why is this bad? -Extra work BUT! If we can agree on a structure, let's say every txt based file should have it's sql vatiant's table structure written in the first commented line, then every txt could be easilly converted into sql with only one click. Wee need only one program to loop thru every file in the db directory. In previous duscussions it came into my knowledge, that we have an sql converter done, that can convert one file, and I posted my version as well, so we would need only these to be altered to automatically do all the files, we specify, let's say in a txt file.
    1 point
  4. The problem is not that clear. But from what I can understand I think all you have to do is look on your "db" folder, "skill_tree.txt". To make things clear ill do an example 3rd Job Skill: Aimed Bolt. add it to what job: Archer First look for the skill id of the Aimed Bolt in the "skill_tree.txt" //Ranger (Trans) 4062,2236,10,117,5,0,0,0,0,0,0,0,0 You can see the structure of this corresponding numbers on skill_tree.txt but the important onces are the first tree lines, JobID,Skillid,SkillMaxlv, And then next look for the Skill tree of the Archer //Archer 3,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye# Add the Aimed bolt skill //Archer 3,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye# 4062,2236,10,0,0,0,0,0,0,0,0,0,0 //RA_AIMEDBOLT#Aimed Bolt# <<<<<<<<<<<<---replace 4062 to 3 //it should look like these -- //Archer 3,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye# 3,2236,10,0,0,0,0,0,0,0,0,0,0 //RA_AIMEDBOLT#Aimed Bolt# -- There everything is good, You just have to minimize the skill tree so that you can see the skill.
    1 point
  5. Updated 2 most famous issue regarding to this tutorial.
    1 point
  6. try to check my topic. http://rathena.org/board/topic/81747-2012-04-10aragexe-v3-booking-system/
    1 point
  7. If you use np-ip you have to download the tool from the homepage: http://www.noip.com/downloads.php?page=win Keep your current IP address in sync with your No-IP host
    1 point
  8. Dont get your question. Use your no-ip the same way you would use your ip.
    1 point
  9. This is already being worked on. ^.^
    1 point
  10. ok ty i already fixed the colors, how i can "edit/add/delete" news, in-game? this is my script: /* Run this query before installing this script... CREATE TABLE IF NOT EXISTS `news` ( `id` bigint(20) unsigned NOT NULL auto_increment, `post_name` varchar(30) NOT NULL default '', `post_id` int(11) unsigned NOT NULL default '0', `title` varchar(45) NOT NULL default '', `message` varchar(255) NOT NULL default '', `time` date NOT NULL default '0000-00-00', `status` tinyint(2) NOT NULL default '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM; */ //Version 1 prontera.gat,151,184,5 script Server News 857,{ query_sql("SELECT * FROM `news` ORDER BY `id` DESC",.@id,.@post_name$,.@post_id,.@title$,.@message$,.@time$,.@status); set .@len, getarraysize(.@post_id); copyarray .@og_stat[0],.@status,128; set @menu, -1; if(getgmlevel()>10) { mes .npc$; mes "Would you like to view the normal player menu?"; next; if(select("No:Yes")&2) goto L_Menu; L_GM_Menu: mes .npc$; mes "Hello, "+strcharinfo(0)+", what would you like to do?"; next; switch(select("(^11772dAdd^000000)"+((.@len)?":(^FF0000Remove^000000)^0000FFFeature^000000):[^8700c9Submit^000000]":""))) { case 1: mes .npc$; mes "#Title# (45 Character Limit)"; input(.@title$[.@len]); mes "#Message# ("+.in_len+" Character Limit)"; input(.@message$[.@len]); next; while(getstrlen(.@message$[.@len])<.in_len) { set(.@length, .in_len-getstrlen(.@message$[.@len])); mes .npc$; mes "Would you like to add more to the message?"; mes "^656565("+.@length+" Characters Left)^000000"; next; if(select("Yes:No")&2) break; input(.@tmp$); set .@message$[.@len],.@message$[.@len]+.@tmp$; } set .@post_name$[.@len], strcharinfo(0); set .@post_id[.@len], getcharid(0); if(.rathena) set .@time$[.@len], gettimestr("%Y-%m-%d",21); else { query_sql("SELECT CURDATE()",.@tym$); set .@time$[.@len],.@tym$; } set .@status[.@len], 2; set .@og_stat[.@len], 2; set .@len, getarraysize(.@post_id); set .@id[.@len-1], .@len; mes .npc$; mes "Added!"; next; goto L_GM_Menu; case 2: mes .npc$; mes "Select a notice to remove or restore it."; next; Rm_Menu: set .@menu$, ""; set .@a, -1; while(set(.@a,.@a+1)<.@len) if(.@status[.@a]==1) set .@menu$,.@menu$+ .@post_name$[.@a]+ " [^0000FF"+.@title$[.@a]+ "^000000] ~ ("+.@time$[.@a]+"):"; else if (!.@status[.@a]) set .@menu$,.@menu$+ "^C0C0C0//"+.@post_name$[.@a]+ " ["+.@title$[.@a]+ "] ~ ("+.@time$[.@a]+")^000000:"; else if (.@status[.@a]==2) set .@menu$,.@menu$+ "^11772d+"+.@post_name$[.@a]+ " ["+.@title$[.@a]+ "] ~ ("+.@time$[.@a]+")^000000:"; else if (.@status[.@a]==-1) set .@menu$,.@menu$+ "^FF0000-"+.@post_name$[.@a]+ " ["+.@title$[.@a]+ "] ~ ("+.@time$[.@a]+")^000000:"; set .@menu$,.@menu$+"[^8700c9Back^000000]"; select(.@menu$); if(@menu-1>=.@len) goto L_GM_Menu; set .@status[@menu-1], ((.@status[@menu-1]==-1)? .@og_stat[@menu-1]:-1); goto Rm_Menu; case 3: mes .npc$; mes "Select a notice to enable or disable it."; next; Ft_Menu: set .@menu$, ""; set .@a, -1; while(set(.@a,.@a+1)<.@len) if(.@status[.@a]==1) set .@menu$,.@menu$+ .@post_name$[.@a]+ " [^0000FF"+.@title$[.@a]+ "^000000] ~ ("+.@time$[.@a]+"):"; else if (!.@status[.@a]) set .@menu$,.@menu$+ "^C0C0C0//"+.@post_name$[.@a]+ " ["+.@title$[.@a]+ "] ~ ("+.@time$[.@a]+")^000000:"; else if (.@status[.@a]==2) set .@menu$,.@menu$+ "^11772d+"+.@post_name$[.@a]+ " ["+.@title$[.@a]+ "] ~ ("+.@time$[.@a]+")^000000:"; else if (.@status[.@a]==-1) set .@menu$,.@menu$+ "^FF0000-"+.@post_name$[.@a]+ " ["+.@title$[.@a]+ "] ~ ("+.@time$[.@a]+")^000000:"; set .@menu$,.@menu$+"[^8700c9Back^000000]"; select(.@menu$); if(@menu>.@len) goto L_GM_Menu; set .@status[@menu-1], ((.@status[@menu-1])? 0:((.@og_stat[@menu-1])?.@og_stat[@menu-1]:1)); goto Ft_Menu; case 4: set .@a, -1; set .@b, 0; while(set(.@a,.@a+1)<.@len) { if(.@og_stat[.@a]==2&&.@status[.@a]==-1) set .@b, .@b+1; if(.@og_stat[.@a]==2&&.@status[.@a]!=-1) query_sql("INSERT INTO `news` (`post_name`,`post_id`,`title`,`message`,`time`,`status`) "+ "VALUES ('"+.@post_name$[.@a]+ "',"+.@post_id[.@a]+ ",'"+escape_sql(.@title$[.@a])+ "','"+escape_sql(.@message$[.@a])+"',"+ "CURDATE(),"+((.@status[.@a]>=1)?1:0)+")"); if(.@status[.@a]!=.@og_stat[.@a]&&.@status[.@a]!=-1) query_sql("UPDATE `news`"+ "SET `status`="+((.@status[.@a]>=1)?1:0)+" "+ "WHERE `id`="+(.@id[.@a]+.@+";"); if(.@status[.@a]<0&&.@og_stat[.@a]!=2) query_sql("DELETE FROM `news`"+ "WHERE `id`="+(.@id[.@a]+.@+";"); } mes .npc$; mes "Server News Updated!"; close; } } L_Menu: set .@a, -1; while(set(.@a,.@a+1)<.@len) if(.@status[.@a]) { set @menu, .@a; break; } L_PC_Menu: set .@a, -1; set .@menu$, ""; set .@f, 0; while(set(.@a,.@a+1)<.@len) { if(.@status[.@a]) { set .@menu$,.@menu$+ .@post_name$[.@a]+ " [^0000FF"+.@title$[.@a]+ "^000000] ~ ("+.@time$[.@a]+"):"; setarray .@b[.@a], .@f; } else set(.@f,.@f+1); } if(!.@len||.@menu$=="") { mes .npc$; mes "I'm sorry no news has been posted."; close; } mes "[^0000FF"+.@title$[@menu]+"^000000]"; if(compare(.@message$[@menu],.line$)) { if(.rathena) explode(@explode$,.@message$[@menu],.line$); else callfunc("str_explode","@explode$[0]",.@message$[@menu],"/"); set .@a, -1; set .@str_len, getarraysize(@explode$); while(set(.@a,.@a+1)<.@str_len) { if(.case&&!.rathena) { callfunc "str_toarray", @explode$[.@a], "@tmp$[0]"; set @tmp$[0],callfunc("str_changecase", @tmp$[0], 1); set @explode$[.@a],""; set .@i,0; while(getstrlen(@explode$[.@a])<getarraysize(@tmp$)) { set @explode$[.@a],@explode$[.@a]+@tmp$[.@i]; set .@i,.@i+1; } } mes @explode$[.@a]; } } else { mes .@message$[@menu]; } mes "By: "+.@post_name$[@menu]+"."; mes "^656565(@ "+.@time$[@menu]+")^000000"; next; set .@menu$,.@menu$+"Cancel"; select(.@menu$); if(@menu>(.@len-.@f)) close; set @menu, ((@menu-1)+.@b[(@menu-1)]); goto L_PC_Menu; end; OnInit: set .npc$, "[^0000FFServer News^000000]"; waitingroom "Server News!",0; set .rathena, 1; // If you're running rAthena or not. 0=off/1=on set .case, 1; // For non-rAthena only restores upper-case strings. set .in_len, 210; // Max input length. set .line$, "/"; // Line break used to seperate lines. /* Changing the linebreak for non-rAthena clients doesn't work You have to find callfunc("str_explode","@explode$[0]",.@message$[@menu],"/"); and change "/" to what ever you want. (Example "|").*/ } function script str_explode { if ( getarg(2,"") == "" ) return callfunc("str_toarray", getarg(1), getarg(0) ); sleep2 1; setarray .@char$, getarg(2), " ", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "e", "i", "a", "s", "r", "n", "t", "o", "u", "l", "c", "p", "m", "d", "v", "h", "g", "f", "b", "y", "q", "k", "z", "x", "j", "w", "_", "-", "|", "/", ".", "'", "[", "]", "(", ")", "=", "*", "&", "#", "@", "!", "+", "`", "~", "%", "<", ">", "?", ",", "^", ":"; set .@charsize, getarraysize(.@char$); set .@tmp$, "|~key~|"; set .@str$, .@tmp$ + getarg(1) ; set .@len, getstrlen(getarg(1)); set .@parse_len, getstrlen(getarg(2)); while( .@len > .@s ) { set .@i, 0 ; while( .@i < .@charsize ) { if ( ! ( set(.@l,.@l+1) % 600) ) sleep2 1; if ( compare( .@str$ , .@tmp$ + .@char$[.@i] ) ) { set .@tmp$, .@tmp$ + .@char$[.@i]; if ( .@i ) set .@arr$[.@p], .@arr$[.@p] + .@char$[.@i]; else { set .@p, .@p + 1; set .@s, .@s + .@parse_len-1 ; } break; } set .@i, .@i+1 ; } if ( .@i == .@charsize ) return 0; else set .@s, .@s+1 ; } deletearray getd(getarg(0)); copyarray getd(getarg(0)), .@arr$, .@p+1; return .@p+1; } function script str_changecase { sleep2 1; if ( getarg(1) ) { setarray .@char$[ 0 ], " ", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "E", "I", "A", "S", "R", "N", "T", "O", "U", "L", "C", "P", "M", "D", "V", "H", "G", "F", "B", "Y", "Q", "K", "Z", "X", "J", "W", "_", "-", "(", ")", ";", ",", ":", ".", "*", "!", "?", "'"; } else { setarray .@char$[ 0 ], " ", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "e", "i", "a", "s", "r", "n", "t", "o", "u", "l", "c", "p", "m", "d", "v", "h", "g", "f", "b", "y", "q", "k", "z", "x", "j", "w", "_", "-", "(", ")", ";", ",", ":", ".", "*", "!", "?", "'"; } set .@charsize, getarraysize(.@char$); set .@str$, "|~key~|" + getarg(0) ; set .@len, getstrlen(getarg(0)); while( .@len>.@s ) { set .@i,0; while( .@i<.@charsize ) { if ( ! ( set(.@l,.@l+1) % 650) ) sleep2 1; if ( compare( .@str$ , "|~key~|" + .@tmp$ + .@char$[.@i] ) ) { set .@tmp$, .@tmp$ + .@char$[.@i]; break; } set .@i, .@i+1; } if ( .@i == .@charsize ) return ""; else set .@s, .@s+1; } return .@tmp$; } function script str_toarray { sleep2 1; if ( getstrlen( getarg(0) ) > 128 ) return 0; setarray .@char$[ 0 ], " ", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "e", "i", "a", "s", "r", "n", "t", "o", "u", "l", "c", "p", "m", "d", "v", "h", "g", "f", "b", "y", "q", "k", "z", "x", "j", "w", "_", "-", "(", ")", ";", ",", ":", ".", "*", "!", "?", "'"; set .@charsize, getarraysize(.@char$); set .@tmp$, "|~key~|"; set .@str$, .@tmp$ + getarg(0) ; set .@len, getstrlen(getarg(0)); while( .@len>.@s ) { set .@i,0; while( .@i<.@charsize ) { if ( ! ( set(.@l,.@l+1) % 650) ) sleep2 1; if ( compare( .@str$ , .@tmp$ + .@char$[.@i] ) ) { set .@tmp$, .@tmp$ + .@char$[.@i]; set .@arr$[.@s], .@char$[.@i]; break; } set .@i, .@i+1; } if ( .@i == .@charsize ) return 0; else set .@s, .@s+1; } deletearray getd(getarg(1)); copyarray getd(getarg(1)), .@arr$, .@len; return .@len; }
    1 point
  11. Here's an example: - script login_logout -1,{ OnPCLoginEvent: dispbottom "You just logged in."; // do other stuff end; OnPCLogoutEvent: // dispbottom won't be useful because they logged out // ... but we could announce to everyone else: announce strcharinfo(0) + " has just logged out.",bc_all; // do other stuff end; } And yes, disconnects are treated the same as logouts and will also trigger OnPCLogoutEvent.
    1 point
  12. - script nocmd -1,{ OnAgitStart: while(set(.@a,.@a+1)<=.len) while(set(.@h,.@h+1)<=5) setmapflag(.maps$[.@a]+"_cas0"+.@h,mf_nocommand); end; OnAgitEnd: while(set(.@a,.@a+1)<=.len) while(set(.@h,.@h+1)<=5) removemapflag(.maps$[.@a]+"_cas0"+.@h,mf_nocommand); end; OnInit: setarray .maps$[1], "aldeg", "arug", "gefg", "payg", "prtg", "schg"; set .len, getarraysize(.maps$); } Don't edit the map array sould work as is.
    1 point
  13. you want to use esma estun on players? trunk/battle/skill.conf allow_es_magic_player: no set it to : yes
    1 point
  14. rAthena is now back online following a period of extended downtime from May 8th ~ May 28th. This was caused by the unexpected failures of both hard drives the servers were running on. We do realize that the situation could have been better handled, and the Development Team is internally discussing the possibility of finding someone to help with administrative duties. I ask that all posts regarding the downtime remain in this topic, and be constructive in nature. While we can't change what happened, we can take steps to ensure that this does not happen again. We sincerely apologize for any inconvenience this may have caused, and thank you all for your patience.
    1 point
  15. 1) Open src/map/skill.c One Hand Parrying Find: int skill_check_condition_castend(struct map_session_data* sd, short skill, short lv) { struct skill_condition require; struct status_data *status; int i; int index[MAX_SKILL_ITEM_REQUIRE]; After ADD: struct status_change *sc = &sd->sc; Find and Replace the two places like that: if( require.weapon && !pc_check_weapontype(sd,require.weapon) ) { By this: if(require.weapon && !(pc_check_weapontype(sd,require.weapon) || (skill == LK_PARRYING && sc && sc->data[sC_SPIRIT] && sc->data[sC_SPIRIT]->val2 == SL_KNIGHT && sd->status.weapon == W_1HSWORD)) ){ Delay reduction Within function int skill_delayfix (struct block_list *bl, int skill_id, int skill_lv) Find: if ( sc && sc->data[sC_SPIRIT] ) { switch (skill_id) { case CR_SHIELDBOOMERANG: if (sc->data[sC_SPIRIT]->val2 == SL_CRUSADER) time /= 2; break; case AS_SONICBLOW: if (!map_flag_gvg(bl->m) && !map[bl->m].flag.battleground && sc->data[sC_SPIRIT]->val2 == SL_ASSASIN) time /= 2; break; } } Replace with: if ( sc && sc->data[sC_SPIRIT] ) { if(sc->data[sC_SPIRIT]->val2 == SL_KNIGHT) time /= 10; switch (skill_id) { case CR_SHIELDBOOMERANG: if (sc->data[sC_SPIRIT]->val2 == SL_CRUSADER) time /= 2; break; case AS_SONICBLOW: if (!map_flag_gvg(bl->m) && !map[bl->m].flag.battleground && sc->data[sC_SPIRIT]->val2 == SL_ASSASIN) time /= 2; break; } } Open src/map/status.c Block chance change: Find: case SC_PARRYING: val2 = 20 + val1*3; //Block Chance break; Replace with: case SC_PARRYING: if(sd && sd->status.weapon == W_1HSWORD) val2 = val1 * 3; else val2 = 20 + val1*3; //Block Chance break;
    1 point
  16. Don't feel bad about it. It took me lots of practice before I even knew what I was doing. No one is a pro at it at the beginning. The good thing for you is, there are now tutorial videos, and picture guides (Aerie) available to explain each piece of BrowEdit. When I started out, I didn't have anyone to help me out. So it won't take you that long to figure things out with all of the resources available to you. =)
    1 point
  17. BrowEdit allows you to open multiple map instances. To cycle between each instance you use "tab". The Copy/Paste function provided by the Global Height Edit tool can be very unpredictable resulting in irregular editor crashes. You can highlight an area in a map followed by clicking the letter 'c' to copy that portion followed by hitting 'tab' and then left clicking to paste the copied piece. The annoying thing about this is that GAT and terrain height placements do NOT scale with the copied piece onto the paste area. What I mean by this is if a copied piece from a map is some X units high, than wherever you paste it will also result in the same X units high. So if this new area is X units lower than the copied piece, the paste wont scale. Another thing to notice is if you include lightmaps in the copy selection parameters, you will have to use the clearmap tool -> select lightmaps on the map you pasted the copied area to. This is because of the different map dimensions and what the copied lightmaps were originally scaled to. So what I'm to get to is if you are unfamiliar with using the copy/paste tool, I would advise you to stay away from it until you practice using it in test case maps where you get comfortable with it and it works/reacts. You don't want to risk ruining your mapping project because you were testing out the copy/paste tool. Therefore stick with changing the Prontera square manually with the provided edit modes.
    1 point
×
×
  • Create New...