Jump to content

Dastgir

Script Developers
  • Content Count

    3805
  • Joined

  • Last visited

  • Days Won

    250

Reputation Activity

  1. Upvote
    Dastgir 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  
  2. Upvote
    Dastgir got a reaction from bWolfie in How to grab variable in src then display in script engine?   
    Not true for @who,@who command uses "count" variable and adds them when a player is found, and then display it with

    StrBuf->Printf(&buf, msg_fd(fd,30), count); // %d players found. Since it's not command that player should have (ideally), and there's some permission to hide from who searches, we do it by count variable here.Edit: you should use the command to show value, or store it in some variable and use another script command to utilise it.
    Else, you can also use temporary global variable

    mapreg->setreg(script->add_str("$@who4count"), count);
  3. Upvote
    Dastgir got a reaction from Thyr in Guide? Setup RO emulator to VPS   
    If it's just for testing and you have windows 10, you can use Ubuntu via WSL.
    https://msdn.microsoft.com/en-us/commandline/wsl/install_guide
  4. Upvote
    Dastgir got a reaction from Like it~* in Ragnarok Index ( RO database on your computer )   
    This is a tool for windows and not integrated to server.So you would need to run this tool, manually enter monster Id and it would give you details
  5. Upvote
    Dastgir got a reaction from meko in Require a certain amount of reputation, posts and time registered to perform Downloads.   
    For me, I don't feel we need any restriction, we are open-source community, putting any restriction will discourage user from using forum and it would give rise to many spam accounts and more importantly, it will lead to increase demand for paid developers and as a result less scripts/mods would be released for free.
  6. Upvote
    Dastgir got a reaction from tedexx in Require a certain amount of reputation, posts and time registered to perform Downloads.   
    For me, I don't feel we need any restriction, we are open-source community, putting any restriction will discourage user from using forum and it would give rise to many spam accounts and more importantly, it will lead to increase demand for paid developers and as a result less scripts/mods would be released for free.
  7. Upvote
    Dastgir reacted to dualityDiscretion in RO Webcomic [FIN]   
    Last year, I launched a RO-themed webcomic which I've been updating weekly. I've been posting it in several forums and someone told me to share it here too, so I thought why not~
     
    This comic follows Joshua, a newb adventurer who just arrived in Rune Midgard, struggling to understand how the world works, with some helping hands guiding him... kinda...
     
    http://tapas.io/series/PORINGS
     
    Been goin for almost a year, 44 strips so far and going strong. Updated every Friday~
  8. Upvote
    Dastgir got a reaction from Shatowolf in Hercules IRC   
    https://discord.gg/ZUzbRSp Blame discord UI for so much confusing...
  9. Upvote
    Dastgir got a reaction from bWolfie in Where can I find the commit for getvariableofpc()   
    https://github.com/HerculesWS/Hercules/commit/03f416eda0b0d1aeef03516863e11916e75660cdIt was fixed later on.
  10. Upvote
    Dastgir got a reaction from Easycore in Hercules IRC   
    https://discord.gg/ZUzbRSp Blame discord UI for so much confusing...
  11. Upvote
    Dastgir got a reaction from vBrenth in Hercules IRC   
    https://discord.gg/ZUzbRSp Blame discord UI for so much confusing...
  12. Upvote
    Dastgir got a reaction from Kubix in Hercules IRC   
    https://discord.gg/ZUzbRSp Blame discord UI for so much confusing...
  13. Upvote
    Dastgir got a reaction from vBrenth in How do you see your client date(version)?   
    OMG, just got to know about this..
  14. Upvote
    Dastgir got a reaction from Easycore in Hercules Battlegrounds   
    New clients don't support emblems in bg map, i requested to Nemo long time ago, and he made a patch for it, check Nemo for that emblem thing
  15. Upvote
    Dastgir got a reaction from Shatowolf in Achievement & Item Link System   
    Well rodex and clan is also on PR, consider waiting some time (week or two)
  16. Upvote
    Dastgir got a reaction from bWolfie in Shop name instead of merchant name for @whosell and @whobuy   
    Whobuy;

    snprintf(output, CHAT_SIZE_MAX, "Price %d | Amount %d | Buyer %s | Map %s[%d,%d]", pl_sd->buyingstore.items[j].price, pl_sd->buyingstore.items[j].amount, pl_sd->status.name, mapindex_id2name(pl_sd->mapindex), pl_sd->bl.x, pl_sd->bl.y); To
    snprintf(output, CHAT_SIZE_MAX, "Price %d | Amount %d | Shop %s | Map %s[%d,%d]", pl_sd->buyingstore.items[j].price, pl_sd->buyingstore.items[j].amount, pl_sd->message, mapindex_id2name(pl_sd->mapindex), pl_sd->bl.x, pl_sd->bl.y); Edit:
    Whosell, change all
    pl_sd->status.name
    to
    pl_sd->message
  17. Upvote
    Dastgir got a reaction from Lulupard in Shop name instead of merchant name for @whosell and @whobuy   
    Whobuy;

    snprintf(output, CHAT_SIZE_MAX, "Price %d | Amount %d | Buyer %s | Map %s[%d,%d]", pl_sd->buyingstore.items[j].price, pl_sd->buyingstore.items[j].amount, pl_sd->status.name, mapindex_id2name(pl_sd->mapindex), pl_sd->bl.x, pl_sd->bl.y); To
    snprintf(output, CHAT_SIZE_MAX, "Price %d | Amount %d | Shop %s | Map %s[%d,%d]", pl_sd->buyingstore.items[j].price, pl_sd->buyingstore.items[j].amount, pl_sd->message, mapindex_id2name(pl_sd->mapindex), pl_sd->bl.x, pl_sd->bl.y); Edit:
    Whosell, change all
    pl_sd->status.name
    to
    pl_sd->message
  18. Upvote
    Dastgir got a reaction from Like it~* in @joinbg and Tribe system / Clan System/Faction System/RACE System   
    No, all new plugins require source code and the one on the post is compiled version(which is not compatible with new hercules, since data has been changed since then...)
  19. Upvote
    Dastgir got a reaction from Like it~* in How to convert to a plugin?   
    3/4/6) https://github.com/dastgir/HPM-Plugins/commit/45b400fb74b38a2530ea33a374d13ccd5c1da501
  20. Upvote
    Dastgir got a reaction from tedexx in Clientinfo: multiple servers   
    You might have diffed with "Skip Service Select" patch
  21. Upvote
    Dastgir got a reaction from master@ragna in modified card remover   
    Afaik, if rental cards are put into the item, the rent time goes off. so there's no way that card remover can retain it because it isn't saved upon card insertion.
    for saving timer for cards would require some (massive?) amount of source editing and as well as saving those on DB, since cards bounded to items are just saved on card column now and no extra row for it.
  22. Upvote
    Dastgir got a reaction from bWolfie in Linux: Map Server crash on @autotrade   
    1) install gdb
    2) run login/char-server normally.
    3) run map-server by typing following commands
    gdb map-server run 4) Reproduce the bug and let the server crash
    5) Check the ssh console, it might show the report
    6) type 'bt full' and show all the output here.
  23. Upvote
    Dastgir got a reaction from bWolfie in Using 'for()', can you repeat text in same line?   
    script_commands.txt have a nice example for it
    - script atcmd_example FAKE_NPC,{ OnInit: bindatcmd("test", strnpcinfo(NPC_NAME_UNIQUE)+"::OnAtcommand"); end; OnAtcommand: // This command expects a character name (that may contain spaces) as // the only parameter. .@name$ = ""; for (.@i = 0; .@i < .@atcmd_numparameters; ++.@i) { .@name$ += (.@i > 0 ? " " : "") + .@atcmd_parameters$[.@i]; } dispbottom("The specified name is: '" + .@name$ + "'"); end; }
  24. Upvote
    Dastgir got a reaction from loki in Linux: Map Server crash on @autotrade   
    1) install gdb
    2) run login/char-server normally.
    3) run map-server by typing following commands
    gdb map-server run 4) Reproduce the bug and let the server crash
    5) Check the ssh console, it might show the report
    6) type 'bt full' and show all the output here.
  25. Upvote
    Dastgir got a reaction from Like it~* in How to rotate event npcs?   
    - script CycleEvent FAKE_NPC,{ OnExecute: if (.current_event >= .max_events) { .current_event = 0; } switch(.current_event) { // if max_events is 10, then .current_event goes from 0 to 9 case 0: donpcevent("Event1::OnEvent"); break; case 1: donpcevent("Event2::OnEvent"); break; case 2: donpcevent("Event3::OnEvent"); break; //.. and so on.. } // Or Use this below method if you really have Event NPC Names as Event1/Event2/Event3/... (Commented) // donpcevent("Event"+ (.current_event + 1) +"::OnEvent"); announce "Event "+ (.current_event+1) +" started.", bc_all; end; OnEnd: // Call CycleEvent::OnEnd when event ends(needs to be manually edited on each event script when end): donpcevent("CycleEvent::OnEnd") ++.current_event; donpcevent(strnpcinf(NPC_NAME) +"::OnExecute") end; OnTimer15000: donpcevent("event 2::OnEventTwo"); stopnpctimer; end; OnInit: .max_events = 10; bindatcmd("startevent", strnpcinfo(NPC_NAME) +"::OnExecute"); end; }
    Hope this helps
×
×
  • Create New...

Important Information

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