Jump to content

Hyroshima

Members
  • Content Count

    45
  • Joined

  • Last visited

  • Days Won

    5

Reputation Activity

  1. Like
    Hyroshima reacted to anacondaq in Ragnarok Offline Newbie Pack 2022 | Make your RO server in less then 5 minutes   
    Pack v2022:
     
     
    Current Version: 27 December 2021
     
    Update 2023-10-01 - latest versions can be found there: 
    https://discord.gg/p2kvabm
     
    https://ragnarokservice.top/
     
    Download Links (~4.5GB):
    Download from Mirror #1 or Download from Mirror #2 or Download from Mirror #3  
    Important: Please make someone mirror these files. Or make a donation to me and I will make a mirror by myself.

    What is that?

    This is a newbie package that contains 1 click solution for launching Hercules emulator with a single click.
    This package only for education. Do not use this package anywhere in production.

    This package good demonstration of how everything should be configured by yourself to make it work.
    We can find here a good guide on how to configure everything by yourself:
    http://herc.ws/board/topic/16521-how-to-setup-offline-server-for-personal-development-use/

    What inside the package?

    You have 7 folders:
    01_emulator = here emulators (pre-compiled and pre-configured) for RENEWAL or classic PRERE mechanics 02_client_side = here is your client-side what need to copy-paste to your clean kRO client 03_openserver = here is Open Server (MySQL server where stored your game database and which required by the emulator) 04_useful_tools = here are different useful tools that you usually will need when will work with the emulator or databases 05_misc_repos = here are repositories from which it has built the client-side, and exe patched. 06_cmder = this is a tool will be good for you to update the emulator to the latest version (and other files in misc_repos) 07_clean_kRO_client = this is a clean kRO client (2018 somewhere in march updated), need for you to run your own RO copy.
    How to use all of this?
    extract files inside 01_emulator, 02_client_side, 03_openserver, 07_clean_kRO_client Now, what emulator version do you need? Latest (current official servers) (renewal mechanic (suras, dorams, etc classes)) or classic PRE-re (champion, high wizard, high priest)? Now if for example, you use PRERE mechanic (where is high wizard class, paladin, lord knights, and no 3rd classes) your steps are next: a.) go to 02_client_side\FOR_PRERE_EMULATOR\ b.) select all files in this folder (FOR_PRERE_EMULATOR) and copy (CTLR+C) c.) now go to 07_clean_kRO_client/clean_kRO_client/ folder and copy files here (overwrite if windows explorer will ask to do that). d.) now you need to run OpenServer (it's a server that stores all your player's data inside the database, required by the emulator) and run it. e.) Click on Red Flag -> Run the server, make sure in your tray you got Green Flag. f.) Now go to 01_emulator\hercules_PRERE\ and run: run-server.bat g.) Now go to your 07_clean_kRO_client/clean_kRO_client/ and run: 2018-04-18bRagexeRE_patched.exe Your emulator, your database, and the client are running. Now you can try to login into the game.
    About Accounts:

    How to make a GM account or how to access the database?
    For that, you need to click on Green Flag -> Advanced -> PHPMYADMIN
    In the login field of PHPMyAdmin enter: "root", in the password field enter nothing. (no password)
    Press enter or login, and you will be in the database.
    Databases well structured, so mostly always you need not edit too much there.
     
    How to make a GM account?
    You opened PHPMYADMIN.
    Now select your database, and find in this database table called: "login"
    Open this table, and find your account name, and you will see column "group_id".
    Edit number in this column (group_id) to 99.
    0-99 = your GM level. 99 = super admin with all privilegies, 0 = simple player with no privieleges.

    Okay, everything working for me, what can I do next?
     
    My short answer: http://herc.ws/board/ Read all topics, read different guides, read info about NPCs Read info how to add NPCs, how to enable them, how to disable them Read /doc/ folder files inside your emulator folder Read wiki pages: https://herc.ws/wiki/Main_Page Do experiments and do not afraid to destroy everything or remove them.
    Just do mistakes and errors, it's how people learning something new, through mistakes.

    DO not afraid to do a lot of mistakes and ask questions.
    People will help you if you will try to help yourself first and will make good questions with some research before posting messages.


    What tools can I use for making everything much easier for me?
    Tools that you MUST have:
    - Grf Editor - Server Database Editor - VSCode / Notepad++ / Sublime Text / Atom  (any of these editors and select always C syntax highlight for opened files)
    I want to play with my friends on my server
    The solution that you will find by the link below is a terrible solution.
    But usable for a small group of people who for education only want to launch their server ONLINE (for others).
    This is SUPER bad, and never do that, (it's weird, after the only time you will understand why).
    But if you still asking here is the link: https://gist.github.com/anacondaq/3eae8e4afb5d3c3880d08b95b2c54b78

    ===============================================
    I want make a donation as a gesture of goodwill:
    ===============================================
    Ask administrators here: http://herc.ws/board/
    If they accept donations or not, I found no donation link.
    Optionally you can always support the next guys:
    4144 for massive help to the current RO scene at all by his hard work. AnnieRuru for a lot of scripts, helping newbies on the forums http://herc.ws/board/staff/ - all these guys zackdreaver for a lot of efforts on a translation project and to all guys, scripters, mappers, etc players who spend their time, their efforts just for you to make everything free what you see here. Sorry if I didn’t mention someone.
     
    I need help with <something>
    There are a lot of talented developers, software developers, scripters, mappers, spriters, and many other people in this community.
    Check the link: https://herc.ws/board/forum/49-paid-services/
    Also, I accept all questions related to the basic newbie stuff on the topic.
    Do not hesitate to ask even super stupid questions.
    But before asking something, try to do a very simple thing: 
    Open google, in the search bar enter: "site:herc.ws" Then write your question or problem Hit enter and check all links that you see, maybe someone already solved your problem earlier.  
    Alternatively: if you will not be annoying, and will be respectful, I can help with some newbie stuff in the discord channel about the package: https://discord.gg/p2kvabm
     
    Changelog:
    - 2021-04-10 - build from scratch new version with everything new (2020 game client, latest translation, fixed bugs, tons of features and improvements)
    - 20200419 - upgraded emulators, fixed problems with emulators, SQL files, and so on, upgraded full kRO, tools, misc Repos, client-files not touched. Added Discord channel for newbies support.
    - 20200307 - updated emulator, recompiled, uploaded to google drive. Client or db-server files not changed.
    - 20200203 - updated emulator, rest files not touched, if you want to upgrade your emulator, just download the 01_emulator.rar folder, and use it instead of your old one.
     
    I'm Ukrainian in Ukraine. Russia has begun a war against my country, and doing right now is genocide. Destroying cities, even mine own, killing thousands of people, civil people, burning to the ground cities. If you wish to support me in this challenging time (I will try to re-route part of this money to people I know to help them under these awful conditions).
     
    You can donate personally for me for my needs by the link: https://nowpayments.io/donation/anacondaq (crypto).
    Alternatively, you can send money to help Ukraine citizens to the official fond https://www.comebackalive.in.ua/ or 
    to: https://help.gov.ua/
  2. Like
    Hyroshima reacted to Chuu in [Release] Char Creation - remove Doram leftovers   
    What if you removed Doram race from your server and client...

    ...but it just left a ugly space on the char creation window?
    Well here comes the solution. I simply edited the file and made use of the space. 
    You can edit it individually. A .psd file is included for Photoshop/GIMP edits. (Instruction is also included)
     
    Download here ~
    Requirements:
     
  3. Like
    Hyroshima reacted to meko in Array manipulation functions   
    View File Array manipulation functions
    This script provides various array manipulation functions, and more might be added in the future.
    All of those functions (except the arithmetic ones) work with both integer and string arrays.
    The start of the array is always implicitly index 0, unless an index is specified, ie @array[index]



    array_pad(<array>, <size>, <value>)
    pads the array left or right with <value> until it reaches <size> size. If <size> is negative it will pad left.
    > returns the number of added entries
    setarray(.@foo, 1, 2, 3, 4, 5); // initialize the array array_pad(.@foo, 8, 69); // => 3 // array is now: 1, 2, 3, 4, 5, 69, 69, 69 setarray(.@foo, 1, 2, 3, 4, 5); // initialize the array array_pad(.@foo, -8, 69); // => 3 // array is now: 69, 69, 69, 1, 2, 3, 4, 5


    array_replace(<array>, <needle>, <replacement>{, <neq>})
    finds every occurrence of <needle> within the array and replaces it with <replacement>. if <neq> is true, finds entries that do not match instead
    > returns the number of changed entries setarray(.@foo, 1, 1, 3, 1, 5); // initialize the array array_replace(.@foo, 1, 69); // => 3 // array is now: 69, 69, 3, 69, 5


    array_find(<array>, <needle>{, <neq>})
    finds the first occurrence of <needle> within the array. if <neq> is true, finds entries that do not match instead
    > returns the index, or if none is found returns -1 setarray(.@foo, 1, 2, 3, 4, 5); // initialize the array array_find(.@foo, 3); // => 2 array_find(.@foo, 1); // => 0 array_find(.@foo, 6); // => -1


    array_rfind(<array>, <needle>{, <neq>})
    like array_find, but finds the last occurrence. if <neq> is true, finds entries that do not match instead
    > returns the index, or if none is found returns -1 setarray(.@foo, 1, 2, 3, 4, 3); // initialize the array array_rfind(.@foo, 3); // => 4 array_rfind(.@foo, 4); // => 3 array_rfind(.@foo, 6); // => -1


    array_exists(<array>, <needle>{, <neq>})
    very similar to array_find() but it instead just checks if it exists or not. if <neq> is true, finds entries that do not match instead > returns true or false setarray(.@foo, 1, 2, 3, 4, 5); // initialize the array array_exists(.@foo, 3); // => true array_exists(.@foo, 6); // => false


    array_count(<array>, <needle>{, <neq>})
    similar to array_find() but iterates through the whole array. if <neq> is true, finds entries that do not match instead
    > returns the total number of occurrences of <needle> setarray(.@foo, 1, 69, 3, 69, 5); // initialize the array array_count(.@foo, 69); // => 2


    array_entries(<array>)
    a wrapper around array_count(). behaves similarly to getaraysize() but does not count holes
    > returns the number of non-empty entries setarray(.@foo, 1, 2, 0, 0, 5); // initialize the array getarraysize(.@foo); // => 5 array_entries(.@foo); // => 3



    array_remove(<array>, <needle>{, <neq>})
    finds and removes every occurrence of <needle> from the array, while shifting left. if <neq> is true, finds entries that do not match instead
    > returns the number of removed entries setarray(.@foo, 1, 69, 3, 69, 5); // initialize the array array_remove(.@foo, 69); // => 2 // array is now: 1, 3, 5


    array_reverse(<array>)
    reverses the array
    > returns true setarray(.@foo, 1, 2, 3, 4, 5); // initialize the array array_reverse(.@foo); // => true // array is now: 5, 4, 3, 2, 1


    array_sum(<array>)
    iterates through the whole array to perform an arithmetic addition
    > returns the sum of every entries of the array setarray(.@foo, 1, 2, 3, 4, 5); // initialize the array array_sum(.@foo); // ((((1 + 2) + 3) + 4) + 5) => 15


    array_difference(<array>)
    iterates through the whole array to perform an arithmetic subtraction
    > returns the difference of every entries of the array setarray(.@foo, 1, 2, 3, 4, 5); // initialize the array array_difference(.@foo); // ((((1 - 2) - 3) - 4) - 5) => -13


    array_product(<array>)
    iterates through the whole array to perform an arithmetic multiplication
    > returns the product of every entries of the array setarray(.@foo, 1, 2, 3, 4, 5); // initialize the array array_product(.@foo); // ((((1 * 2) * 3) * 4) * 5) => 120


    array_quotient(<array>)
    iterates through the whole array to perform an arithmetic division
    > returns the quotient of every entries of the array setarray(.@foo, 1, 2, 3, 4, 5); // initialize the array array_quotient(.@foo); // ((((1 / 2) / 3) / 4) / 5) => 0


    array_shift(<array>)
    removes the first entry of the array, while shifting left
    > returns the value of the removed entry setarray(.@foo, 1, 2, 3, 4, 5); // initialize the array array_shift(.@foo); // => 1 // array is now: 2, 3, 4, 5


    array_unshift(<array>, <value>)
    adds <value> to the start of the array, while shifting right
    > returns the new size of the array setarray(.@foo, 1, 2, 3, 4, 5); // initialize the array array_unshift(.@foo, 69); // => 6 // array is now: 69, 1, 2, 3, 4, 5


    array_pop(<array>)
    removes the last entry of the array
    > returns the value of the removed entry setarray(.@foo, 1, 2, 3, 4, 5); // initialize the array array_pop(.@foo); // => 5 // array is now: 1, 2, 3, 4


    array_push(<array>, <value>)
    adds <value> to the end of the array
    > returns the new size of the array setarray(.@foo, 1, 2, 3, 4, 5); // initialize the array array_push(.@foo, 69); // => 6 // array is now: 1, 2, 3, 4, 5, 69


    array_shuffle(<array>)
    shuffles the array
    > returns true setarray(.@foo, 1, 2, 3, 4, 5); // initialize the array array_shuffle(.@foo); // => true // array is now: 1, 4, 2, 3, 5 (example, unpredictable)


    array_unique(<array>{, <threshold>})
    allows array entries to appear up to <threshold> times (1 by default) and removes the extraneous ones. useful to remove duplicate entries
    > returns the number of removed entries
    setarray(.@foo, 1, 3, 3, 4, 5); // initialize the array array_unique(.@foo); // => 1 // array is now: 1, 3, 4, 5


    array_diff(<base array>, <array>{, <array>...}, <result array>)
    compares the base array against one or more other arrays and fills the result array with the entries in base array that are not present in any of the other arrays
    > returns the number of entries not found in other arrays
    setarray(.@base, 1, 2, 3, 4, 5, 6, 7, 8); // initialize the base array // fill the arrays to compare with the base array: setarray(.@foo, 2, 3, 4, 5, 6, 7, 8); // missing "1" setarray(.@bar, 1, 2, 3, 4, 6, 7, 8); // missing "5" setarray(.@baz, 1, 2, 3, 4, 5, 6, 7); // missing "8" // compare foo, bar and baz against base, and fill result: array_diff(.@base, .@foo, .@bar, .@baz, .@result); // => 3 // .@result is now: 1, 5, 8


    array_filter(<array>, "<function>")
    filters the array using a function that is tested against every entries. if the function returns false, the relevant entry is removed and the array is shifted left
    > returns the number of removed entries
    function script is_prime { if (getarg(0) <= 1) return false; for (.@i = 2; .@i <= getarg(0) / 2; ++.@i) if ((getarg(0) % .@i) == 0) return false; return true; } setarray(.@foo, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); array_filter(.@foo, "is_prime"); // => 9 // array is now: 2, 3, 5, 7, 11, 13


    array_sort(<array>)
    sorts the array in ascending order
    > returns true
    setarray(.@foo, 2, 1, 8, 4, 5, 7, 6, 3); // initialize the array array_sort(.@foo); // => true // array is now: 1, 2, 3, 4, 5, 6, 7, 8


    array_rsort(<array>)
    sorts the array in descending order
    > returns true
    setarray(.@foo, 2, 1, 8, 4, 5, 7, 6, 3); // initialize the array array_rsort(.@foo); // => true // array is now: 8, 7, 6, 5, 4, 3, 2, 1



    Requires Hercules of June 24 2017 or newer version


     
    --------------------------------------------------------------------------------------
    This script was made by me, for The Mana World + Evol.
    License: public domain (CC0)
    Submitter meko Submitted 05/29/17 Category Quest, Shops, Functions & Algorithms  
  4. Like
    Hyroshima got a reaction from Timokha in How to limit random event   
    //Add a call function in item // callfunc "Boxx"; function script Boxx { //Item ID //== setarray .@ItemID[0],1108,2104,5011,2301,2404; setarray .@itemRF[0], 10, 10, 10, 7, 10; //check if you still have an item with a refine lower than 10 //== for(set .@i,0; .@i<getarraysize(.@ItemID); set .@i,.@i+1) if((getd("eqi_"+.@ItemID[.@i])-1) < .@itemRF[.@i]) setarray .@equips[getarraysize(.@equips)],.@ItemID[.@i]; //All max refined //== if(!getarraysize(.@equips)){ dispbottom "Bye bye."; end; } set .@idx,rand(getarraysize(.@equips)); set .@slot,getiteminfo(.@equips[.@idx],ITEMINFO_LOC); switch(.@slot) { case 2: set .@slot,EQI_HAND_R; break; case 16: set .@slot,EQI_ARMOR; break; case 32: set .@slot,EQI_HAND_L; break; case 64: set .@slot,EQI_SHOES; break; case 256: set .@slot,EQI_HEAD_TOP; break; } if(getd("eqi_"+.@equips[.@idx])) { if(!countitem(.@equips[.@idx])){ dispbottom "Item not found "+getitemname(.@equips[.@idx])+"!"; end; } if(getequipid(.@slot) != .@equips[.@idx]) equip .@equips[.@idx]; successrefitem .@slot; setd "eqi_"+.@equips[.@idx],getd("eqi_"+.@equips[.@idx])+1; } else { setd "eqi_"+.@equips[.@idx],1; getitem .@equips[.@idx],1; } end; } I haven't tested it, check if it will work as you wanted.
  5. Like
    Hyroshima got a reaction from Timokha in How to limit random event   
    I made this model as you explained how it works.
     
    //Add a call function in item // callfunc "Boxx"; function script Boxx { //Item ID //== setarray .@ItemID[0],1108,2104,5011,2301,2404; //check if you still have an item with a refine lower than 10 //== for(set .@i,0; .@i<getarraysize(.@ItemID); set .@i,.@i+1) if((getd("eqi_"+.@ItemID[.@i])-1) < 10) setarray .@equips[getarraysize(.@equips)],.@ItemID[.@i]; //All refined +10 //== if(!getarraysize(.@equips)){ dispbottom "Bye bye."; end; } set .@idx,rand(getarraysize(.@equips)); set .@slot,getiteminfo(.@equips[.@idx],ITEMINFO_LOC); switch(.@slot) { case 2: set .@slot,EQI_HAND_R; break; case 16: set .@slot,EQI_ARMOR; break; case 32: set .@slot,EQI_HAND_L; break; case 64: set .@slot,EQI_SHOES; break; case 256: set .@slot,EQI_HEAD_TOP; break; } if(getd("eqi_"+.@equips[.@idx])) { if(!countitem(.@equips[.@idx])){ dispbottom "Item not found "+getitemname(.@equips[.@idx])+"!"; end; } if(getequipid(.@slot) != .@equips[.@idx]) equip .@equips[.@idx]; successrefitem .@slot; setd "eqi_"+.@equips[.@idx],getd("eqi_"+.@equips[.@idx])+1; } else { setd "eqi_"+.@equips[.@idx],1; getitem .@equips[.@idx],1; } end; }  
  6. Like
    Hyroshima got a reaction from IndieRO in How to limit random event   
    I made this model as you explained how it works.
     
    //Add a call function in item // callfunc "Boxx"; function script Boxx { //Item ID //== setarray .@ItemID[0],1108,2104,5011,2301,2404; //check if you still have an item with a refine lower than 10 //== for(set .@i,0; .@i<getarraysize(.@ItemID); set .@i,.@i+1) if((getd("eqi_"+.@ItemID[.@i])-1) < 10) setarray .@equips[getarraysize(.@equips)],.@ItemID[.@i]; //All refined +10 //== if(!getarraysize(.@equips)){ dispbottom "Bye bye."; end; } set .@idx,rand(getarraysize(.@equips)); set .@slot,getiteminfo(.@equips[.@idx],ITEMINFO_LOC); switch(.@slot) { case 2: set .@slot,EQI_HAND_R; break; case 16: set .@slot,EQI_ARMOR; break; case 32: set .@slot,EQI_HAND_L; break; case 64: set .@slot,EQI_SHOES; break; case 256: set .@slot,EQI_HEAD_TOP; break; } if(getd("eqi_"+.@equips[.@idx])) { if(!countitem(.@equips[.@idx])){ dispbottom "Item not found "+getitemname(.@equips[.@idx])+"!"; end; } if(getequipid(.@slot) != .@equips[.@idx]) equip .@equips[.@idx]; successrefitem .@slot; setd "eqi_"+.@equips[.@idx],getd("eqi_"+.@equips[.@idx])+1; } else { setd "eqi_"+.@equips[.@idx],1; getitem .@equips[.@idx],1; } end; }  
  7. Like
    Hyroshima got a reaction from IndieRO in NPC Teleportador   
    seria isso?
    prontera,151,169,5 script Alquimista Teleport 113,{ if(Class == 5 || Class == 18 || Class == 4019) { dispbottom "class: "+Class+""; mes "Você pode ser teleportado."; next; warp "prontera",150,150; end; } mes "Somente Alquimistas podem usar esse npc."; close; }  
  8. Like
    Hyroshima got a reaction from Aruar in Add cooldown dynamically on npcs   
    I made this function for a friend and it can be useful in general. 
    basically allows you to add wait time for something in npc, you can put different times in the same npc using the reference names.
    a utility to put in Global_Functions
     
    //== Function F_SetNpcCD ================================ // Add cooldown to access specific functions of a pc but not limited //== // callfunc "F_SetNpcCD","reference_name",time_in_seconds{,cooldown type}; // Examples: // callfunc("F_SetNpcCD","name_example0",45) // Adds 45 second cooldown at player level // callfunc("F_SetNpcCD","name_example1",85,1) // Adds 1 minute 25 second cooldown at player level // callfunc("F_SetNpcCD","name_example2",120,2) // Adds 2-minute cooldown at account level function script F_SetNpcCD { set .@var$,(countstr(getarg(0)," ")?replacestr(getarg(0)," ","_"):getarg(0)); set .@time,getarg(1); set .@type,getarg(2,0); setd(""+(.@type==2?"#":"")+""+.@var$+"_time",gettimetick(2)+.@time); return; } //== Function F_GetNpcCD ================================ // Check npc access cooldown //== // callfunc "F_GetNpcCD","name_example"{,cooldown type}; // Examples: // callfunc("F_GetNpcCD","name_example0") // returns "NPC Cooldown: 00H:00M:45s (player)" // callfunc("F_GetNpcCD","name_example1",1) // returns "NPC Cooldown: 00H:01M:25s (player)" // callfunc("F_GetNpcCD","name_example2",2) // returns "NPC Cooldown: 00H:02M:00s (account)" function script F_GetNpcCD { set .@var$,(countstr(getarg(0)," ")?replacestr(getarg(0)," ","_"):getarg(0)); set .@type,getarg(1,0); if(gettimetick(2) < getd(""+(.@type==2?"#":"")+""+.@var$+"_time")) { set .@ts,getd(""+(.@type==2?"#":"")+""+.@var$+"_time")-gettimetick(2); set .@h,.@ts/3600; set .@m,(.@ts%3600)/60; set .@s,.@ts%60; dispbottom "NPC Cooldown: "+(.@h<10?"0"+.@h:.@h)+"H:"+(.@m<10?"0"+.@m:.@m)+"M:"+(.@s<10?"0"+.@s:.@s)+"s ("+(.@type==2?"account":"player")+")"; end; } return; }  
  9. Like
    Hyroshima got a reaction from IndieRO in Add cooldown dynamically on npcs   
    I made this function for a friend and it can be useful in general. 
    basically allows you to add wait time for something in npc, you can put different times in the same npc using the reference names.
    a utility to put in Global_Functions
     
    //== Function F_SetNpcCD ================================ // Add cooldown to access specific functions of a pc but not limited //== // callfunc "F_SetNpcCD","reference_name",time_in_seconds{,cooldown type}; // Examples: // callfunc("F_SetNpcCD","name_example0",45) // Adds 45 second cooldown at player level // callfunc("F_SetNpcCD","name_example1",85,1) // Adds 1 minute 25 second cooldown at player level // callfunc("F_SetNpcCD","name_example2",120,2) // Adds 2-minute cooldown at account level function script F_SetNpcCD { set .@var$,(countstr(getarg(0)," ")?replacestr(getarg(0)," ","_"):getarg(0)); set .@time,getarg(1); set .@type,getarg(2,0); setd(""+(.@type==2?"#":"")+""+.@var$+"_time",gettimetick(2)+.@time); return; } //== Function F_GetNpcCD ================================ // Check npc access cooldown //== // callfunc "F_GetNpcCD","name_example"{,cooldown type}; // Examples: // callfunc("F_GetNpcCD","name_example0") // returns "NPC Cooldown: 00H:00M:45s (player)" // callfunc("F_GetNpcCD","name_example1",1) // returns "NPC Cooldown: 00H:01M:25s (player)" // callfunc("F_GetNpcCD","name_example2",2) // returns "NPC Cooldown: 00H:02M:00s (account)" function script F_GetNpcCD { set .@var$,(countstr(getarg(0)," ")?replacestr(getarg(0)," ","_"):getarg(0)); set .@type,getarg(1,0); if(gettimetick(2) < getd(""+(.@type==2?"#":"")+""+.@var$+"_time")) { set .@ts,getd(""+(.@type==2?"#":"")+""+.@var$+"_time")-gettimetick(2); set .@h,.@ts/3600; set .@m,(.@ts%3600)/60; set .@s,.@ts%60; dispbottom "NPC Cooldown: "+(.@h<10?"0"+.@h:.@h)+"H:"+(.@m<10?"0"+.@m:.@m)+"M:"+(.@s<10?"0"+.@s:.@s)+"s ("+(.@type==2?"account":"player")+")"; end; } return; }  
  10. Like
    Hyroshima got a reaction from Tio Akima in Add cooldown dynamically on npcs   
    I made this function for a friend and it can be useful in general. 
    basically allows you to add wait time for something in npc, you can put different times in the same npc using the reference names.
    a utility to put in Global_Functions
     
    //== Function F_SetNpcCD ================================ // Add cooldown to access specific functions of a pc but not limited //== // callfunc "F_SetNpcCD","reference_name",time_in_seconds{,cooldown type}; // Examples: // callfunc("F_SetNpcCD","name_example0",45) // Adds 45 second cooldown at player level // callfunc("F_SetNpcCD","name_example1",85,1) // Adds 1 minute 25 second cooldown at player level // callfunc("F_SetNpcCD","name_example2",120,2) // Adds 2-minute cooldown at account level function script F_SetNpcCD { set .@var$,(countstr(getarg(0)," ")?replacestr(getarg(0)," ","_"):getarg(0)); set .@time,getarg(1); set .@type,getarg(2,0); setd(""+(.@type==2?"#":"")+""+.@var$+"_time",gettimetick(2)+.@time); return; } //== Function F_GetNpcCD ================================ // Check npc access cooldown //== // callfunc "F_GetNpcCD","name_example"{,cooldown type}; // Examples: // callfunc("F_GetNpcCD","name_example0") // returns "NPC Cooldown: 00H:00M:45s (player)" // callfunc("F_GetNpcCD","name_example1",1) // returns "NPC Cooldown: 00H:01M:25s (player)" // callfunc("F_GetNpcCD","name_example2",2) // returns "NPC Cooldown: 00H:02M:00s (account)" function script F_GetNpcCD { set .@var$,(countstr(getarg(0)," ")?replacestr(getarg(0)," ","_"):getarg(0)); set .@type,getarg(1,0); if(gettimetick(2) < getd(""+(.@type==2?"#":"")+""+.@var$+"_time")) { set .@ts,getd(""+(.@type==2?"#":"")+""+.@var$+"_time")-gettimetick(2); set .@h,.@ts/3600; set .@m,(.@ts%3600)/60; set .@s,.@ts%60; dispbottom "NPC Cooldown: "+(.@h<10?"0"+.@h:.@h)+"H:"+(.@m<10?"0"+.@m:.@m)+"M:"+(.@s<10?"0"+.@s:.@s)+"s ("+(.@type==2?"account":"player")+")"; end; } return; }  
  11. Like
    Hyroshima reacted to AnnieRuru in Change Equipment Skin   
    https://rathena.org/board/topic/117831-showcase-weapon-skin/.
    https://github.com/rathena/rathena/issues/1779
    got people ask how to do that ...
    so I write a plugin for it
    Download: 1.1
    plugin
     
    also need to add a file in conf/import/change_equipment_skin.conf
    change_equipment_skin: ( { Type: "LOOK_WEAPON" ItemID: 24001 SkinID: 1238 }, //{ // Type: "LOOK_SHIELD" // ItemID: 24002 // SkinID: 2101 //}, ) When player equip a shadow weapon ID 24001, will show the weapon look 1238, which is Zeny_Knife
    "@reloadequipmentskin" will reload this file ...
     
    Note: yes, the clif->sendlook is extremely messy, I attempt to make this support change shield skin
    but for dunno what reason, equip a shield telling the client changing LOOK_WEAPON ... WTF !!
    if anybody knows how to make it support shield, I'm open to suggestion
     
  12. Like
    Hyroshima reacted to AnnieRuru in hosting Hercules on Google Cloud with CentOS 8   
    Over the last few days I have been playing with Google Cloud services
    because Google cloud currently offers $300 free credit upon signing up
    yes, FREE $300 credit
    and thus my journey trying to host hercules server on a VPS has begun
     
    all you need is a valid Debit/Credit card number ...
    of course you have to be an adult to try the hosting service ... right ?
     

     
     
    oh and, don't worry, you can always cancel it anytime

     
    after playing with it, I found the Windows option is too expensive, and thus trying to learn the Linux option
     
    This guide is actually demonstrate by using a trash gmail account that can throw away later
    I don't mind all the credentials are shown in the screenshot, when I click the Open topic button I have deleted this project on Google Cloud
     
     
    Step 1. Download Putty and WinCP
    https://www.putty.org/.
    https://winscp.net/eng/download.php
     
    Step 2. Run Google Cloud
    2.1 login to your Google cloud project
    https://github.com/AnnieRuru/customs/blob/master/server hosting/2.png
     
    2.2 first you need to link your credit card to this google cloud
    https://github.com/AnnieRuru/customs/blob/master/server hosting/3.png.
    https://github.com/AnnieRuru/customs/blob/master/server hosting/4.png
    select the billing option to the debit/credit number you input earlier
    https://github.com/AnnieRuru/customs/blob/master/server hosting/5.png
    this billing information is very important, you need to check this once in a while to stop unwanted services <-- please scroll to the right
     
    2.3 pin these 3
    - billing
    - compute engine
    - VPC network
    https://github.com/AnnieRuru/customs/blob/master/server hosting/6.png
     
    2.4 now time to create a VPS, select Compute Engine
    https://github.com/AnnieRuru/customs/blob/master/server hosting/7.png
    2.4.1
    enter all the necessary information
    1. the Virtual machine name
    2. your nearest location
    3. the spec of the machine
    https://github.com/AnnieRuru/customs/blob/master/server hosting/8.png
     
    PS: I tested the cheapest option, N1 series, f1 micro 614MB memory and E2 micro, 1GB memory
    when compiling hercules later, putty just stop ... I think it run out of memory
    ... hercules should have mention a recommendation needs at least 2GB memory to run
     
    2.4.2
    4. Select Boot Disk as CentOS 8
    https://github.com/AnnieRuru/customs/blob/master/server hosting/9.png
    5. select allow HTTP and HTTPS
    https://github.com/AnnieRuru/customs/blob/master/server hosting/10.png
     
    2.4.3
    6. Click Security tab
    https://github.com/AnnieRuru/customs/blob/master/server hosting/11.png
    needs to 'Enter public SSH key'
     
    run Putty Key Generator and click Generate
    https://github.com/AnnieRuru/customs/blob/master/server hosting/12.png
     
    1. change the 'key comment' as it will become user name
    2. save private key to desktop
    3. copy the field
    https://github.com/AnnieRuru/customs/blob/master/server hosting/13.png
     
    paste into Google cloud
    https://github.com/AnnieRuru/customs/blob/master/server hosting/14.png
     
    2.4.4
    select Networking tab
    https://github.com/AnnieRuru/customs/blob/master/server hosting/15.png
    create a static IP address
    https://github.com/AnnieRuru/customs/blob/master/server hosting/16.png
    choose standard tier
     
    after everything done click [Confirm]
    https://github.com/AnnieRuru/customs/blob/master/server hosting/17.png
    and you get your virtual machine running
    https://github.com/AnnieRuru/customs/blob/master/server hosting/18.png
     
    2.5
    once your server up and running
    run Putty to connect to this server
    https://github.com/AnnieRuru/customs/blob/master/server hosting/19.png
    1. scroll down, expand 'SSH' to select 'Auth',
    2. then load the file you saved earlier by PuttyGen
    https://github.com/AnnieRuru/customs/blob/master/server hosting/20.png
    3. enter the public IP address,
    4. then click open
     
    https://github.com/AnnieRuru/customs/blob/master/server hosting/21.png
    it will prompt you with security alert, just click yes
     
    2.6
    login with your user name
    https://github.com/AnnieRuru/customs/blob/master/server hosting/22.png
     
    The very first command you should run is change the password
    sudo passwd root ok Windows Users, don't freak out like me
    there are no ******** when you input the password, this is Linux not Windows
    just input normally ... and press Enter key, it works that way
    https://github.com/AnnieRuru/customs/blob/master/server hosting/23.png
    then do the same with your username
    sudo passwd annie  
    3. update the OS and install all necessary product
     
    3.1 run all these commands
    sudo yum update sudo yum install gcc make mysql mysql-devel mysql-server pcre-devel git zlib-devel Transaction Summary ================================================================================ Install 89 Packages Total download size: 108 M Installed size: 395 M Is this ok [y/N]: Press 'Y' key
     
    3.2
    in the meantime, while this might take awhile, try login WinCP
    https://github.com/AnnieRuru/customs/blob/master/server hosting/24.png
    click new session, then click advance
    https://github.com/AnnieRuru/customs/blob/master/server hosting/25.png
    select 'Authentication' and load the Putty Gen file again
    https://github.com/AnnieRuru/customs/blob/master/server hosting/26.png
    just another warning
    https://github.com/AnnieRuru/customs/blob/master/server hosting/27.png
     
     
    3.3 Download Hercules
    git clone https://github.com/HerculesWS/Hercules.git ~/Hercules  
    4. SQL
     
    4.1 Start SQL service
    sudo systemctl start mysqld.service  
    4.2 login as root
    mysql -u root -p Enter password, just press enter
    default centOS 8 preinstalled MySQL, root has no password
     
    Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 10 Server version: 8.0.21 Source distribution Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> 4.3 create database
    CREATE DATABASE hercules; 4.4 select hercules database as default
    USE `hercules`; 4.5 create another user, not recommend to connect as root
    CREATE USER 'annie'@'localhost' IDENTIFIED BY '1234'; 4.6 grant this user privilege
    GRANT SELECT,INSERT,UPDATE,DELETE ON * TO 'annie'@'localhost'; 4.7 then quit
    quit it should show like this
    mysql> quit Bye [annie@centos ~]$ 4.8 goto sql-files directory
    cd /home/annie/Hercules/sql-files/ and run all these
    mysql -u root -p hercules < main.sql mysql -u root -p hercules < logs.sql mysql -u root -p hercules < item_db_re.sql mysql -u root -p hercules < mob_db_re.sql mysql -u root -p hercules < mob_skill_db_re.sql it should show like this
    [annie@centos ~]$ cd /home/annie/Hercules/sql-files/ [annie@centos sql-files]$ mysql -u root -p hercules < main.sql Enter password: [annie@centos sql-files]$ mysql -u root -p hercules < logs.sql Enter password: [annie@centos sql-files]$ mysql -u root -p hercules < item_db_re.sql Enter password: [annie@centos sql-files]$ mysql -u root -p hercules < mob_db_re.sql Enter password: [annie@centos sql-files]$ mysql -u root -p hercules < mob_skill_db_re.sql Enter password: [annie@centos sql-files]$ 4.9 go back login mysql and change inter-server connection password from s1/p1 into qwer/asdf
    mysql -u root -p and
    UPDATE `hercules`.`login` SET `userid` = 'qwer', `user_pass` = 'asdf' WHERE `account_id` = 1;  
    5. Compile Hercules
     
    go back to annie/hercules folder
    cd /home/annie/Hercules/ 5.1 type ./configure
    ./configure  
    OK STOP, many things can go wrong here, I stuck here for a few days and searching on both rathena and hercules forum for answers
    the correct output from putty should be this
    checking mysql.h presence... yes checking for mysql.h... yes checking whether my_bool is supported (MySQL)... no (converting my_bool to bool) checking MySQL library (required)... yes (8.0.21) checking PCRE library... checking pcre.h usability... yes checking pcre.h presence... yes checking for pcre.h... yes checking for library containing pcre_study... -lpcre checking for doxygen... no checking for perl... yes 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/libbacktrace/Makefile config.status: creating 3rdparty/libbacktrace/backtrace-supported.h config.status: creating src/char/Makefile config.status: creating src/login/Makefile config.status: creating src/map/Makefile config.status: creating src/plugins/Makefile config.status: creating src/test/Makefile config.status: creating tools/HPMHookGen/Makefile config.status: creating tools/doxygen/Makefile [annie@centos Hercules]$ if it doesn't show config.status: at the end, open a new topic in Linux support
    if it's the same as mine, then can proceed with
     
    5.2 compile hercules
    make sql finally compile should show like this
    CC party.c CC path.c CC pc.c CC pc_groups.c CC pet.c CC quest.c CC refine.c CC rodex.c CC script.c CC searchstore.c CC skill.c CC status.c CC storage.c CC stylist.c CC trade.c CC unit.c CC vending.c LD map-server make[1]: Leaving directory '/home/annie/Hercules/src/map' building conf/import folder... [annie@centos Hercules]$  
    6. configure Hercules
     
    6.1 start hercules by
    ./athena-start start https://github.com/AnnieRuru/customs/blob/master/server hosting/28.png
    of course the reason why connect to SQL failed is because haven't configure Hercules so ....
    stop it from running for a moment
    ./athena-start stop  
    6.2 login to WinCP
    https://github.com/AnnieRuru/customs/blob/master/server hosting/29.png
    ... I will assume you know how to change your public IP address on hercules
    the file you should change are
    map-server.conf
    - userid: "qwer"
    - passwd: "asdf"
    - map_ip: "35.213.138.42"
    - char_ip: "35.213.138.42" char-server.conf
    - userid: "qwer"
    - passwd: "asdf"
    - login_ip: "35.213.138.42"
    - char_ip: "35.213.138.42" conf\global\sql_connections.conf
    -db_hostname: "localhost"
    - db_port: 3306
    - db_username: "annie"
    - db_password: "1234"
    - db_database: "hercules" conf\network.conf
    .....<let me test this thing again> ....  
    <--- I will assume everyone reading this guide already know how to host an offline server, if not click here -->
     
    now run ./athena-start start again, and this time map-server couldn't connect to char-server
     
    7. Configure firewall
     
    7.1 run these 3 commands
    sudo firewall-cmd --permanent --add-port 6900/tcp sudo firewall-cmd --permanent --add-port 6121/tcp sudo firewall-cmd --permanent --add-port 5121/tcp 7.2 reload the firewall settings
    sudo firewall-cmd --reload 7.3 go back to Google Cloud,
    https://github.com/AnnieRuru/customs/blob/master/server hosting/30.png
    to create firewall
    https://github.com/AnnieRuru/customs/blob/master/server hosting/31.png
    configure the firewall
    https://github.com/AnnieRuru/customs/blob/master/server hosting/32.png
    2. & 3. configure firewall only to this project
    https://github.com/AnnieRuru/customs/blob/master/server hosting/33.png
     
    4. at 'tcp:' tab, only allow these 3 ports
    https://github.com/AnnieRuru/customs/blob/master/server hosting/34.png
     
    7.4
    run ./athena-start start again.
    then goto https://portchecker.co/ and check your port is open
    https://github.com/AnnieRuru/customs/blob/master/server hosting/35.png
    And Finally go to your client edit data/sclientinfo.xml to the WAN IP and

    VIOLA !! DONE !!
    I can connect my client to google cloud
     
    PS: the port checker website only shows Port 6900 is OPEN. only if fulfill these 3 conditions
    1. enable firewall setting on CentOS
    2. enable firewall setting on Google Cloud
    3. run the emulator by ./athena-start
     
     
    Ok now you can start worry about security issue like adding additional user in CentOS
    https://www.digitalocean.com/community/tutorials/how-to-add-and-delete-users-on-a-centos-7-server
    google cloud doesn't seem to allow login that way -> https://stackoverflow.com/questions/52503453/how-to-login-gcp-console-without-ssh
    and mysql root account password change ...
    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '1234'; etc...etc...
    need more research
     
     
    Connect to MySQL in CentOS 8 using Window's MySQL Workbench
     
    1. add another connection
    https://github.com/AnnieRuru/customs/blob/master/server hosting/mysql1.png
     
    2. under 'Connection Method', select 'Standard TCP/IP over SSH'
    https://github.com/AnnieRuru/customs/blob/master/server hosting/mysql2.png
     
    3. configure these fields
    3.1 SSH hostname is the server IP address
    3.2 SSH username is the name you created with PuttyGen
    3.3 SSH keyfile needs a conversion with PuttyGen
    3.4 and Click [Test Connection]
    https://github.com/AnnieRuru/customs/blob/master/server hosting/mysql3.png
     
    4. the SSH keyfile needs to be convert from PuttyGen
    4.1 load existing private key, in this case was 'annie.ppk'
    4.2 click conversion and save as 'annie' without file extension
    https://github.com/AnnieRuru/customs/blob/master/server hosting/mysql4.png
     
    5. if successful it will show like this
    https://github.com/AnnieRuru/customs/blob/master/server hosting/mysql5.png
     
    then you can login into MySQL in CentOS
     
    did I forgot to mention needs to open the port 3306 in CentOS and Google Cloud ? refer back to step 7
     
    Reference: https://stackoverflow.com/questions/21527743/mysql-workbench-version-6-0-8-ssh-authentication-issue
     
     
    After thought :
    Overall I'm very satisfy with Google Cloud service,
    1. free $300 credit to spend
    2. can always register trash gmail account to make the credit infinite
      - of course the IP will always change if you do so
    3. very low latency from Malaysia connect to Singapore - just 30~40ms ping
     
    I haven't try OVH which everybody is recommending, but they doesn't offer immediate free credit for me to test so meh .....
     
    and I notice Hercules's wiki CentOS guide is broken, maybe I'll fix it
    https://github.com/HerculesWS/Hercules/wiki/Installation-(CentOS)
     
    - offtopic -
    over last few days playing with google cloud, when I visit Youtube, all my advertisement become Monday.com etc etc group project stuffs
    google really knows how to collect my data
  13. Like
    Hyroshima got a reaction from Timokha in How to delete value from the array?   
    try like this:
    OnPCDieEvent: if(strcharinfo(3) == MY_EVENT_MAP) { for(set .@i,0; .@i<getarraysize($MY_VARIABLE); set .@i,.@i+1) { if(getcharid(3) == $MY_VARIABLE[.@i]) { deletearray $MY_VARIABLE[.@i],1; dispbottom "Game over."; break; } } } end;  
  14. Like
    Hyroshima reacted to WhiteEagle in Item drop with random refine level/card   
    At first thanks for your response and yes it isnt hard to do like this,
    but the problem with makeitem is, it can happen it drop twice. (1x normal and 1x from makeitem)
    As example: Poring get killed and drop a knife and with some "luck" prog the makeitem, so he get 2 knifes.
    I would have to switch off the normal drop completely and just let makeitem run.
     
    Edit:
    If i understand this correct, could this added here.
    /*========================================== * item drop with delay (timer function) *------------------------------------------*/ static int mob_delay_item_drop(int tid, int64 tick, int id, intptr_t data) { struct item_drop_list *list; struct item_drop *ditem; list=(struct item_drop_list *)data; ditem = list->item; while (ditem) { struct item_drop *ditem_prev; map->addflooritem(NULL, &ditem->item_data,ditem->item_data.amount, list->m,list->x,list->y, list->first_charid,list->second_charid,list->third_charid,0, ditem->showdropeffect); ditem_prev = ditem; ditem = ditem->next; ers_free(item_drop_ers, ditem_prev); } ers_free(item_drop_list_ers, list); return 0; }  
  15. Like
    Hyroshima reacted to Emistry in KRO C-Code System (Implemented in 2013)   
    Ever wonder why these random number show up in your RO game client?
    It's called Character Code (C-CODE), an old system that implemented around 2013.
     
    If you enable this system you'll be protected against fraud since it offers a unique additional protection for each player present in-game.

     

     
    As you can see from the screenshot above, there exists an extra set of codes (It show up int he basic information window, and the right-click menu of player object).
    According to KRO, these codes doesn't repeat/overlap and its unique for every players. It offers a unique additional protection for each player present in-game.
     

     
    When you right-click on any player object, the C-Code are shown at the last menu ([C-Code] : ### - ###)
    Its ranging from 000-000 ~ 999-999, around 1,000,000 set of codes. 
    However its not confirmed that the numbers won't repeat itself if there are multiple server setup.
     

     
    Click on the menu, the C-Code will be copied to clipboard.

     
    Open up any text editor or notepad, press on CTRL + V, the codes will be shown in the editor.
    Notes: If you copied the codes, and take a screenshot right away, the codes will be removed from the clipboard.
     

     
    The codes are shown display behind character's level in the trading window.
     
    Sample of different C-Code for different characters.
     
     
    References: home.gamer.com.tw
  16. Like
    Hyroshima got a reaction from evilpuncker in Barter shop doubt   
    try this way:
    - trader Shop1 FAKE_NPC,{ OnInit: tradertype(NST_BARTER); sellitem White_Herb, 100, Red_Potion, 2; sellitem Blue_Herb, 200, Orange_Potion, 3; end; } - trader Shop2 FAKE_NPC,{ OnInit: tradertype(NST_BARTER); sellitem Green_Herb, 100, Red_Potion, 4; sellitem White_Herb, 100, Orange_Potion, 1; end; } - trader Shop3 FAKE_NPC,{ OnInit: tradertype(NST_BARTER); sellitem Apple, -1, Orange_Potion, 1; sellitem Praetorian_Shield, 100, Berserk_Potion, 10; end; } prontera,159,284,4 trader Barter Shop 4_M_KID1,{ mes "Select the shop for open!"; switch(select("Shop 1:Shop 2:Shop 3")) { case 1: close2; openshop "Shop1"; break; case 2: close2; openshop "Shop2"; break; case 3: close2; openshop "Shop3"; break; } end; }  
  17. Like
    Hyroshima reacted to Tio Akima in [Showcase] RPD - Raccoon City Police Department   
    Hi ... I've finished a series of maps recently, inspired by a horror story theme. The main map is a modern city,
    freely inspired by Raccon City (RE)
    with classic places such as the famous Mansion of RE1 and also the raccon city police station.
    A map made for RO, but the idea was to remove all the medieval elements, to maintain a modern aesthetic, to approach our present world.

    I've posted here the city and also the mansion ...
    I recently finished the police department
     
     RPD - Raccoon City Police Department
     

     
    B01

     
    first floor with several rooms
     
     

     

     

     

     

     

     

     
     
    B02

     
    second floor with several other rooms
     

     
     

     
     

     
     

     

     

     

     

     
     

     
     
    Now there are 3 huge maps
    The city, the mansion and the police department
     

    RPD

    MANSION

    CITY

     

     

     
     
     
  18. Like
    Hyroshima reacted to 4144 in NEMO - Client Patcher   
    Open externalsettings_LANG.lub or externalsettings_LANG_sak.lub in text editor, here LANG is your language what you configured
    And replace Doram = true to Doram = false
     
  19. Like
    Hyroshima reacted to Ridley in [Release] The (data) GRF Project   
    Offering 2 versions of the grf now. Scroll down for more info. Both data.grf do NOT require rdata.grf.
     
    Option 1: (clean standard kRO GRF)
    Download OneDrive
     The grf is up-to-date 2018-12-22. Its cleaned up, and optimized. A Lot of invalid content is removed or merged. The size is 1,40gb (1.503.844.793 bytes) compared to the original 2.13gb (2.291.252.926)
    Works perfect with all current pre-renewal and/or renewal content (rdata.grf is not needed). You still need the content of the Translation Project in order to use this.
    All cutins in this grf are reduced by 35%
    Note: This is pure kro data.grf and does not contain any jro/iro/whatever files
     

      
    Option 2: GRF with the content of all official servers
    Download Mediafire
    Download OneDrive
    Download Mega
     
    This GRF contains all official files. Its cleaned up, and optimized. A Lot of invalid content is removed or merged. The size is 1,43gb (1.536.478.834 bytes)
    The grf is up-to-date 2016-08-04.
    Please throw a PM on me if this GRF is missing something! I want this to be the most complete one of all
    Small summarize
    more than 200 additional maps more than 700 additional items more than 60 additional NPC's more than 130 additionalmobs more than 900 additional cutins
     
    Instructions:
    1. Download the data.7z
    2. Extract it
    3. Put both (grf + dll) into your RO folder
     
    Changelog: Fixed Rock Ridge Illustrations use wrong Magenta (200, 238, 120 instead of 200, 240, 120) Removed chunk  
    Option 3: Episode 13.2 Pre-Renewal GRF
    This one is 775 MB (812.914.794 Bytes) and great for all kind of pre-re servers.
    Download OneDrive

    All rights and credits belong to Gravity
     
    Note: you can still encrypt your grf with SecureGRF or Tokei's GRF Editor - just use another name than cps.dll for it.
    updated thread 2019-01-13
  20. Like
    Hyroshima got a reaction from IndieRO in Barter shop doubt   
    try this way:
    - trader Shop1 FAKE_NPC,{ OnInit: tradertype(NST_BARTER); sellitem White_Herb, 100, Red_Potion, 2; sellitem Blue_Herb, 200, Orange_Potion, 3; end; } - trader Shop2 FAKE_NPC,{ OnInit: tradertype(NST_BARTER); sellitem Green_Herb, 100, Red_Potion, 4; sellitem White_Herb, 100, Orange_Potion, 1; end; } - trader Shop3 FAKE_NPC,{ OnInit: tradertype(NST_BARTER); sellitem Apple, -1, Orange_Potion, 1; sellitem Praetorian_Shield, 100, Berserk_Potion, 10; end; } prontera,159,284,4 trader Barter Shop 4_M_KID1,{ mes "Select the shop for open!"; switch(select("Shop 1:Shop 2:Shop 3")) { case 1: close2; openshop "Shop1"; break; case 2: close2; openshop "Shop2"; break; case 3: close2; openshop "Shop3"; break; } end; }  
  21. Like
    Hyroshima reacted to Tio Akima in Barter shop doubt   
    @4144 
    @Hyroshima
     
    Thank you for your help! it worked. ty
     
    [SOLVED]
  22. Like
    Hyroshima got a reaction from Tio Akima in Barter shop doubt   
    try this way:
    - trader Shop1 FAKE_NPC,{ OnInit: tradertype(NST_BARTER); sellitem White_Herb, 100, Red_Potion, 2; sellitem Blue_Herb, 200, Orange_Potion, 3; end; } - trader Shop2 FAKE_NPC,{ OnInit: tradertype(NST_BARTER); sellitem Green_Herb, 100, Red_Potion, 4; sellitem White_Herb, 100, Orange_Potion, 1; end; } - trader Shop3 FAKE_NPC,{ OnInit: tradertype(NST_BARTER); sellitem Apple, -1, Orange_Potion, 1; sellitem Praetorian_Shield, 100, Berserk_Potion, 10; end; } prontera,159,284,4 trader Barter Shop 4_M_KID1,{ mes "Select the shop for open!"; switch(select("Shop 1:Shop 2:Shop 3")) { case 1: close2; openshop "Shop1"; break; case 2: close2; openshop "Shop2"; break; case 3: close2; openshop "Shop3"; break; } end; }  
  23. Upvote
    Hyroshima got a reaction from Kavaline in Any suggestion for matrix?   
    I did it in the following way, I hope it helps.
    prontera,161,181,5 script Test Code 112,{ //delete arrays permanent in npc deletearray .resultn[0],getarraysize(.resultn); deletearray .result$[0],getarraysize(.result$); for(set .@i,1; .@i<=3; set .@i,.@i+1) { switch(.@i) { //arrays temporary case 1: setarray .@arrayn[1],1,2,3,4,5; setarray .@array$[1],"a","b","c","d","e"; break; case 2: setarray .@arrayn[1],6,7,8,9,10,11; setarray .@array$[1],"f","g","h","i","j","k"; break; case 3: setarray .@arrayn[1],12,13,14,15; setarray .@array$[1],"l","m","n","o"; break; } //Save values setarray .resultn[.@i],.@arrayn[rand(1,getarraysize(.@arrayn)-1)]; setarray .result$[.@i],.@array$[rand(1,getarraysize(.@array$)-1)]; //show values dispbottom ".resultn value["+.@i+"]: "+.resultn[.@i]; dispbottom ".result$ value["+.@i+"]: "+.result$[.@i]+""; //delete array temporary deletearray .@arrayn[0],getarraysize(.@arrayn); deletearray .@array$[0],getarraysize(.@array$); } end; }  
  24. Like
    Hyroshima reacted to 4144 in Doubt RO Zero Client   
    at first you need grf/data and other files from zero client (files from other kro clients will not works)
    Then download exe what you like from here http://nemo.herc.ws/downloads/
    At bottom of page with your client exe you can see instructions how build hercules.
     
    Nemo patches you can use recommended. Yes some will fail with errors and this is fine.
     
  25. Like
    Hyroshima got a reaction from brunosc in Doubt RO Zero Client   
    Hello, I would like to know what is needed so that I can set up a client that works with hexeds re_zero, i tried in several ways using nemo (4144) diff more happen a lot of errors.
     
    I searched the forum but nothing that could give me a light.

    RO Zero hexed version: ?
    Packet MMO: ?

    if not asking too much I just wanted an instruction on what I really need to do that I manage.

    Since already thank you very much by Hyro~ ^^
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.