-
Content Count
848 -
Joined
-
Last visited
-
Days Won
34
Reputation Activity
-
bWolfie reacted to Dastgir in Add disabled_status to map_zone_db.conf or mapflag
https://github.com/HerculesWS/Hercules/pull/1781/
-
bWolfie reacted to kyeme in Add disabled_status to map_zone_db.conf or mapflag
My old suggestion here:
-
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
-
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
-
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.
-
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
-
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
-
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
-
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
-
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); -
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 -
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. -
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). -
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.
-
bWolfie reacted to Dastgir in Where can I find the commit for getvariableofpc()
https://github.com/HerculesWS/Hercules/commit/03f416eda0b0d1aeef03516863e11916e75660cdIt was fixed later on.
-
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.
-
-
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
-
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.
-
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
-
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.
-
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; } -
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.
-
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.
-
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