• Content Count

  • Avg. Content Per Day

  • Joined

  • Last visited

  • Days Won


Tyrfing last won the day on May 27 2018

Tyrfing had the most liked content!

Community Reputation

19 Good


About Tyrfing

  • Rank
    Santa Poring

Profile Information

  • Gender

Recent Profile Visitors

1,165 profile views
  1. Greetings, Sorry for the late reply. I saw you updated your answer. Unfortunately, I tried suggesting what I thought could fix it, based on my knowledge of C and on my intuition. I'm not an expert on Gepard Shield, so you'll have to wait for Functor. Tyrfing
  2. bonus bAtkRate, (MaxHp * percentage_of_maxhp) / 100; This will increment the ATK by the specified percentage of the max hp. I'm sure this is not what you want, but it is what you requested. If MaxHp is 500, and percentage is 1, then this will add a bonus of 500 * 1 / 100 = 5% to ATK. If you find that this is too much (you probably will), you can multiply the denominator by a constant which better suits your needs. In my opinion, this will never be an interesting bonus, unless you make it non-linear, so that the bonus gets smaller as the MaxHp increases.
  3. https://github.com/thervingi/VIP-Ticket/tree/master/Translated/pt-br Instruções https://github.com/thervingi/VIP-Ticket/blob/master/Translated/pt-br/LEIAME.md
  4. Sorry, you don't have to downgrade. I thought you were using 5.6. You need to Switch from innodb to myisam before importing your SQL files. Or change the collation to some other type. Try utf8_general_ci. Please refer to this link
  5. In MySQL version 5.7 and upwards this limit has been increased to 3072 bytes. https://stackoverflow.com/a/36405914 So, make sure you are using MySQL 5.7.
  6. Please post your code.
  7. Greetings, Try changing the lines 1772, 1916, 1269 that call login_log() to call login_gepard_log() instead. If this doesn't work, then undo these modifications and duplicate each of these lines. After that, update the second line of each so that they call login_gepard_log() instead of login_log(). Then, remove the first argument of the calls to login_log() on the line above. Tyrfing
  8. You can apply a patch automatically using Git (download the installer at www.git-scm.com). Here is the manual for doing that: https://git-scm.com/docs/git-apply There's also this video, which is for Drupal, but it's the same technique for any patch file.
  9. Greetings Nuckelavee, Have you set up as a static IP address for your computer on your router? This is necessary for the Port Fowarding to work, since you are redirecting incoming requests on your router to a local IP address. Your char_athena.conf should have your LAN IP on login_ip and your WAN IP/NO-IP domain on char_ip. Your map_athena.conf should have your LAN IP on char_ip and your WAN IP/NO-IP domain on map_ip. If your ISP uses NAT, it might be that your router in fact has an external IP address that is not your real (WAN) IP address. In this case, you might want to try this suggestion regarding your NO-IP configuration. You said that Port Check Tool wouldn't yield a definitive result regarding the state of your router's 5121, 6121, 6900, 3306 and 80 ports. This is indicative that either your ISP or your Router's Firewall is not redirecting incoming connections to your machine. Your router's port forwarding configuration is correct, though. Your ISP might have changed its contractual clauses between 2015 and 2018 to block any connections on non-trivial (i.e. other than 80, 443, 21, 22, etc) ports. Summarizing Your issue seems to come down to allowing connections on your Windows Firewall, on your Router Firewall and, perhaps, on your ISP's Firewall. It might be that other running applications are competing for the same ports used by VertrigoServ. Please provide the contents of login_athena.conf, char_athena.conf, map_athena.conf as well as subnet_athena.conf for further support. Sincerely, Tyrfing
  10. Also, for instructive purposes: From rA\doc\script_commands.txt: *delitem2 <item id>,<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<account ID>}; This command will remove a specified amount of items from the invoking/target character. See 'getitem2' for an explanation of the expanded parameters. On the script excerpt you provided, the delitem2 argument you request an explanation for (the number zero) occupies the 5th position, that of the <attribute> parameter. The delitem2 command explanation forwards us to getitem2 for explanation on these parameters. From rA\doc\script_commands.txt: identify - Whether you want the item to be identified (1) or not (0). refine - For how many pluses will it be refined. It will not let you refine an item higher than the max refine. attribute - Whether the item is broken (1) or not (0). card1,2,3,4 - If you want a card compound to it, place the card ID number into the specific card slot. Here is your explanation for that parameter. Now, regarding the use of getd, let's first take a look at this command at rA\doc\script_commands.txt: *getd("<variable name>") Returns a reference to a variable, the name can be constructed dynamically. Refer to 'setd' for usage. In order for you to properly understand getd, you need to first understand how to use basic variables and arrays (skip the spoiler if you do). Assuming that you already understand how basic variables and arrays really work, this is the magic of getd: It allows you to choose which variables you want to set/read WHILE the script is executing. When you use basic variables and arrays, you're saying exactly where to place or to find the data you're looking for (e.g.: "I want to set the character's name to the variable named [email protected]_name$." or "I want to set [501, 502, 503, 504, 505] to the array named [email protected]_list."). This is fixed: after the server's loaded the script, you can't open an input and ask the player: "Hey, tell me the name of the variable you want me to store this amount of Jellopies in:". With getd you actually can do that (even though you shouldn't! ). That certainly is not the only use for getd, nor the most common: it is often used to make scripting simpler, and although I will refrain from attempting to document all occasions when its use would be beneficial, I'll provide you with an example which I find both instructive and simple enough. Let's say you have a Treasure Chest NPC, and whenever the player interacts with it, you want to give him a set of items. You have 5 different set of items, represented by 5 different arrays, and you want your script to randomly choose which set of items to reward the lucky player. So, you have something like this: setarray [email protected][0], 501, 502, 503; setarray [email protected][0], 620, 630, 640, 650; setarray [email protected][0], 711, 722, 733, 744, 755; setarray [email protected][0], 888, 999, 1010, 1111, 1212, 1313; setarray [email protected][0], 1010, 1111, 1212, 1313, 1414, 1515, 1616; How do you randomly select one of these arrays to reward the player with its items? Sure, you're definitely going to use the rand() function to generate a number that is in the range of [1, 5]. vvvv But, please, don't do this. vvvv With getd, you can simply do the following: set [email protected]_reward, rand(1,5); // The number of the picked reward // Rewards array name set [email protected]_rewards, "[email protected]" + [email protected]_reward; // How many of each item inside the rewards list to give the player set [email protected]_per_item, 1; for ([email protected] = 0; [email protected] < getarraysize(getd([email protected]_rewards)); [email protected]++) { giveitem getd([email protected]_rewards + "[" + [email protected] + "]"), [email protected]_per_item; } Line 1 picks a random number from 1 to 5 to identify which array of items it wants to give to the player. Line 4 effectively adds the string "[email protected]" to the picked number, so "[email protected]" + 4, for example, yields "[email protected]" and stores that in [email protected]_rewards. Line 7 sets how many of each item in the rewards list to reward the player with. Line 9 is where getd is first used. When you use the getd() function providing a string, you're effectively dealing with the value of the variable whose name is the provided string. So, in case the picked reward was number 4, you're actually dealing with [email protected], which is an array, hence why we're measuring it's size with getarraysize(). Line 10 concatenates the array's name with it's element so that we can actually access each of the array's elements. In case the picked reward was number 4, it concatenates the string "[email protected]" and "[[email protected]]", with [email protected] being repeatedly replaced by numbers from 0 to x, where x is getarraysize([email protected]) - 1. So it goes over the array, item by item, giving the defined amount to the invoking character. So, this is pretty much all there is to it. I hope this is as instructive as it is exhausting.
  11. This topic should actually be on Scripting Support. Greetings immortalis, If you haven't already added a new quest ID to your rathena\db\[pre-re|re]\quest_db.txt file, open it and follow the instructions and the provided format to add a new quest ID. Once you've created a new quest in your quest_db.txt file, simply call setquest <quest_id> at the desired moment of your NPC script. Once the quest is complete, call completequest <quest_id>, or, if you would like to erase a quest from the user's log, call erasequest <quest_id>. If you'd like your script to display that "Quest!" bubble icon, create a new OnInit label on your NPC script (as shown below), or modify your current OnInit label to add the questinfo command: OnInit: questinfo <quest_id>, QTYPE_QUEST; end; You can see the full documentation, including more detailed explanations for the above commands, at doc/script_commands.txt. Below I provide only the script_commands.txt information concerning the manipulation of the quest log: ========================= |8.- Quest Log commands.| ========================= --------------------------------------- *questinfo <Quest ID>,<Icon>{,<Map Mark Color>{,<Job Class>}}; This is esentially a combination of checkquest and showevent. Use this only in an OnInit label. For the Quest ID, specify the quest ID that you want checked if it has been started yet. For Icon, use one of the following: No Icon : QTYPE_NONE ! Quest Icon : QTYPE_QUEST ? Quest Icon : QTYPE_QUEST2 ! Job Icon : QTYPE_JOB ? Job Icon : QTYPE_JOB2 ! Event Icon : QTYPE_EVENT ? Event Icon : QTYPE_EVENT2 Warg : QTYPE_WARG Warg Face : QTYPE_WARG2 (Only for packetver >= 20120410) Map Mark Color, when used, creates a mark in the user's mini map on the position of the NPC, the available color values are: 0 - No Marker (default) 1 - Yellow Marker 2 - Green Marker 3 - Purple Marker When a user shows up on a map, each NPC is checked for questinfo that has been set. If questinfo is present, it will check if the quest has been started, if it has not, the bubble will appear. Optionally, you can also specify a Job Class if the quest bubble should only appear for a certain class. Example izlude,100,100,4 script Test 844,{ mes "[Test]"; mes "Hello World."; close; OnInit: questinfo 1001, QTYPE_QUEST, 0, Job_Novice; end; } --------------------------------------- *setquestinfo_level <quest_id>,<min_level>,<max_level>; Add level range criteria for quest info with quest id 'quest_id'. This command must be used after 'questinfo'. --------------------------------------- *setquestinfo_req <quest_id>,<req_quest_id>,<state>{,<req_quest_id>,<state>,...}; Add 'req_quest_id' as requirement for quest info with quest id 'quest_id'. Value os 'state' are: 0: Player doesn't started 'req_quest_id'. 1: Player has 'req_quest_id' (state is either "inactive" or "active"). 2: Player has 'req_quest_id' completed This command must be used after 'questinfo'. --------------------------------------- *setquestinfo_job <quest_id>,<job_id>{,<job_id>...}; Add job criteria for quest info with quest id 'quest_id'. The job criteria may more than one job_id. This command must be used after 'questinfo'. --------------------------------------- *setquest <ID>{,<char_id>}; Place quest of <ID> in the users quest log, the state of which is "active". If *questinfo is set, and the same ID is specified here, the icon will be cleared when the quest is set. --------------------------------------- *completequest <ID>{,<char_id>}; Change the state for the given quest <ID> to "complete" and remove from the users quest log. --------------------------------------- *erasequest <ID>{,<char_id>}; Remove the quest of the given <ID> from the user's quest log. --------------------------------------- *changequest <ID>,<ID2>{,<char_id>}; Remove quest of the given <ID> from the user's quest log. Add quest of the <ID2> to the the quest log, and the state is "active". --------------------------------------- *checkquest(<ID>{,PLAYTIME|HUNTING{,<char_id>}}) If no additional argument supplied, return the state of the quest: -1 = Quest not started (not in quest log) 0 = Quest has been given, but the state is "inactive" 1 = Quest has been given, and the state is "active" 2 = Quest completed If parameter "PLAYTIME" is supplied: -1 = Quest not started (not in quest log) 0 = the time limit has not yet been reached 1 = the time limit has not been reached but the quest is marked as complete 2 = the time limit has been reached If parameter "HUNTING" is supplied: -1 = Quest not started (not in quest log) 0 = you haven't killed all of the target monsters and the time limit has not been reached. 1 = you haven't killed all of the target monsters but the time limit has been reached. 2 = you've killed all of the target monsters --------------------------------------- *isbegin_quest(<ID>{,<char_id>}) Return the state of the quest: 0 = Quest not started (not in quest log) 1 = Quest has been given (state is either "inactive" or "active") 2 = Quest completed --------------------------------------- *showevent <icon>{,<mark color>{,<char_id>}} Show an emotion on top of a NPC, and optionally, a colored mark in the mini-map like "viewpoint". This is used to indicate that a NPC has a quest or an event to a certain player. Available Icons: Remove Icon : QTYPE_NONE ! Quest Icon : QTYPE_QUEST ? Quest Icon : QTYPE_QUEST2 ! Job Icon : QTYPE_JOB ? Job Icon : QTYPE_JOB2 ! Event Icon : QTYPE_EVENT ? Event Icon : QTYPE_EVENT2 Warg : QTYPE_WARG Warg Face : QTYPE_WARG2 (Only for packetver >= 20120410) Mark Color: 0 - No Mark 1 - Yellow Mark 2 - Green Mark 3 - Purple Mark --------------------------------------- Let me know if you have any additional questions. Tyrfing
  12. Have you compiled your server with the appropriate PACKETVER?
  13. Tyrfing

    What Font?

    As I have responded in rA's Discord, this font is Volkswagen Serial Heavy.
  14. Tyrfing


    Or, if you have a list os many items, you can store their IDs in an array: setarray [email protected][0], 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245; Then, if you want to make sure that the player has at least X of each item, you iterate over the array: set [email protected], X; set [email protected], 1; for ([email protected] = 0; [email protected] < getarraysize([email protected]); [email protected]++) { if (countitem([email protected][[email protected]]) < [email protected]) { set [email protected], 0; break; } } if ([email protected]) { // Player has at least X items of every ID } else { // Player does not have X items of every ID } Or, if you'd like to specify different quantities for each item, you can also do: setarray [email protected][0], 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245; setarray [email protected][0], 10, 10, 5, 5, 10, 10, 5, 6, 7, 10, 50, 100; set [email protected], 1; for ([email protected] = 0; [email protected] < getarraysize([email protected]); [email protected]++) { if (countitem([email protected][[email protected]]) < [email protected][[email protected]]) { set [email protected], 0; break; } } if ([email protected]) { // Player has the required amount of items of every ID } else { // Player does not have the required amount of items of every ID } You can also unite the two arrays together: setarray [email protected]_and_amount[0], 1234, 10, 1235, 10, 1236, 5, 1237, 5, 1238, 10, 1239, 10, 1240, 5, 1241, 6, 1242, 7, 1243, 10, 1244, 50, 1245, 100; /* The above array holds pairs of values, where the first value is the item ID and the second value is the required amount */ set [email protected], 1; for ([email protected] = 0; [email protected] < getarraysize([email protected]_and_amount) - 1; [email protected] = [email protected] + 2) { if (countitem([email protected]_and_amount[[email protected]]) < [email protected]_and_amount[[email protected]+1]) { set [email protected], 0; break; } } if ([email protected]) { // Player has the required amount of items of every ID } else { // Player does not have the required amount of items of every ID }