Jump to content

meko

Core Developers
  • Content Count

    363
  • Joined

  • Days Won

    46

Everything posted by meko

  1. Version v10

    286 downloads

    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)
  2. 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  
  3. Version v2.1

    24 downloads

    This script provides syntactic sugar for randomization. Works fine with both strings and integers. any(<arg>{, <arg>{, ...}}) > returns a random argument from the passed arguments emotion(any(e_hmm, e_grat, e_yawn)); // do any of those 3 emotes any_of(<array>) > returns a random entry from the passed array setarray(.@foo, 1, 2, 3, 4); // build the array // ... later in the code: mes(any_of(.@foo)); // print any number from the array relative_array_random(<array: 0, {[value, probability]...}>{, <recalculate>}) a more powerful version of any_of(), which allows to assign arbitrary probabilities to every entry instead of being rand(size) for every one. the first value of the array is reserved and must be 0, and every entry must be a tuple of [value, probability]. if the array is modified between invocations please pass true as second argument to re-calculate the total probability. probabilities are arbitrary and can be any number between 1 and INT_MAX. > returns the random entry setarray(.@foo, 0, // <= always 0 111, 6, 222, 12, // <= [value, probability] 333, 20, 444, 4); relative_array_random(.@foo); // => 333 (example, unpredictable) -------------------------------------------------------------------------------------- This script was made by me, for The Mana World + Evol. License: public domain (CC0)
  4. View File Randomization helper functions This script provides syntactic sugar for randomization. Works fine with both strings and integers. any(<arg>{, <arg>{, ...}}) > returns a random argument from the passed arguments emotion(any(e_hmm, e_grat, e_yawn)); // do any of those 3 emotes any_of(<array>) > returns a random entry from the passed array setarray(.@foo, 1, 2, 3, 4); // build the array // ... later in the code: mes(any_of(.@foo)); // print any number from the array relative_array_random(<array: 0, {[value, probability]...}>{, <recalculate>}) a more powerful version of any_of(), which allows to assign arbitrary probabilities to every entry instead of being rand(size) for every one. the first value of the array is reserved and must be 0, and every entry must be a tuple of [value, probability]. if the array is modified between invocations please pass true as second argument to re-calculate the total probability. probabilities are arbitrary and can be any number between 1 and INT_MAX. > returns the random entry setarray(.@foo, 0, // <= always 0 111, 6, 222, 12, // <= [value, probability] 333, 20, 444, 4); relative_array_random(.@foo); // => 333 (example, unpredictable) -------------------------------------------------------------------------------------- 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  
  5. Version v2

    23 downloads

    This script provides safe string manipulation functions that do not require PCRE to be enabled at compile time, making your scripts more portable. startswith("<string>", "<substring>") returns true if <string> begins with <substring> startswith("hypothermia", "hypo") // true startswith("hypothermia", "hyper") // false endswith("<string>", "<substring>") returns true if <string> ends with <substring> endswith("hypothermia", "thermia") // true endswith("hypothermia", "glycemia") // false capitalize("<string>") returns <string> with its first letter being capitalized capitalize("the quick brown fox") // The quick brown fox titlecase("<string>") returns <string> with the first letter of every word capitalized titlecase("the quick brown fox") // The Quick Brown Fox camelcase("<string>") returns <string> concatenated in a camelCase fashion camelcase("the quick brown fox") // theQuickBrownFox zfill("<string>"{, <width>{, "<padding>"}}) returns <string> padded to the left up to <width> with <padding> zfill(69, 6, "0"); // 000069 zfill(1337, 6, "0"); // 001337 format_number(<number>{, "<separator>"}) formats a number with <separator> format_number(50) // 50 format_number(50000) // 50,000 format_number(5000000) // 5,000,000 strip("<string>") returns <string> without spaces at the beginning or end strip(" the quick brown fox") // "the quick brown fox" strip("the quick brown fox ") // "the quick brown fox" strip(" the quick brown fox ") // "the quick brown fox" reverse("<string>") returns <string> reversed reverse("Hello world!") // !dlrow olleH repeat("<string>", <multiplier>) repeats <string> <multiplier> times repeat("Foo", 4) // FooFooFooFoo shuffle("<string>") returns <string> shuffled shuffle("abcdefg") // dgabefc (example, unpredictable)
  6. View File Safe string manipulation functions This script provides safe string manipulation functions that do not require PCRE to be enabled at compile time, making your scripts more portable. startswith("<string>", "<substring>") returns true if <string> begins with <substring> startswith("hypothermia", "hypo") // true startswith("hypothermia", "hyper") // false endswith("<string>", "<substring>") returns true if <string> ends with <substring> endswith("hypothermia", "thermia") // true endswith("hypothermia", "glycemia") // false capitalize("<string>") returns <string> with its first letter being capitalized capitalize("the quick brown fox") // The quick brown fox titlecase("<string>") returns <string> with the first letter of every word capitalized titlecase("the quick brown fox") // The Quick Brown Fox camelcase("<string>") returns <string> concatenated in a camelCase fashion camelcase("the quick brown fox") // theQuickBrownFox zfill("<string>"{, <width>{, "<padding>"}}) returns <string> padded to the left up to <width> with <padding> zfill(69, 6, "0"); // 000069 zfill(1337, 6, "0"); // 001337 format_number(<number>{, "<separator>"}) formats a number with <separator> format_number(50) // 50 format_number(50000) // 50,000 format_number(5000000) // 5,000,000 strip("<string>") returns <string> without spaces at the beginning or end strip(" the quick brown fox") // "the quick brown fox" strip("the quick brown fox ") // "the quick brown fox" strip(" the quick brown fox ") // "the quick brown fox" reverse("<string>") returns <string> reversed reverse("Hello world!") // !dlrow olleH repeat("<string>", <multiplier>) repeats <string> <multiplier> times repeat("Foo", 4) // FooFooFooFoo shuffle("<string>") returns <string> shuffled shuffle("abcdefg") // dgabefc (example, unpredictable) Submitter meko Submitted 05/29/17 Category Quest, Shops, Functions & Algorithms  
  7. Version v3

    36 downloads

    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)
  8. 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  
  9. There is no need to use global variables ($@) or to use attachrid getmapxy(@evt_map$, @evt_x, @evt_y, UNITTYPE_PC); // save the previous position warp(.map$, .warp_x, .warp_y); // warp the player to your event end; OnWarpBack: warp(@evt_map$, @evt_x, @evt_y); end; OnEventEnd: .@count = getunits(BL_PC, .@players, false, .map$); for (.@i = 0; .@i < .@count; .@i++) { addtimer(rand(500), strnpcinfo(0) + "::OnWarpBack", .@players[.@i]); } end; OnInit: .map$ = "the-map"; // map of the event .warp_x = 50; // the x position to warp the player to .warp_y = 50; // the y position to warp the player to
  10. meko

    Soul Menhir

    Version v1

    132 downloads

    The Soul Menhir slowly regenerates the SP of anyone sitting near it. Make sure to change the map, x, y and the sprite. Requires Hercules of April 8th 2017 or newer version -------------------------------------------------------------------------------------- This script was made by me, for The Mana World + Evol. License: public domain (CC0)
  11. File Name: Soul Menhir File Submitter: meko File Submitted: 29 May 2017 File Category: Utility The Soul Menhir slowly regenerates the SP of anyone sitting near it. Make sure to change the map, x, y and the sprite. Requires Hercules of April 8th 2017 or newer version -------------------------------------------------------------------------------------- This script was made by me, for The Mana World + Evol. License: public domain (CC0) Click here to download this file
  12. An SSD (solid-state disk) is much much faster at reading and writing than a traditional HDD (hard disk drive), and generally more stable since it has no moving parts. The difference between KVM and OpenVZ is that KVM uses hardware virtualization (aka an hypervisor) while OpenVZ uses OS-level virtualization (aka a container). A hypervisor basically emulates the whole machine while a container just emulates the user-space and runs it on top of a shared kernel. Because of the added layer of abstraction offfered by hypervisors the performance is slightly worse than for containers.
  13. Well of course it didn't continue: you used close; instead of break;
  14. For this simply make a new item and in the script<> section use getitem() for each item you want to give, then use doevent() to call your npc script and in this npc before any dialog use delitem() to remove the box, then put your dialog that asks which item you want
  15. One could make a script command ("buildin") for this, but iterating through every single player every time this command is called would be very slow, especially if there's like 2k players online. One solution could be to have a separate property of map besides map->users that would count just like map->users but would be updated every time a player's vending state changes... but this would not be general-purpose so I don't think it should be in the core engine, this should rather be a plugin
  16. What are you referring to? "SB" could mean anything; please elaborate. If you're trying to change the attack range of a monster, have a look at db/re/mob_db.conf and db/mob_db2.conf
  17. That sentence is sent directly to clif, which sends to the client so you can't catch it without source modification. If what you want is just to count all connected users there's an easy way for that: getusers(1)
  18. For the cheapest VPS offers have a look at LowEndBox. Keep in mind that most of those cheep providers advertised on LowEndBox do not offer DDOS protection. As for a guide to setting up a VPS running Hercules, I would first advise you to learn the basics of Linux: https://www.linux.com/learn/complete-beginners-guide-linux https://opensource.com/education/14/4/windows-to-linux-system-administration http://linuxsurvival.com/linux-tutorial-introduction/ For the distribution, I recommend Debian, or Ubuntu Server (which is itself based on Debian) What is a VPS, what are the limitations: http://www.webhostingsecretrevealed.net/vps-hosting-guide/ How to use SSH: https://support.suso.com/supki/SSH_Tutorial_for_Linux https://www.ssh.com/ssh/putty/windows/ How to use git: https://try.github.io https://git-scm.com/documentation How to compile Hercules: https://github.com/HerculesWS/Hercules/blob/master/README.md#prerequisites How to use SQL: https://www.amazon.com/dp/1593271905/
  19. La documentation de Hercules est toujours à jour, puisqu'elle est aussi versionnée dans le répertoire git. Donc peut importe quelle version tu as, tu as toujours la documentation qui va avec. Regarde ce lien pour savoir comment compiler (dans Visual Studio 2015): https://github.com/HerculesWS/Hercules/blob/master/README.md#prerequisites Et ce lien pour savoir comment scripter: https://github.com/HerculesWS/Hercules/blob/master/doc/script_commands.txt Pour la documentation intégrale: https://github.com/HerculesWS/Hercules/tree/master/doc Et pour l'amour de tout ce qui existe, pitié, rends service à l'Humanité toute entière et n'utilises plus jamais Comic Sans.
  20. @True Zeal thanks for that info For commands introduced by plugins I believe you can simply add them to groups.conf like any other command. For commands introduced by scripts though you have to set the group in bindatcmd, but soon you'll be able to specify for each individual group. ---------------------------------------------------------------- @CraftNCheez simply add the following to your groups.conf, in the Commands section of the Player group: feelreset: true allskill: true hatredreset: true Hope it helps
  21. Add them in /conf/groups.conf to the group that has id: 0, usually this group is named "Player". In the Commands section of this group, add the following: feelreset: true allskill: true For @hatereset I could not find this command in the source.
  22. In your example you set it to zero (false) but you should set it to one (true), else you just disable the already-disabled flag. Also please make sure your X1, Y1, X2, Y2 are valid coordinates. In the picture you referenced your (X1,Y1) and (X2,Y2) are in the wrong corners; It should be top-left and bottom-right. See http://herc.ws/board/topic/14707-making-square-as-basilica/?p=82285
  23. meko

    Event Rewarder

    Here, I made this for you: - script @give FAKE_NPC,{ end; OnCall: .@full$ = implode(.@atcmd_parameters$[0], " "); // put the string back together if ((.@full$ ~= "^([1-9]{1,10}) ([Zz]enys?|[Ii]tems? ([0-9]+)|[Cc]ash(?: ?point)?s?) to (.{1,23})$") == false) { dispbottom("@give : Invalid syntax!"); dispbottom("@give : Proper syntax is @give <amount> <zeny | item <name> | cash> to <player name>"); end; } .@amount = max(1, atoi($@regexmatch$[1])); .@type = ord(strtolower($@regexmatch$[2])); .@item = atoi($@regexmatch$[3]); .@player$ = escape_sql($@regexmatch$[4]); .@player = getcharid(CHAR_ID_ACCOUNT, .@player$); .@char = getcharid(CHAR_ID_CHAR, .@player$); .@count = query_sql(sprintf("SELECT `name`, `char_id`, `account_id` " "FROM `char` " "WHERE `name` = '%s' LIMIT 1;", .@player$), .@player$, .@char, .@player); if (.@count < 1 || .@player < 1 || .@char < 1) { dispbottom("@give : Player not found in database!"); end; } switch (.@type) { case 122: // ZENY if (isloggedin(.@player, .@char)) { charcommand(sprintf("#zeny \"%s\" %i", .@player$, .@amount)); } else { query_sql(sprintf("INSERT INTO `mail` (send_name,dest_name,dest_id,title,time,zeny) " "VALUES ('%s','%s',%i,'%s',%i,%i);", "SRV", .@player$, .@char, "Event Reward", gettimetick(2), .@amount)); } break; case 105: // ITEM if (.@item < 1 || getiteminfo(.@item, 0) < 0) { dispbottom("@give : Item not found!"); end; } if (isloggedin(.@player, .@char)) { getitem(.@item, .@amount, .@player); } else { query_sql(sprintf("INSERT INTO `mail` (send_name,dest_name,dest_id,title,time,amount,nameid) " "VALUES ('%s','%s',%i,'%s',%i,%i,%i);", "SRV", .@player$, .@char, "Event Reward", gettimetick(2), .@amount, .@item)); } break; case 99: // CASH if (isloggedin(.@player, .@char)) { set(getvariableofpc(#CASHPOINTS, .@player), getvariableofpc(#CASHPOINTS, .@player) + .@amount); } else { query_sql(sprintf("UPDATE `acc_reg_num_db` " "SET `index` = `index` + %i " "WHERE `account_id` = %i AND `key` = '#CASHPOINTS';", .@amount, .@player)); } } dispbottom(sprintf("@give : Reward has been delivered to `%s`.", .@player$)); end; OnInit: bindatcmd("give", "@give::OnCall", 0, 99, 0); // <<< MAKE SURE YOU CHANGE THE GROUP ID HERE } Example usage: @give 50 zeny to meko @give 69 cash to meko @give 1 item 508 to meko If the player is online the reward is delivered instantly; If the player is offline the reward is delivered via the mail system (except for Cash rewards)
  24. Are you using a custom map or a built-in map? make sure it is in db/map_index.txt and if it's a new map update the mapcache
  25. This will just encourage people making spam posts to increase their post count, and encourage creating other accounts to increase reputation. It makes everything cumbersome for everyone. You cannot and should not force people to contribute. You'll just end up driving away possible contributors to other projects (ie rAthena). Most people nowadays prefer to try first, then if they like it they come back and contribute. If people feel forced they just bail.
×
×
  • Create New...

Important Information

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