Jump to content

bWolfie

Members
  • Content Count

    848
  • Joined

  • Last visited

  • Days Won

    34

Reputation Activity

  1. Upvote
    bWolfie reacted to Dastgir in Add disabled_status to map_zone_db.conf or mapflag   
    https://github.com/HerculesWS/Hercules/pull/1781/
  2. Upvote
    bWolfie reacted to kyeme in Add disabled_status to map_zone_db.conf or mapflag   
    My old suggestion here: 
     
  3. Upvote
    bWolfie got a reaction from Legend in Add disabled_status to map_zone_db.conf or mapflag   
    I was thinking, how about a disabled_status mapflag or map zone conf?
    How it would work is whenever 'SC_STATUS' is specified in that mapflag (or map zone?), it will automatically end or not allow that status to take place.
     
    Example hypothetical mapflag:
     
    prtg_cas01     mapflag    nostatus    SC_ASSUMPTIO  
    In this instance, when on the map prtg_cas01, even if a player can use a skill which does this status (i.e. Assumptio, High Priest Skill), the status will not take effect.
    And any new players entering this map will automatically lose SC_ASSUMPTIO.
     
    Or it could work in map_zone_db.conf. This example would do the same as above for Blessing and Assumptio statuses.
     
    disabled_status: {       SC_ASSUMPTIO: true       SC_BLESSING: true }  
    Erm, just throwing an idea I thought of out there. Let me know what you guys think.
    Even if it's not suitable for official herc, maybe it will inspire someone
  4. Upvote
    bWolfie reacted to Daifuku in Discord/Forum Ragnarok Emotes   
    View File Discord/Forum Ragnarok Emotes

    I used these emotes for my previous ragnarok server.
    It's closed now, so feel free to use them - I might release some other small things if people want c:
    Submitter Daifuku Submitted 06/07/17 Category Other Graphics  
  5. Upvote
    bWolfie got a reaction from meko in Hercules, welcome to IPB4   
    Just found out I need to hold shift
    to go to next line line
    without skipping.
  6. Upvote
    bWolfie got a reaction from Legend in [Function] Ordinal Suffix   
    Ordinal Suffix Function
    File Name: Ordinal Suffix
    File Submitter: Myriad
    File Submitted: 5 June 2017
    File Category: Quests, Shops, Functions & Algorithms Releases
    Ever been constructing a string and wanted to turn 1 into 1st? Or 2 -> 2nd? Well, there is now an answer!
    I call it 'Ordinal Suffix'. It adds a suffix to the end of your number using the callfunc() script command. Example below:
    .@first = 1; .@second = 2; mes("That's the " + callfunc("Ordinal_Suffix", .@first) + " time you told me that!"); // Will return "That's the 1st time you told me that!" mes("That's the " + callfunc("Ordinal_Suffix", .@second) + " time you told me that!"); // Will return "That's the 2nd time you told me that!" mes("That's the " + callfunc("Ordinal_Suffix", 11) + " time you told me that!"); // Will return "That's the 11th time you told me that!" → Special cases such as '11th', '12th' and '13th' are accounted for.
    → Can only be used with integers.
    → Works for all possible numbers (except 0 will return 0th, not sure what that is supposed to be).
    Script can be 'downloaded' at this pastebin link: https://pastebin.com/6Z5k1S70
  7. Upvote
    bWolfie reacted to Sephus in Official Refine Rate Correction   
    As of e171deb58c7 we have the official refine rates from kRO.
     
    Normal Ores
     Refine Shadow equipment Armor Weapon (1st level) Weapon (2nd level) Weapon (3rd level) Weapon (4th level) 1 100% 100% 100% 100% 100% 100% 2 100% 100% 100% 100% 100% 100% 3 100% 100% 100% 100% 100% 100% 4 100% 100% 100% 100% 100% 100% 5 60% 60% 100% 100% 100% 60% 6 40% 40% 100% 100% 60% 40% 7 40% 40% 100% 60% 50% 40% 8 20% 20% 60% 40% 20% 20% 9 20% 20% 40% 20% 20% 20% 10 9% 9% 19% 19% 19% 9% 11 - 8% 18% 18% 18% 8% 12 - 8% 18% 18% 18% 8% 13 - 8% 18% 18% 18% 8% 14 - 8% 18% 18% 18% 8% 15 - 7% 18% 18% 18% 7% 16 - 7% 17% 17% 17% 7% 17 - 7% 17% 17% 17% 7% 18 - 7% 17% 17% 17% 7% 19 - 5% 15% 15% 15% 5% 20 - 5% 15% 15% 15% 5%  
    Enriched Ores
    Refine   Shadow equipment Armor Weapon (1st level) Weapon (2nd level) Weapon (3rd level) Weapon (4th level) 1 100% 100% 100% 100% 100% 100% 2 100% 100% 100% 100% 100% 100% 3 100% 100% 100% 100% 100% 100% 4 100% 100% 100% 100% 100% 100% 5 90% 90% 100% 100% 100% 90% 6 70% 70% 100% 100% 90% 70% 7 70% 70% 100% 90% 80% 70% 8 40% 40% 90% 70% 40% 40% 9 40% 40% 70% 40% 40% 40% 10 20% 20% 30% 30% 30% 20% 11 -  8% 18% 18% 18% 8% 12 -  8% 18% 18% 18% 8% 13 -  8% 18% 18% 18% 8% 14 -  8% 18% 18% 18% 8% 15 -  7% 18% 18% 18% 7% 16 -  7% 17% 17% 17% 7% 17 -  7% 17% 17% 17% 7% 18 -  7% 17% 17% 17% 7% 19 -  5% 15% 15% 15% 5% 20 -  5% 15% 15% 15% 5%  
    Normal Ores - Smelting Event
    Refine Shadow equipment Armor Weapon (1st level) Weapon (2nd level) Weapon (3rd level) Weapon (4th level) 1 100% 100% 100% 100% 100% 100% 2 100% 100% 100% 100% 100% 100% 3 100% 100% 100% 100% 100% 100% 4 100% 100% 100% 100% 100% 100% 5 60% 60% 100% 100% 100% 60% 6 40% 40% 100% 100% 60% 40% 7 40% 40% 100% 60% 50% 40% 8 20% 20% 60% 40% 20% 20% 9 20% 20% 40% 20% 20% 20% 10 9% 9% 19% 19% 19% 9% 11 - 20% 40% 40% 40% 20% 12 - 20% 40% 40% 40% 20% 13 - 16% 35% 35% 35% 16% 14 - 16% 35% 35% 35% 16% 15 - 15% 30% 30% 30% 15% 16 - 15% 30% 30% 30% 15% 17 - 14% 20% 20% 20% 14% 18 - 14% 20% 20% 20% 14% 19 - 10% 15% 15% 15% 10% 20 - 10% 15% 15% 15% 10%  
    Enriched Ores - Smelting Event
       Refine  Shadow equipment Armor Weapon (1st level) Weapon (2nd level) Weapon (3rd level) Weapon (4th level) 1 100% 100% 100% 100% 100% 100% 2 100% 100% 100% 100% 100% 100% 3 100% 100% 100% 100% 100% 100% 4 100% 100% 100% 100% 100% 100% 5 95% 95% 100% 100% 100% 95% 6 80% 80% 100% 100% 95% 80% 7 80% 80% 100% 95% 90% 80% 8 60% 60% 95% 85% 70% 60% 9 50% 50% 85% 60% 60% 50% 10 35% 35% 55% 45% 45% 35% 11 - 20% 40% 40% 40% 20% 12 -  20% 40% 40% 40% 20% 13 -  16% 35% 35% 35% 16% 14 -  16% 35% 35% 35% 16% 15 -  15% 30% 30% 30% 15% 16 -  15% 30% 30% 30% 15% 17 -  14% 20% 20% 20% 14% 18 -  14% 20% 20% 20% 14% 19 -  10% 15% 15% 15% 10% 20 -  10% 15% 15% 15% 10%  
     
    This corrects the previous behaviour of enriched ores which would simple double roll the item refinement.
     
    Script Command Changes
    getequippercentrefinery(<equipment slot>{, <type>}) Example: if (getequippercentrefinery(EQI_HAND_L, REFINE_CHANCE_TYPE_NORMAL) <= rand(100)) mes("Aww");  
    Constants exported to constants.conf are -
    REFINE_CHANCE_TYPE_NORMAL: 1 Retrieves Normal ore refine rate REFINE_CHANCE_TYPE_ENRICHED: 2 Retrieves Enriched ore refine rate REFINE_CHANCE_TYPE_E_NORMAL: 3 Retrieves Normal Event ore refine rate REFINE_CHANCE_TYPE_E_ENRICHED: 4 Retrieves Enriched Event ore refine rate  
  8. Upvote
    bWolfie 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  
  9. Upvote
    bWolfie reacted to meko in Area timer functions   
    View File Area timer functions
    This script provides functions to add (or remove) timers to every player in the area or map.
     
     
     
    areatimer("<map>", <x1>, <y1>, <x2>, <y2>, <tick>, "<event>")
    makes all players in the square area call <event> after <tick> ms
    > returns the number of affected players
    areatimer("prontera", 55, 60, 150, 180, 500, "MyNPC:MyEvent");    
     
    areatimer2("<map>", <x1>, <y1>, <x2>, <y2>, <tick>, "<event>")
    identical to areatimer, but also removes any existing timer before adding the new one
    > returns the number of affected players
    areatimer2("prontera", 55, 60, 150, 180, 500, "MyNPC:MyEvent");    
     
    areadeltimer("<map>", <x1>, <y1>, <x2>, <y2>, "<event>")
    makes all players in the square area remove their timers for <event>
    > returns the number of affected players
    areadeltimer("prontera", 55, 60, 150, 180, "MyNPC:MyEvent");    
     
    maptimer("<map>", <tick>, "<event>")
    makes all players in the map call <event> after <tick> ms
    > returns the number of affected players
    maptimer("prontera", 500, "MyNPC:MyEvent");    
     
    maptimer2("<map>", <tick>, "<event>")
    identical to maptimer() but also removes any existing timer before adding the new one
    > returns the number of affected players
    maptimer2("prontera", 500, "MyNPC:MyEvent");    
     
    mapdeltimer("<map>", "<event>")
    makes all players on the map remove their timers for <event>
    > returns the number of affected players
    mapdeltimer("prontera", "MyNPC:MyEvent");         globaltimer(<tick>, "<event>")
    makes all players everywhere call <event> after <tick> ms
    > returns the number of affected players globaltimer(500, "MyNPC:MyEvent");  
     
     
     
    Requires Hercules v2018.06.03 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  
  10. Upvote
    bWolfie reacted to Dastgir 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);
  11. Upvote
    bWolfie reacted to meko in Recent changes to the Hercules engine   
    It seems there's been no changelog since quite a while so here's one highlighting the most recent changes related to scripting. Sorry if that's not the right category, please move accordingly.     New script commands: chr ord gettimer getunits getvariableofpc can_use_command has_permission addchannelhandler removechannelhandler setunitdata getunitdata getunitname setunitname getequipisenableopt getequippedoptioninfo getequipoptioninfo setequipoption navigateto   Modified script commands (extra parameters): strcharinfo strnpcinfo addtimer deltimer addtimercount checkoption checkoption1 checkoption2 setoption warpparty warpguild classchange   New params: BankVault  
     
    Big projects currently in development:
    Implementation of the official Clan system Implementation of the official RoDEX system Implementation of the official Achievements system Complete rewrite of the map cache system
  12. Upvote
    bWolfie got a reaction from kairu in Heal over Time   
    for (.@i = 0; .@i < 5; ++.@i)
    (
    perecentheal(3, 0);
    sleep2(1000);
    }

    Dunno how reliable this is, or if it should be used in item scripts.
  13. Upvote
    bWolfie got a reaction from kairu in Heal over Time   
    Yup.bonus2 bHPRegenRate, (MaxHp/100), 1000;This script would drain 1% of max hp every 1000ms (1 second).
  14. Upvote
    bWolfie got a reaction from PB&JJ in How to allow one ip use on an NPC   
    Yes i understand all that. I want to make it so the NPC takes a record of their IP and block usage of that npc afterwards.
     
    I did some searching and found a guild pack script to use in what I'm after. From this thread: https://rathena.org/board/topic/94294-guild-pack-npc-giver-help-please/
     
    1. First script needs label to call in callsub:
     
    S_Check_IP:     return query_sql("SELECT 1 FROM `guildpack` join login on login.`last_ip` = `guildpack`.`last_ip` where login.account_id = "+ getcharid(CHAR_ID_ACCOUNT), .@tmp);  
    2. Then define IP:
     
    .@myip$ = getcharip();  
    3. Return true through callsub if IP exists in table:
     
        if (callsub(S_Check_IP))     {         mes .@name$;         mes("^616D7EIt seems I have already recorded your IP Address: ^ff0000" + .@myip$ + "^000000.");         close;     }
     
    4. If does not exist, enter new entry to previously created table:
     
    query_sql("INSERT INTO `guildpack` VALUES (NULL," + getcharid(CHAR_ID_ACCOUNT) + ",'" + escape_sql(strcharinfo(PC_NAME)) + "','" + .@myip$ + "')");  
    All in all it looks something like this: https://pastebin.com/Lk8MHMBg
     
    This can be used for get_unique_id() too if you have gepard shield.
     
    My intention was to use this in a Lottery script, so people could only purchase one ticket per week.
    After each lottery draw, the table would be truncated so everybody can buy tickets again.
  15. Upvote
    bWolfie reacted to Dastgir in Where can I find the commit for getvariableofpc()   
    https://github.com/HerculesWS/Hercules/commit/03f416eda0b0d1aeef03516863e11916e75660cdIt was fixed later on.
  16. Upvote
    bWolfie reacted to PB&JJ in Bonus ReduceSkillDamage   
    Usage:
    item bonus command: bonus2 bReduceSkillDamage x,y;    // x = skill id, y = %
     
    Example: 
    {     Id: 8001     AegisName: "Custom_Card"     Name: "Custom Card"     Type: 6     Buy: 20     Weight: 10     Loc: 32      Script: <"                bonus2 bReduceSkillDamage,MO_EXTREMITYFIST,50; //Reduces Asura strikes damage by 50% "> },  
     
     
     
    you can find it on my github here.
  17. Upvote
    bWolfie reacted to Functor in [20141022] Disable Auras?   
    offset 3DCD80 change 56 to C3
  18. Upvote
    bWolfie reacted to Dastgir 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
  19. Upvote
    bWolfie reacted to Skyline in A friendly reminder to server owners   
    Greetings everyone!
     
    I just want to tell you guys a friendly reminder. But before that let me give you a background of things:
     
    I am a server owner just like most of you guys, been this way for 3 years now. On my 3rd year of being an admin, I decided to give it all I've got for my community because they deserved the best.
     
    I spent at least $1300 in exclusive custom made items/stuff/monsters and the biggest main town ever with a Colosseum. It was probably one of the greatest maps @Olrox ever made. @Daifuku's logo on our main town stands to be the best there is and we are all proud of it. @Haziel's custom items made us stand out and made us feel unique.
     
    But see, all of these client side things needs to be protected by encryption, right? I knew that before even trying to get these things into order. It is beyond frustrating seeing all your stuff gets stolen by other servers even with encrypted stuff.
     
    Goes to show that GRF Encryption is no longer secure. Now before you say I don't know how to encrypt, trust me, I know.
     
    This is why I wanted to remind you guys, that if you decide to get services for client-side stuff? Before you throw in $$$, always remember this risk.
     
    This risk of getting your shit stolen. Because it sucks.
     
    Trust me you don't want to get into the same position as I am. So as long as there isn't an awesome way to secure, hold your $$$. But if you know the risk and still want to push forward? Get the services of the people below because they are the best.
     
    Good luck out there!
     
    Special thanks to the people who made our stuff, @Daifuku, @Haziel, @Olrox, @Hyvraine. 
     
    This ends my reminder/rant.
     
     
     
     
     
     
     
     
     
     
     
    And for the server who got our stuff, hi BrillianceRO, Andy Chandra. 
     
  20. Upvote
    bWolfie got a reaction from Legend in @botcheck   
    File Name: @botcheck
    File Submitter: True Zeal
    File Submitted: 30 Apr 2017
    File Category: Utility
     
    File Name: @botcheck
    File Submitter: True Zeal
    File Submitted: 30 Apr 2017
    File Cateogry: Utility
     
    Description
    A useful command for your Game Masters to help monitor problem "bot" maps.
    Runs
    the @whomap2 command on a list of specified maps. This allows you to
    check classes as well as names, which could be useful for quickly
    ignoring a character.
     
    Requires configuration for maps you wish to have it run a check on.
     
    Example Configuration:
    //--- Sets the list of maps to run @whomap2 on setarray(.map$[0], "amatsu", // Note: Every entry excluding the last one must have a comma! "prontera", "odin_tem03" // Note: Last entry must never have a comma! );
     
    Download
    You can "download" this file from its Pastebin location.
    Pastebin: https://pastebin.com/yYuFdLHm
     
    Click here to download this file
  21. Upvote
    bWolfie reacted to Dastgir 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.
  22. Upvote
    bWolfie reacted to Dastgir 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; }
  23. Upvote
    bWolfie got a reaction from Quazi in How to allow one ip use on an NPC   
    Yes i understand all that. I want to make it so the NPC takes a record of their IP and block usage of that npc afterwards.
     
    I did some searching and found a guild pack script to use in what I'm after. From this thread: https://rathena.org/board/topic/94294-guild-pack-npc-giver-help-please/
     
    1. First script needs label to call in callsub:
     
    S_Check_IP:     return query_sql("SELECT 1 FROM `guildpack` join login on login.`last_ip` = `guildpack`.`last_ip` where login.account_id = "+ getcharid(CHAR_ID_ACCOUNT), .@tmp);  
    2. Then define IP:
     
    .@myip$ = getcharip();  
    3. Return true through callsub if IP exists in table:
     
        if (callsub(S_Check_IP))     {         mes .@name$;         mes("^616D7EIt seems I have already recorded your IP Address: ^ff0000" + .@myip$ + "^000000.");         close;     }
     
    4. If does not exist, enter new entry to previously created table:
     
    query_sql("INSERT INTO `guildpack` VALUES (NULL," + getcharid(CHAR_ID_ACCOUNT) + ",'" + escape_sql(strcharinfo(PC_NAME)) + "','" + .@myip$ + "')");  
    All in all it looks something like this: https://pastebin.com/Lk8MHMBg
     
    This can be used for get_unique_id() too if you have gepard shield.
     
    My intention was to use this in a Lottery script, so people could only purchase one ticket per week.
    After each lottery draw, the table would be truncated so everybody can buy tickets again.
  24. Upvote
    bWolfie got a reaction from Like it~* in How to rotate event npcs?   
    Yup, basically this. You can use an arrangement of donpcevent() commands to activate events for your set times.
     
    Example:
     
      -     script     event 1     FAKE_NPC,{   OnAtCommand: OnEventOne: announce "Event 1 started.", bc_all; initnpctimer; end;   OnTimer10000: announce "Event 1 ended." bc_all; end;   OnTimer15000: donpcevent("event 2::OnEventTwo"); stopnpctimer; end;   OnInit: bindatcmd("event1","event 1::OnAtCommand"); end;   }   -     script     event 2     FAKE_NPC,{   OnEventTwo: announce "Event 2 started.", bc_all; initnpctimer; end;   OnTimer10000: announce "Event 2 ended.", bc_all; end;   OnTimer15000: donpcevent("event 1::OnEventTwo"); stopnpctimer; end;   }  
    You can start the loop by typing @event1, then it would loop the announcements every 10/15 seconds.
  25. Upvote
    bWolfie got a reaction from Like it~* in How to allow one ip use on an NPC   
    Yeah. In mine, I changed guildpack to lottery
×
×
  • Create New...

Important Information

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