
Dastgir
-
Content Count
3805 -
Joined
-
Last visited
-
Days Won
250
Reputation Activity
-
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
-
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); -
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
-
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
-
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.
-
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.
-
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~
-
Dastgir got a reaction from Shatowolf in Hercules IRC
https://discord.gg/ZUzbRSp Blame discord UI for so much confusing...
-
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.
-
Dastgir got a reaction from Easycore in Hercules IRC
https://discord.gg/ZUzbRSp Blame discord UI for so much confusing...
-
Dastgir got a reaction from vBrenth in Hercules IRC
https://discord.gg/ZUzbRSp Blame discord UI for so much confusing...
-
Dastgir got a reaction from Kubix in Hercules IRC
https://discord.gg/ZUzbRSp Blame discord UI for so much confusing...
-
Dastgir got a reaction from vBrenth in How do you see your client date(version)?
OMG, just got to know about this..
-
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 -
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)
-
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
-
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
-
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...)
-
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
-
Dastgir got a reaction from tedexx in Clientinfo: multiple servers
You might have diffed with "Skip Service Select" patch
-
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.
-
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.
-
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; } -
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.
-
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