Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation since 12/27/2021 in all areas

  1. This is going to be a blunt post. For some time now the rAthena staff have been actively working to reduce the number of reseller advertisements that crop up on our forums, our Discord server, Facebook, websites, etc. We strongly advise that rAthena users do not engage with resellers. The code/content isn’t theirs to sell. You receive little to no support. You are at risk of being scammed. You are not supporting the developers of their respective projects or original content creators. You are lining the pockets of thieves and scammers who have no idea what they’re doing. The original project authors begin to feel demotivated - this can cause them to stop working on this and upcoming projects altogether. The number of reports from our users who have been scammed has increased significantly over the last year. If you wish to hire the services of a known and trusted developer, please use https://rathena.org/board/thirdpartyservices/ - this list of members of our forum has been vetted and approved. This is a list of members who are not going to scam you. If you decide to give your money to some random idiot that claims to have “full working premade x, y, z” then that’s on you. We can’t stop you, but you’re certainly adding fuel to the fire and these idiots will continue to take advantage of other members of our community. If you receive a DM from anyone trying to sell content on rAthena’s Discord or forum and the person is not listed on the Third Party Services page, we suggest taking evidence and report the users to a member of staff. So, what should you do instead? Setting up rAthena and a working client is easy. You don’t need someone else to do it for you - that is not how you learn. Using any of the multitude of tutorials and wiki pages will help you get your rAthena server up and running. If you don’t do it yourself, you will not learn where the configurations are. You won’t learn how to modify an item/mob. You won’t know how to enable an NPC. If you’re now thinking “well, I don’t have time, that’s why I pay someone” then maybe running a game server is not for you. Reseller = Bad. Learning and Self-Betterment = Good. I’m hoping this post gets our point across loud and clear.
    16 points
  2. Elurair Patching Launcher (RO Patcher Lite+ROCred Merge) About Universal auto-patcher for all your updating needs combined with a launcher, which is fully skinnable, highly customizable and easy on resources. It is free of any cost and works on every 32-bit and 64-bit Microsoft* Windows* platform. Known Issues [aavc] This tool is not safe for computers running Avast Anti-Virus. Download & Website http://ai4rei.net/p/skal License This work is licensed under a Creative Commons Attribution-Noncommercial 4.0 International License.
    9 points
  3. 4CrAM-Open Hey everyone. Today marks a very special day for the 4CrAM project. A day that will change the private server community. The project has been a big success and it has not only made it possible to have fully working for 4th jobs on private server's a thing but it also allowed me to recover from a difficult situation I was in at the start of the project. Im very thankful to the people who have supported me up to this moment. Without you this project wouldn't of been possible. But its been about a year and a half and with the code finally reaching a point that im happy with it, I feel its time to reveal it to the public. Today is the day I make all of the work ive done up to this point public for the community but with a little extra in it. The code contains fully working 4th jobs, fully working traits system with the sub-stats working 100% official, the AP system fully working, all 4th job skills working, a few new commands along with some others modified for developing purposes, a custom job changer NPC for all the latest jobs, and a few other goodies. But the last feature to be included with this release is something I felt would be a good thing for the player base, overall community, and my way of saying thanks. I don't want players to be divided into 2 sides due to one side having access to 4th jobs and the other side having their character's potential limited. So with this I decided to also release full ready to play support for all of the expanded jobs. This will allow all players to reach their final jobs and gain access to base level 250 and the traits system. However, none of their skills are coded in yet. The power gap between 4th jobs and older renewal era expanded jobs was just too great to keep this from the community and with this release the gap can be minimized. I hope everyone enjoys this release and have as much fun with it as I did coding it all. This is my gift to the community. Enjoy. Also be sure to leave me a thank you if your not too lazy. One final note. CHECKMATE AND FUCK YOU TO A CERTAIN PERSON!!!! You know who you are. >=D 4CrAM-Open Github Link Note: A 2020-09-02bRagexeRE client or newer is needed for 4th jobs access. A 2021-11-17aRagexeRE or newer is needed to access everything. Be sure to adjust the set client date your using in the defines_pre.hpp file. Keep in mind the 2021-11-17 client is still new and issues are likely to still exist with its support. https://github.com/Rytech2/4CrAM-Open
    9 points
  4. Hey everyone, The tool I am releasing is able to create RO sprite images in almost the same way as the official client does it. Means all it requires are the official data.grf files. You can compare it to ROCharGen. I've been working on this project for quite some time, mostly due to changing to some other fad regarding programming languages and re-implementing the logic everytime. However I have now stick to one and actually got it to a point where it is possible to release it (actually the code has been up on github the whole time). So what exactly does it do? Given a data/ folder that contains the necessary sprite and lua files, it creates a set of png images for specific job ids. In case of animations it instead creates an apng image. Examples Webservice As written in the topic title the tool is available as a CLI tool (see examples) or as a webservice. Means you can put it on your server and make requests to it to view for example the character sprites of your players. For that I have created a FluxCP addon which interacts with the webservice: https://github.com/zhad3/zrenderer-fluxcp-addon. Setting up the whole thing is not as easy as ROCharGen hence there is a comprehensive tutorial available to get up and running: https://github.com/zhad3/zrenderer-fluxcp-addon/wiki/Tutorials FAQ Q: Can it create signatures like ROCharGen with background image, name, level, etc.? A: No. Q: Can it render 3d sprites such as the Guild Guardians, Treasure chests or Emporium? A: No, only 2d sprites Q: Can it render 4th jobs and new expanded classes such as Shiranui, Spirit Handler or Hyper Novice? A: Yes. Q: Can it render my custom items? A: Yes, with the exception of shields. Q: Can I use it for Ragnarok Online Zero? A: It has not been tested. The tool was created based on Renewal and just as that uses the lua files from the GRF which might not be available for Zero. Q: How do I use this? A: For a server setup read the tutorial: https://github.com/zhad3/zrenderer-fluxcp-addon/wiki/Tutorials. If you just want to fiddle around I recommend building the CLI tool. See the build instruction on the github. For windows you may also directly download the binaries from the releases page: https://github.com/zhad3/zrenderer/releases. Q: How do I update the data when I release a patch for my server? A: Currently there is no automatic process. The tool zextractor that we use in the tutorial supports also GPF and THOR. So you would need to upload your patch to the server and extract the data as done in the tutorial. Q: Why should I use this if I use ROCharGen already? A: You don't. Unless you are not happy with ROCharGen. Q: Can I use this for other purposes instead of just rendering Player sprites? A: Yes, for example you could use this for a database to automatically render sprites. You most likely don't want to use the FluxCP addon then but may reference it as an example. Links zrenderer repository: https://github.com/zhad3/zrenderer zrenderer windows binaries: https://github.com/zhad3/zrenderer/releases FluxCP addon repository: https://github.com/zhad3/zrenderer-fluxcp-addon Setup tutorial to get it up and running on your server: https://github.com/zhad3/zrenderer-fluxcp-addon/wiki/Tutorials Support Only limited support. There are still some features open I haven't implemented but since I consider this project overdue I just released it as is now. Regarding questions on how to setup I will only answer very specific questions referencing a specific step in the tutorial. Have fun!
    7 points
  5. Bards and dancers can use the "Compose" skill to play melody for everyone around them, and in addition a donation box is placed next to them, where other passing players can give zeny's to encourage the street musician to continue his work and feed your family! Musicians cannot open a songwriting area in the same view as each other, so it's your chance to grab the best spot to perform your musics!
    5 points
  6. RAGP Extractor About Rudimentary command-line tool to extract RAGP files (such as the assets in Ragnarok: Valkyrie Uprising). Usage unragp <file> Extracts <file> into current directory. Known Issues Because I wrote it on a whim to check out Ragnarok: Valkyrie Uprising game resources, there are no error messages. Either the program ends in OK or NG. Download Find attached. Source for reference: https://github.com/ai4rei/unragp License CC0 1.0 Universal 2021-12-27ragp-1.0.zip
    5 points
  7. Good morning, For the last months I've been working on a mod that would allow deeper ai conditions. Here is how the config file looks like : - friendrecoverable: # arbitrary name tag - or: - friend sleep - friend stone - friend stun - friend freeze - selfcellempty: - not self safetywall - not self pneuma - not self landprotector - not self icewall - friendcellempty: - not friend safetywall - not friend pneuma - not friend landprotector - not friend icewall Then you can add or modify lines in the usual mob_skill_db.yml file : 1639,Kathryne [email protected]_SAFETYWALL,anytarget,12,10,3000,0,10000,yes,self,expanded,selfcellempty,,,,,,, #use tag "expanded" then the name 1639,Kathryne [email protected]_SAFETYWALL,anytarget,12,10,3000,0,10000,yes,friend,expanded,friendcellempty,,,,,,, 1637,Margaretha [email protected]_STRECOVERY,any,72,1,10000,1000,10000,no,friend,expanded,friendrecoverable,,,,,,, I also added 2 new modes to complement these new behaviors : Modes: SkillOnly: true PcSkillBehavior: true SkillOnly will disable basic attacks and PcSkillBehavior will modify its skills' ranged/melee flag depending on range and not distance, as players' behave. The full mod : https://github.com/Singe-Horizontal/rathena/tree/feature/expanded_ai_full_mod Condition module standalone : https://github.com/Singe-Horizontal/rathena/tree/feature/expanded_ai_conditions AI mode standalone : https://github.com/Singe-Horizontal/rathena/tree/feature/additional_ai_modes Quick design video : It is my first c++ project mod and contribution with git, I gave all the care I could but unoticed things may have slipped out.
    4 points
  8. Version 1.0.0

    73 downloads

    After the success of our previous release Battleground Extended , Mystic Project has decided to release another work for free in the community of rAthena - The Gravity's Unimplemented Official Skills. We've long heard about them since the beginning. I've seen posts of people wondering if there was any releases of them. It took a while but here it is. We did some researches about what was intended by Gravity. I think we came close to the initial project with a few modifications. What are the Unimplemented Official Skills ? Unimplemented Official Skills are skills designed by Gravity long ago that have never been released. They were forgotten / dropped by Gravity. On iRO official wiki, you can see some informations about them. For example: Fire Ivy - iRO Wiki Classic Forgotten Skills List and Effect: Fire Ivy: Wizard has plenty of fire skills, as it was supposed to be an immobile skill that causes damage, we've renamed it to Wind Ivy and made it Wind. It can stop the target and does damage each second. Can be stackable up to 5. Class: Wizard Fury: The LK enters a Fury Phase. Each attack received increases LK's ATK by 1 each 500 damage (up to 5). Some damage are being absorbed and reduced depending of current maxhp. Class: Lord Knight Steal Backpack: Steal 1 stuff / item of Players directly in the inventory. Item is sent to the storage and the Stalker will have it as a rental for 5 minutes. If used on monsters, does a AOE Steal/Steal Coin Class: Stalker System Creation: Auto-Attack system of Whitesmith was designed to summon small devices to attack targets. There are ATK/MATK devices depending on level. Iron is required to make the device. Class: Whitesmith Synthesis Potion: Creates a rental potion that lasts 5 min for the whole party around the Creator if items requirements met. It costs 3 misc items to create a potion. Amount of players in the party increases the amount of items required. Those items are healing potions (heal over 10 seconds), ATK/MATK/Flee/Hit potions. Class: Creator Ragnarok: Ensemble Skill done by a bard and a dancer together. It causes damage in the area, as well as abnormal statuses. Allies receive buffs. Buffs and abnormal statuses are random each second. (similar to gospel) Class: Bard/Dancer Hallucination Walk: Summons a clone of self and cloak the SinX. If used while being cloaked: uncloaked the SinX and causes Hallucination in an area. Class: Assassin Cross Biotechnology: Passive skill. Increases chance to create an embryo and MaxHP of Homunculus by 2% per level. Class: Alchemist Drill Master: Passive skill. Increases damage of homunculus by 2% per level. Class: Alchemist Heal Homunculus: Same as Potion Pitcher lv 4 but targets directly the homunculus by using it without having to click on the homunculus. Class: Alchemist Flame Control: Alchemist inflicts damage linked to the homunculus based on homunculus's ATK and MATK. Chances to inflict a common status depending on homunculus type. Class: Alchemist Twilight Alchemy IV: Creates 200 blue potions if all requirements are met. Bonus - Extra Custom Skills: Earth Wall: Same as Ice Wall but it is indestructible and one cell only. 5 instances maximum. Class: Wizard Earthquake: Adapted version of Earthquake for Wizard. Part of ATK and MATK are defining damage. Class: Wizard Installation and Compatibility: I did put some instructions in the read me file regarding the installation. The diff is compatible with the latest rathena but it is easy to adapt to any version really. Any Questions ? You can contact me on Discord: Grenat#5220 for support regarding the installation.
    Free
    4 points
  9. View File Unimplemented Official Skills After the success of our previous release Battleground Extended , Mystic Project has decided to release another work for free in the community of rAthena - The Gravity's Unimplemented Official Skills. We've long heard about them since the beginning. I've seen posts of people wondering if there was any releases of them. It took a while but here it is. We did some researches about what was intended by Gravity. I think we came close to the initial project with a few modifications. What are the Unimplemented Official Skills ? Unimplemented Official Skills are skills designed by Gravity long ago that have never been released. They were forgotten / dropped by Gravity. On iRO official wiki, you can see some informations about them. For example: Fire Ivy - iRO Wiki Classic Forgotten Skills List and Effect: Fire Ivy: Wizard has plenty of fire skills, as it was supposed to be an immobile skill that causes damage, we've renamed it to Wind Ivy and made it Wind. It can stop the target and does damage each second. Can be stackable up to 5. Class: Wizard Fury: The LK enters a Fury Phase. Each attack received increases LK's ATK by 1 each 500 damage (up to 5). Some damage are being absorbed and reduced depending of current maxhp. Class: Lord Knight Steal Backpack: Steal 1 stuff / item of Players directly in the inventory. Item is sent to the storage and the Stalker will have it as a rental for 5 minutes. If used on monsters, does a AOE Steal/Steal Coin Class: Stalker System Creation: Auto-Attack system of Whitesmith was designed to summon small devices to attack targets. There are ATK/MATK devices depending on level. Iron is required to make the device. Class: Whitesmith Synthesis Potion: Creates a rental potion that lasts 5 min for the whole party around the Creator if items requirements met. It costs 3 misc items to create a potion. Amount of players in the party increases the amount of items required. Those items are healing potions (heal over 10 seconds), ATK/MATK/Flee/Hit potions. Class: Creator Ragnarok: Ensemble Skill done by a bard and a dancer together. It causes damage in the area, as well as abnormal statuses. Allies receive buffs. Buffs and abnormal statuses are random each second. (similar to gospel) Class: Bard/Dancer Hallucination Walk: Summons a clone of self and cloak the SinX. If used while being cloaked: uncloaked the SinX and causes Hallucination in an area. Class: Assassin Cross Biotechnology: Passive skill. Increases chance to create an embryo and MaxHP of Homunculus by 2% per level. Class: Alchemist Drill Master: Passive skill. Increases damage of homunculus by 2% per level. Class: Alchemist Heal Homunculus: Same as Potion Pitcher lv 4 but targets directly the homunculus by using it without having to click on the homunculus. Class: Alchemist Flame Control: Alchemist inflicts damage linked to the homunculus based on homunculus's ATK and MATK. Chances to inflict a common status depending on homunculus type. Class: Alchemist Twilight Alchemy IV: Creates 200 blue potions if all requirements are met. Bonus - Extra Custom Skills: Earth Wall: Same as Ice Wall but it is indestructible and one cell only. 5 instances maximum. Class: Wizard Earthquake: Adapted version of Earthquake for Wizard. Part of ATK and MATK are defining damage. Class: Wizard Installation and Compatibility: I did put some instructions in the read me file regarding the installation. The diff is compatible with the latest rathena but it is easy to adapt to any version really. Any Questions ? You can contact me on Discord: Grenat#5220 for support regarding the installation. Submitter grenat50 Submitted 01/21/2022 Category Source Modifications Video Content Author Grenat  
    3 points
  10. Version 1.0.4

    1,025 downloads

    Mystic Project is about to open its last opus. For the occasion, Mystic Project has decided to make a gift to the community of rAthena and release one of its contents ! We've chosen the Battleground Extended, a memorable feature created by the eAmod and adapted for the new version of rAthena 2020. What are Battleground Extended ? They are an upgrade of the official Battleground made by the eAmod years ago and enhanced overtime. Battleground guide Name Description Flavius Same as official. The Goal is to destroy each's crystal. Flavius Capture The Flag The objective of the Flavius Battle CTF is to score 3 points before your enemy, by capture their Flag. To capture a Flag you need to take the enemy flag, and bring it to your base flag. If your base flag is captured too, you need to kill the flag carrier and take the flag back to your base. Flavius Death Match Each team has a certain number, Kill all the enemy players to let their Team without points. Protect your army. Flavius Stone Control Take the Stones in the middle of the battlefield and put in on your base, in the Stone Points. Each Stone will give points to your team. First team reach 99 points wins the game. Protect your stones from to be captured by the enemy. Tierra Eye of Storm There are two bases, North and South which teams can capture by holding position on the Base more than the other team. Each base will give you points each 5 seconds of Domination. If your Team control both bases the amount of points increases. To get additional points, in the middle there is a Flag spawn, capture it and put it on any of your team Bases. The first Team reach 99 points wins the match. Tierra Bossnia Attack the enemy base and destroy each MVP Guardian. To do damage to the guardian your team must capture the Balance Flag in the middle base. Each team have 5 guardian to be protected or killed. Tierra Domination There are three bases, North, Center and South which teams can capture by holding position on the Base more than the other team. Each base will give you points each 5 seconds of Domination. The first Team reach 99 points wins the match. Krieger Von Midgard (KVM) Same as official, regular PVP. Double Inferno There are 2 teams in the battlefield, your team and the opposite enemies. Kill the enemy players, collect the skulls and bring them to the Sacrifice Totem to win points. You can collect your own team skulls and bring then to your Sacrifice Totem to avoid other teams to score but it won't count as points. If you get killed all your skulls will be drop to the floor, including your own skull. First Team to get 80 points wins the battle. Conquest If you are Attacking, destroy the enemy defenses and it's Flag. If you are Defending, protect your castle defenses and the Flag. Rush Fight to capture the Castle and organize your team to defend it. If you fail on the first capture, kill the defender and take it for your team. Poring Ball It is a soccer game, a poring (the ball) will be in the middle of the field. The match lasts 5min. The team that has the most goals win the game. Super Bomberman The classic game specially made in Ragnarok Online. The goal is to defeat the enemies by putting bombs that will explode on them. It is a 2vs2 version of the game. Peco Peco Racer Coming soon... ( Mario Kart - RO version : Preview Alpha Version Video ) New Battleground Queue System Battleground Commands @joinbg will warp you only to the battleground room. (Use interface UI Battleground to join any running BG or create one) @leavebg will warp you out of the the current battleground you're in. @listenbg display or not the battleground explanations. @order is only for the leader, an huge announce will be displayed to the team. @reportafk is only for the leader, expulsing someone who is AFK. @bginfo will display all curent running BGs + amount of players + scores for each team and remaining time of the BG Battleground Skills @bgskill is used by the leader. I left it there as a memory but you better use the guild interface alt + g -> guild skill tree The leader can use the following skills: - Emergency Recall: Warp everyone from the team to the leader. - Battle Orders: All guild members visible on the guild leader screen will receive +5 STR, DEX, INT. (Now having a status icon on the right) - Regeneration: All guild members visible on the guild leader screen will increase their HP and SP regen rate. (Now having a status icon on the right) - Restore: All guild members visible on the guild leader screen will have their HP and SP restored to 90% of the respective maximum. - Chargeshout Flag: The leader will summon a guild flag. - Chargeshout Beating: Anyone in the guild can use this skill, it will warp to the guild flag IF you are on the same map as the flag. - Emergency Move: All guild members visible on the guild leader screen will receive the effect of speed potion, increasing walking speed by 25%. Kill Count Each person killed on a battlefield will be counted in your guild information. This is like a rank. In bg_common.txt, you will find this. If you already use OnPCKillEvent, I recommend you to remove this code and add it to yours. Red / Blue Teams Upon your arrival on the battlefield, you are going to see yourself in a clan (alt + g) and a guild (ctrl + g). Blue Team : http://mysticprojectro.com/wiki/images/d/d1/Clan_emblem01.jpg Red Team : http://mysticprojectro.com/wiki/images/a/a9/Clan_emblem02.jpg Each team-mate will have this emblem by their character's name. Enemies will be displaying the opposite emblem. Some battlefields will change your cloth dye as well for the attributed color but don't worry, you will get yours back as soon as the game is over. You can communicate with your team through the guild chat. When you leave the battlefield, the clan will be removed and you will be back in your actual guild. Battleground Happy Hours Battleground happy hours happen everyday from 4pm to 8pm during which, rewards obtained are increased by 60%. (Configurable in npc/battleground/bg_common.txt) Battleground Rewards Telma/Erundek NPCs from the official battleground are there to exchange Consumables / Stuff. However, some of you rather customize the rewards. It's up to you to remove Telma/Erundek. If you want to customize Rewards, here is a frame (located in bg_common.txt) made to buy stuff directly with badges. Poring Ball Youtube Video Demonstration : Ragnarok Online - DaRO : BattleGround Extended + - YouTube The original Poring Ball Map was created by us 14 years ago. (On the left). At the time, we had poor experience in mapping so my apologies if you don't find it attractive. However, you can always purchase the beautiful rework done by Olrox (on the right): https://olroxgraphics.com/index.php?/store/product/107-soccer-stadium/ Depending on which map you will pick, you need to configurate the Poring Ball. I assume you already have Olrox's map so by default, it is this configuration. If you want the free map that is included in this pack, you need to comment /* */ Olrox Poring Ball Map and remove the comment of Grenat Poring Ball Map (See orange sign) Bomberman Video Demonstration : Super Bomberman Ragnarok Online YouTube Video I've read a lot of times people asking about it ! We are releasing the new Bomberman Battleground Version with 3 bomberman maps (two of them are made by us) In bg_bomberman.txt, you will find this code. Make sure to remove it and add it to your OnPCStatCalcEvent, otherwise just leave it there. Some newer rAthena version doesn't have OnPCStatCalcEvent anymore, you may need to reinstall it. Installation : In this package, you will find : - BattlegroundExtended.diff : You will need to apply this patch. (cmd -> cd rathena -> git apply BattlegroundExtended.diff ) It has been created in 2020 and work with the latest rAthena. (Possibly working on previous version from 2018+). - NPC folder: I strongly recommend to delete all BG NPCs and only install the ones that are in this folder. It is compatible with the new BG Queue Systeme. Please review Poring Ball.txt to configurate your poring ball as well as bg_common for the happy hour rate. - DB: I did put items in txt and yml files since I don't know which version you guys are using. DO NOT copy paste in your db folder. Only take what's inside each files. - Client: Contains items/maps/texture/files/lua (for the new BG queue system)/bomberman music etc... Extract the contents inside your RO client folder. This patch modifies a lot of files, you may need to install the diff manually depending on your rAthena version. Once installed, please recompile your map_cache with the client data installed in the directory/grf the server reads to compile it. Configuration : Your server might be different than ours. This is why, it is important to configurate well the system. conf/battle/battleground.conf -> Search for battleground eAmod and configure them. db/battleground.xml -> "Color" represents the clothes palette given upon arrival on the battlefield. The player's Palette will come back to the original one when the BG is over. If you don't want players to have different cloth color, just put 0 or do not put anything at all. In our server, Color : 6 is blue, and 22 is red. Therefore, this is our configuration. I let you configure yours. Additional New Script Commands : * getnpcinfo <type>{,<char_id>} type: NPC_X: X, NPC_Y: Y * setporingball; (When activated, it would be like an OnClickedCell, almost ;), it calls a script for the poring ball (Or other things if you want to add things there). * getporingballx() / getporingbally(); (Get coordination of a clicked cell) * removeporingball; (Remove poring ball mode (Clickable cell calling a script) * getunitdir <unit_id/account_id>; (Get direction the unit is looking) * ispcsit <account_id> (Get information if a pc is sit or not) * unitpush <unit_id/account_id>,<dir>,<cells>; (Push (knockback) a specific target in a specific direction) * areaeffect( effect id, x, y); Any Questions ? You can contact me on Discord: Grenat#5220 for support regarding the installation. Support post : Release: Battleground Extended 2020 ! With Bomberman/Poring Ball - Source Releases - rAthena Team Mystic Project.
    Free
    3 points
  11. I want a place to showcase scripts and mini-games and instances that I've made but not necessary release them. A place that I can get comments and feedback. We have that for graphics things but I think a "Script Showcase" section under scripts could be useful. Thoughts?
    3 points
  12. I would love to see this too Auto-Attack System : Summon 3 different clone each level lvl 1 Sniper , lvl 2 Whitesmith and lvl 3 is High priest Job: Priest Create Nugget : Jump to enemy inside cell 1x1 Job: Stalker Fire Ivy: Swap enemy with your location Job: High Wizard
    2 points
  13. @ErossAt src/map/mob.cpp on line 4544 it begins. Just change: mob->status.str = max(1, stat); To: mob->status.str = max(1, (stat*6)); And the same on the other stats below the other stats. Attack change on line 4452 from: mob->status.rhw.atk = atk; To: mob->status.rhw.atk = atk*6; Defense change on line 4486 from: def = cap_value(def, DEFTYPE_MIN, DEFTYPE_MAX); To: def = cap_value(def*6, DEFTYPE_MIN, DEFTYPE_MAX); Recompile ur server after. Ps: NOT TESTED!! Rynbef~
    2 points
  14. Need the latest kRO Install folder for your private server? Look no further! ----> Download <---- Latest: 2020-01-24 Installation: Official kRO Updated: 06/04/2021 Download Link: http://bit.ly/latestkro Package contains RSU RO Patcher Lite for kRO and kRO RE by [Ai4rei] This package is maintained by [Akkarin] This ZIP archive is 3.50GB in size and includes all BGMs plus the latest RSU ([2021-02-19] Release 4.0.0.1213) Simply download, extract, play! A fan of this topic? Hit the rep button
    2 points
  15. View File @noress - Prevent for being ressurected if you don't want it A command @noress that give to a player the possibility to accept or deny ressurections. It can be useful in case of griefing behaviors where players are ressurected in a loop to the goal of make him loose percents of xp. Submitter Shakto Submitted 01/16/2022 Category Source Modifications Video Content Author Shakto  
    2 points
  16. Version 1.0.3

    2 downloads

    The master storage allow you to have a shared storage between one and several accounts. It adds a master_id in the login SQL table automatically that allow you to links accounts. It contains verifications to disable any kind of possible dupe items.
    $30.00
    2 points
  17. Wish granted https://rathena.org/board/forum/249-script-showcase/
    2 points
  18. Happy New Year rAthena, Thanks for Everyone. such a good community. hope we still help each other for so many years. more power rAthena, HAPPY NEW YEAR AGAIN! LETS MAKE 2022 GREAT!!!
    2 points
  19. function Slot { set [email protected]$,getitemname(getarg(0)); switch(.ShowSlot) { case 1: if (!getitemslots(getarg(0))) return [email protected]$; case 2: if (getiteminfo(getarg(0), ITEMINFO_TYPE) == 4 || getiteminfo(getarg(0), ITEMINFO_TYPE) == 5) return [email protected]$+" ["+getitemslots(getarg(0))+"]"; default: return [email protected]$; } } To function Slot { set [email protected]$,getitemname(getarg(0)); switch(.ShowSlot) { case 1: if (!getitemslots(getarg(0))) break; case 2: if (getiteminfo(getarg(0), ITEMINFO_TYPE) == 4 || getiteminfo(getarg(0), ITEMINFO_TYPE) == 5) [email protected]$+=" ["+getitemslots(getarg(0))+"]"; } return "<ITEM>" + [email protected]$ + "<INFO>" + getarg(0) + "</INFO></ITEM>"; }
    2 points
  20. Version 1.0.0

    263 downloads

    Since Rytech released their 4th job code it is also pertinent to have the sprites corrected. It works with Kamishi's palletes and almost any generic
    Free
    2 points
  21. Evening all! With the recent forum updates comes some new shiny features from IPS. The feature I'm most excited about is the new Achievements and Ranks. The old Badges & Awards plugin has been merged into the new Achievements system on the forums - I'm sure some of you have already begun to receive additional badges for posting content or uploading a file! The ancient Ranks system has been replaced with the new one and updated to use the names of familiar in-game mobs. The order is different to the old one and the number of points for each rank has changed slightly, but I can see that some of you are already quickly climbing the ladder! The following table details how many points gets you to which rank, and how to earn those desirable points. Posting a comment/reply: 5 points Following a content item: 2 points Following a member: 2 points Following a node (forum, album, category, etc): 2 points Posting a content item: 10 points Reacting to a user's post/content item: 1 point for both giver and receiver There are other methods, but to reduce forum spam I'm omitting them from this list. Remember; spamming the forum will result in Warning Points which may result in your account being suspended. Happy posting!
    2 points
  22. como tal una guia en español escrita y actualizada no hay, todas estan en ingles en todo caso, es solo seguir la logica de los videos y editar y probar, en lo que respecta a items como headgears y eso... para item deberas enfocarte en 3 cosas: 1.- Client Side: en la carpeta de System dentro de tu cliente (donde esta el Grf, Emblem, System, ETC) el archivo llamado.... iteminfo.lua Ejemplo: Este sirve para Asignar descripciones y "vincular" el item_db con el sprite, tambien es importante que pongas el numero de slots conforme a como lo pondras, ya que si pones 0 aqui y en el item_db pones 1, no se veran visualmente los slots asi los tenga. [60607] = { unidentifiedDisplayName = "Red Angel Wings", unidentifiedResourceName = "Red_Angel_Wings", unidentifiedDescriptionName = { "" }, identifiedDisplayName = "Red Angel Wings", identifiedResourceName = "Red_Angel_Wings", identifiedDescriptionName = { "^FF0000Costume Only^000000.", "_______________________", "^0000CCType:^000000 Headgear", "^0000CCDefense:^000000 0", "^0000CCPosition:^000000 Low", "^0000CCWeight:^000000 10", "^0000CCArmor Level:^000000 1", "^0000CCRefineable:^000000 No", "_______________________", "^0000CCRequirement:^000000", "All classes" }, slotCount = 0, ClassNum = 6607, costume = true } 2.- Emulador Side: item_db.yml Ejemplo: En este sirve para asignar al objeto dentro del juego una ID, y sus posibles efectos (en el caso que no quieres que sea Costume borra 'Costume_' y te permitira alojarlo en Low Headgear, ya si desear Mid o Top, solo es seguir el patron) - Id: 60607 AegisName: Red_Angel_Wings Name: Red Angel Wings Type: Armor Buy: 20 Weight: 1 Defense: 5 Slots: 0 Locations: Costume_Head_Low: true ArmorLevel: 1 Refineable: false View: 6607 Script: | bonus bAllStats,10; 3.- Grf Side: Dentro del Grf ocuparas diversos archivos en diversas ubicaciones, empecemos con las que asignan ID en este caso los .lub \data\luafiles514\lua files\datainfo\accessoryid.lub ACCESSORY_Red_Angel_Wings = 6607 \data\luafiles514\lua files\datainfo\accname.lub [ACCESSORY_IDs.ACCESSORY_Red_Angel_Wings] = "_Red_Angel_Wings" Seguido de... (Normalmente la parte de acomodar sprites es lo mas facil, solo es revisar que los nombres coincidan y cada sprite empiece como corres ponde, recuerda que son .ACT y .SPR por cada carpeta, para el de Drop, el de Male y el de Female) \data\sprite\¾ÆÀÌÅÛ \data\sprite\¾Ç¼¼»ç¸®\¿© \data\sprite\¾Ç¼¼»ç¸®\³² (Respecto a las ilustraciones similar a los sprites, solo asegurate respetar en el caso de item el 24x24 y en collection revisa las dimensiones de algun otro objeto) \data\texture\À¯ÀúÀÎÅÍÆäÀ̽º\collection \data\texture\À¯ÀúÀÎÅÍÆäÀ̽º\item Y con eso podras crear un objeto en tu server, para crear items ETC, Armas o Armaduras, en el caso de Armaduras y ETC/Consumible no ocupas un sprite de Female/Male, unicamente el de drop y como no ocupas Female/Male no ocupas ni el accessoryid.lub ni el accname.lub; Trate de descomprimir algun grf asi sea viejo que tengas y solo es repetir y repetir hasta que eventualmente salga, nadamas procura siempre poner lo que son los nombres oficiales del sprite para evitar errores y ya con el iteminfo y el item_db.yml con esos 2 les asignas un nombre a tu eleccion, asi te evitas el andar editando sprite por sprite a tu antojo y evitas errores. Espero te pueda servir de algo y lamento si no me explique en algo apropiadamente xD Ojo.... mucho cuidado... recomiendo usar Notepad++, mas que nada porque algunos tienden a confundir los TABs por espacios, incluso yo por descuido propio aun asi cometo esos errores y con el Notepad++ es mas facil distinguir esos detalles, ya que asi tenga el mismo rango y uses espacio pero era TAB... desde ahi tu item_db crashea y te saldra ya todo con error, asi que mucho cuidado. PD: a mi tambien me ayudaron asi que.... dejo mi granito de arena PD2: Si cometi error en algun lado, sean libres de corregirme xP
    1 point
  23. Version 1.0.0

    4 downloads

    Hi Guys ! Here is Prontera modified with a spring look. All resources are included You will find in the .rar : --> Models folder --> Textures folder --> Rsw file, Gat file, Gnd file, Mini map a video is available for an in-game preview of the map: https://youtu.be/PVRDAlulkDc If you have any questions, please do not hesitate to contact me.
    $5.00
    1 point
  24. Good day ! Does anyone know how to add REPAIR button on a thor patcher?? So players dont need to delete the ".dat" folder manually .theyll just have to click the repair button from patcher .. I just need to know the right codes on config file .. thankyou !
    1 point
  25. Check your custom item bonus https://github.com/rathena/rathena/blob/master/doc/item_bonus.txt
    1 point
  26. @Erossmaybe u used the wrong file. But I've added an if-statement to check if mob class is boss too. ChangedMob v2.cpp Rynbef~
    1 point
  27. @ErossTry this changes but the MVPs need MVP Exp to multiply the stats. Changed Mob.cpp Rynbef~
    1 point
  28. View File @dance @dance A script-ported-version of source mod @dance (by Anarchist). Usage @dance <1-9> ________________________________________________ Feel free to Donate if you want to support me ________________________________________________ Submitter Easycore Submitted 09/09/2021 Category Utilities Video Content Author Easycore
    1 point
  29. Spriting Guide "in general": https://rathena.org/board/topic/61862-guide-spriting-101-creating-a-sprite-and-act-file/ If you want to request it someone: https://rathena.org/board/thirdpartyservices/?d=13&csrfKey=89c363f24c54c2462f78d101dc033b0a&advanced_search_submitted=1&content_field_93[1]=Spriting
    1 point
  30. en este archivo agrega: <yellow> <admin>2000001</admin> <admin>2000002</admin> <admin>2000003</admin> </yellow> son los ID de las cuentas que aparecerán como GM.
    1 point
  31. A marketplace for items on FluxCP is actually a good idea for an addon - just adding item to a holding table then inserting to the buyers inventory when in-game is relatively easy to do. I actually already have something very similar and would require minimal effort to view the table via FluxCP. For free. Paying for addons that would benefit the community as a whole is a daft idea. If you actually want someone to do it as a paid piece of work, then view the 3rd Party Services page.
    1 point
  32. close2 doesn't detach the player , use close or end for the reset times , you are already saving that in RESET_COUNT so you can do something like mes "Reset Count: " + RESET_COUNT;
    1 point
  33. EquipScript: | changebase JOB_MAGE; UnEquipScript: | changebase Class;
    1 point
  34. Annie's PVP Ladder required you to clear the temporary variables too in case if you want to reset ranking, else you will end up with faulty ranking after reset. query_sql("TRUNCATE TABLE `pvpladder`"); query_sql("TRUNCATE TABLE `ownladder`"); addrid(0); @PlayersKilledStreak = 0; @dota_sql_deaths = 0; @dota_multikills = 0; @dota_sql_streaks = 0; @dota_sql_streaktime = 0; @dota_sql_kills = 0; full script //====== rAthena Script ====================================================== //= PVP ladder script with dota announcement //===== By: ================================================================== //= AnnieRuru //===== Current Version: ===================================================== //= 3.6 //===== Compatible With: ===================================================== //= rAthena 2020-10-20, with MySQL 8.0 //===== Description: ========================================================= //= PVP ladder store in SQL table //= plus anti-sit-killer feature //===== Topic ================================================================ //= https://herc.ws/board/topic/18871-dota-pvp-ladder/ //===== Additional Comments: ================================================= //= add PVP Ladder statue due to popular demand //============================================================================ /* CREATE TABLE `pvpladder` ( `char_id` INT PRIMARY KEY, `name` VARCHAR(24) NOT NULL DEFAULT '', `streaks` INT DEFAULT 0, `kills` INT DEFAULT 0, `deaths` INT DEFAULT 0, `streaktime` DATETIME, KEY (`kills`), KEY (`streaks`) ) ENGINE = MyISAM; CREATE TABLE `ownladder` ( `guild_id` INT PRIMARY KEY, `name` VARCHAR(24) NOT NULL DEFAULT '', `currentown` INT DEFAULT 0, `highestown` INT DEFAULT 0, `owntime` DATETIME, KEY (`highestown`) ) ENGINE = MyISAM; */ // add all the maps that you want this script to trigger ... all pvp and event maps perhaps ? // but if you already enable "all" maps, then can comment all these guild_vs1 mapflag loadevent guild_vs2 mapflag loadevent guild_vs3 mapflag loadevent pvp_y_1-2 mapflag loadevent guild_vs5 mapflag loadevent aldeg_cas01 mapflag loadevent aldeg_cas02 mapflag loadevent aldeg_cas03 mapflag loadevent aldeg_cas04 mapflag loadevent aldeg_cas05 mapflag loadevent gefg_cas01 mapflag loadevent gefg_cas02 mapflag loadevent gefg_cas03 mapflag loadevent gefg_cas04 mapflag loadevent gefg_cas05 mapflag loadevent payg_cas01 mapflag loadevent payg_cas02 mapflag loadevent payg_cas03 mapflag loadevent payg_cas04 mapflag loadevent payg_cas05 mapflag loadevent prtg_cas01 mapflag loadevent prtg_cas02 mapflag loadevent prtg_cas03 mapflag loadevent prtg_cas05 mapflag loadevent arug_cas01 mapflag loadevent arug_cas02 mapflag loadevent arug_cas03 mapflag loadevent arug_cas04 mapflag loadevent arug_cas05 mapflag loadevent schg_cas01 mapflag loadevent schg_cas02 mapflag loadevent schg_cas03 mapflag loadevent schg_cas04 mapflag loadevent schg_cas05 mapflag loadevent - script DOTAPVP FAKE_NPC,{ OnInit: // Config .sound = 1; // soundeffect : 0 - disable, 1 - play soundeffect to all players on map, 2 - play soundeffect to an area around the killer, 3 - play soundeffect to killer only .dota_bc_flag = 0; // announce to : 0 - global, 1 - map .mapname_announcement = 1; // announce the map name in the announcement ? : 0 - off, 1 - on .killannounce = 1; // announce who pawn who's head : 0 - off, 1 - on .msg_die = 1; // show message who kill you when die : 0 - off, 1 - on .msg_kill = 1; // show message you kill who when killed someone : 0 - off, 1 - on .gmnokill = false; // GMs are not suppose to kill players. A GM with <this number> level or higher will do nothing. IF set to 60, GM60 and above kill any player will not get anything : 0 - off .killingspree = 3; .dominating = 4; .megakill = 5; .unstoppable = 6; .wickedsick = 7; .monsterkill = 8; .godlike = 9; .holyshit = 10; .continue = 1; // after beyond-godlike, every <this number> kills will make announcement again .owned = 5; // how many times the guild has to kill to announce ownage .owncontinue = 1; // after ownage, every <this number> guild cumulative kills will make ownage announce again // .min_gm_menu = 90; // minimum level of GM can use the GM menu on ladder npc .showtotal = 20; // show the length of ladder. .showpage = 10; // set the views per page. .loweststreak = 3; // mininum streak count allow to show in highest streak ladder. Default 3 means must at least have killing spree streak to display in ladder .lowestownage = 5; // mininum ownage count allow to show in longest ownage ladder. Default 5 means must at least have 5 ownage counts to display in ladder setarray .maptrigger$, // only these maps will trigger this script // "all", // uncomment this to allow load all maps "guild_vs1", "guild_vs2", "guild_vs3", "pvp_y_1-2", "aldeg_cas01", "aldeg_cas02", "aldeg_cas03", "aldeg_cas04", "aldeg_cas05", "gefg_cas01", "gefg_cas02", "gefg_cas03", "gefg_cas04", "gefg_cas05", "payg_cas01", "payg_cas02", "payg_cas03", "payg_cas04", "payg_cas05", "prtg_cas01", "prtg_cas02", "prtg_cas03", "prtg_cas04", "prtg_cas05", "arug_cas01", "arug_cas02", "arug_cas03", "arug_cas04", "arug_cas05", "schg_cas01", "schg_cas02", "schg_cas03", "schg_cas04", "schg_cas05", "guild_vs5"; .showstatue = 10; // number of statues. This number must match with the number of duplicates at the end of the script .fix_custom_sprite = true; // if your server has custom animated sprite that overlaps the sprite animation repeatedly on the statues, enable this // anti-sit-killer system // a player must kill another player with this minimum <this number> base level to get the announcement and in the ladder. // Otherwise only have streak ended announcement and killed player's streak reset. // Its possible for a level 1 novice to kill a level 99 player and he/she will still get in the ladder // but a level 99 kill a level 1 player will get nothing // 0 - off this system ( default is 55, pk setting ) .lvltokill = 0; // when a player kill another same player <this number> times in a row, the player is warp back to save point. // and the player's streak, kills, and ownage count will deduct accordingly // 0 - off this system .counttopunish = 6; // minimum level range to kill another player // eg. when set to 20, player level 99 needs to kill another player with minimum level of 79 to get announcement and increase the kill rank. // but a player with base level 50 kills a level 99 will also get the announcement // higher base level cannot kill lower level, but lower level can kill higher level // 0 - off this system .minlvlrange = 0; setmapflag "pvp_y_1-2",mf_nobranch; // Config ends ------------------------------------------------------------------------------------------ // to prevent bug happen if (.dota_bc_flag < 0 || .dota_bc_flag > 1) .dota_bc_flag = 0; if (.continue < 1) .continue = 1; if (.owncontinue < 1) .owncontinue = 1; if (.gmnokill <= 0) .gmnokill = 100; if (.lvltokill <= 1) .lvltokill = 0; if (.counttopunish <= 1) .counttopunish = 0; .maptriggersize = getarraysize(.maptrigger$); sleep 1; OnTimer30000: // refresh every 30 seconds. Note the `char` table is unrealiable, player still need to perform certain task to save the character -> see 'save_settings' in conf\map-server.conf [email protected]$ = "SELECT `char`.`char_id`, `char`.`name`, `char`.`guild_id`, `char`.`class`, `char`.`sex`, `char`.`hair`, `char`.`hair_color`, `char`.`clothes_color`, `char`.`body`, `char`.`head_top`, `char`.`head_mid`, `char`.`head_bottom`, `char`.`robe`, " + "`pvpladder`.`kills`, `pvpladder`.`streaks`, `pvpladder`.`deaths` " + "FROM `char` RIGHT JOIN `pvpladder` ON `char`.`char_id` = `pvpladder`.`char_id` ORDER BY `kills` DESC LIMIT "+ .showstatue; [email protected] = query_sql([email protected]$, [email protected], [email protected]$, [email protected]_id, [email protected], [email protected]$, [email protected], [email protected]_color, [email protected]_color, [email protected], [email protected]_top, [email protected]_mid, [email protected]_bottom, [email protected], [email protected], [email protected], [email protected]); if (.fix_custom_sprite) { for ([email protected] = 0; [email protected] < [email protected]; [email protected]) { setunitdata .statue[[email protected] +1], UNPC_HEADTOP, 0; setunitdata .statue[[email protected] +1], UNPC_HEADMIDDLE, 0; setunitdata .statue[[email protected] +1], UNPC_HEADBOTTOM, 0; setunitdata .statue[[email protected] +1], UNPC_ROBE, 0; } } for ([email protected] = 0; [email protected] < [email protected]; [email protected]) { setunitdata .statue[[email protected] +1], UNPC_CLASS, [email protected][[email protected]]; setunitdata .statue[[email protected] +1], UNPC_SEX, ([email protected]$[[email protected]] == "F")? SEX_FEMALE:SEX_MALE; setunitdata .statue[[email protected] +1], UNPC_HAIRSTYLE, [email protected][[email protected]]; setunitdata .statue[[email protected] +1], UNPC_HAIRCOLOR, [email protected]_color[[email protected]]; setunitdata .statue[[email protected] +1], UNPC_CLOTHCOLOR, [email protected]_color[[email protected]]; setunitdata .statue[[email protected] +1], UNPC_BODY2, [email protected][[email protected]]; setunitdata .statue[[email protected] +1], UNPC_HEADTOP, [email protected]_top[[email protected]]; setunitdata .statue[[email protected] +1], UNPC_HEADMIDDLE, [email protected]_mid[[email protected]]; setunitdata .statue[[email protected] +1], UNPC_HEADBOTTOM, [email protected]_bottom[[email protected]]; setunitdata .statue[[email protected] +1], UNPC_ROBE, [email protected][[email protected]]; setnpcdisplay "pvp_ladder_statue#"+([email protected] +1), [email protected]$[[email protected]]; .statue_name$[[email protected] +1] = [email protected]$[[email protected]]; .statue_guild$[[email protected] +1] = getguildname([email protected]_id[[email protected]]); .statue_kills[[email protected] +1] = [email protected][[email protected]]; .statue_streaks[[email protected] +1] = [email protected][[email protected]]; .statue_deaths[[email protected] +1] = [email protected][[email protected]]; } for ([email protected] = [email protected]; [email protected] < .showstatue; [email protected]) setunitdata .statue[[email protected] +1], UNPC_CLASS, HIDDEN_WARP_NPC; initnpctimer; end; // script start. OnPCKillEvent: if (getgmlevel() >= .gmnokill) end; [email protected]$ = strcharinfo(3); if (.maptrigger$ != "all") { while ([email protected] < .maptriggersize && [email protected]$ != .maptrigger$[[email protected]]) [email protected]; if ([email protected] == .maptriggersize) end; } [email protected]$ = strcharinfo(0); [email protected] = getcharid(3); [email protected] = getcharid(0); [email protected] = getcharid(2); [email protected] = BaseLevel; attachrid killedrid; [email protected]$ = strcharinfo(0); [email protected] = getcharid(3); [email protected] = getcharid(0); [email protected] = getcharid(2); [email protected] = BaseLevel; if ([email protected] != [email protected] && (.msg_die || .msg_kill)) { if (.msg_die) message [email protected]$, "You have been killed by "+ [email protected]$; if (.msg_kill) message [email protected]$, "You just killed "+ [email protected]$; } if (@PlayersKilledStreak >= .holyshit) [email protected]$ = "Beyond Godlike"; else if (@PlayersKilledStreak >= .godlike) [email protected]$ = "Godlike"; else if (@PlayersKilledStreak >= .monsterkill) [email protected]$ = "Monster Kill"; else if (@PlayersKilledStreak >= .wickedsick) [email protected]$ = "Wicked Sick"; else if (@PlayersKilledStreak >= .unstoppable) [email protected]$ = "Unstoppable"; else if (@PlayersKilledStreak >= .megakill) [email protected]$ = "Mega-kill"; else if (@PlayersKilledStreak >= .dominating) [email protected]$ = "Dominating"; else if (@PlayersKilledStreak >= .killingspree) [email protected]$ = "Killing Spree"; if (@PlayersKilledStreak >= .killingspree && [email protected] == [email protected]) announce sprintf("%s has ended %s own %s[%d] streak %s", [email protected]$, (Sex)?"him":"her", [email protected]$, @PlayersKilledStreak, (.mapname_announcement)?("at "+ [email protected]$):""), bc_blue|.dota_bc_flag; else if (@PlayersKilledStreak >= .killingspree) announce sprintf("%s has ended %s's %s[%d] streak %s", [email protected]$, [email protected]$, [email protected]$, @PlayersKilledStreak, (.mapname_announcement)?("at "+ [email protected]$):""), bc_blue|.dota_bc_flag; else if (.killannounce && [email protected] != [email protected]) announce sprintf("%s has pawned %s's head %s", [email protected]$, [email protected]$, (.mapname_announcement)?("at "+ [email protected]$):""), bc_blue|.dota_bc_flag; @PlayersKilledStreak = 0; [email protected]_sql_deaths; @dota_multikills = 0; if ([email protected]) .guild_current_ownage[[email protected]] = 0; if ([email protected] == [email protected] || [email protected] < .lvltokill || (.minlvlrange && [email protected] + .minlvlrange < [email protected])) { query_sql sprintf("replace into pvpladder values (%d, '%s', %d, %d, %d, from_unixtime(%d))", [email protected], escape_sql([email protected]$), @dota_sql_streaks, @dota_sql_kills, @dota_sql_deaths, @dota_sql_streaktime); if ([email protected] && .guild_highest_ownage[[email protected]]) query_sql sprintf("replace into ownladder values (%d, '%s', %d, %d, from_unixtime(%d))", [email protected], escape_sql(getguildname([email protected])), .guild_current_ownage[[email protected]], .guild_highest_ownage[[email protected]], .guild_ownage_time[[email protected]]); end; } [email protected]_kills = @dota_sql_kills; [email protected]_deaths = @dota_sql_deaths; [email protected]_streaks = @dota_sql_streaks; [email protected]_streaktime = @dota_sql_streaktime; attachrid killerrid; if (.counttopunish) { if (@sitkillminute != gettime(DT_MINUTE)) { deletearray @sitkill; @sitkillminute = gettime(DT_MINUTE); } [email protected][[email protected]]; if (@sitkill[[email protected]] >= .counttopunish) { warp "SavePoint", 0,0; announce [email protected]$ +" , Stop killing "+ [email protected]$ + " !!!", bc_all; debugmes [email protected]$ +" is sit-killing "+ [email protected]$ +" for "+ @sitkill[[email protected]] + " times"; logmes "is sit-killing "+ [email protected]$ +" for "+ @sitkill[[email protected]] +" times"; if (@PlayersKilledStreak == @dota_sql_streaks) { @dota_sql_streaks = @dota_sql_streaks +1 - .counttopunish; @dota_sql_streaktime = gettimetick(2); } @PlayersKilledStreak = @PlayersKilledStreak +1 - .counttopunish; @dota_sql_kills = @dota_sql_kills +1 - .counttopunish; if (@PlayersKilledStreak < 0) @PlayersKilledStreak = 0; if (@dota_sql_kills < 0) @dota_sql_kills = 0; if (@dota_sql_streaks < 0) @dota_sql_streaks = 0; query_sql sprintf("replace into pvpladder values (%d, '%s', %d, %d, %d, from_unixtime(%d)), (%d, '%s', %d, %d, %d, from_unixtime(%d))", [email protected], escape_sql([email protected]$), @dota_sql_streaks, @dota_sql_kills, @dota_sql_deaths, @dota_sql_streaktime, [email protected], escape_sql([email protected]$), [email protected]_streaks, [email protected]_kills, [email protected]_deaths, [email protected]_streaktime); if ([email protected]) { if (.guild_current_ownage[[email protected]] == .guild_highest_ownage[[email protected]]) { .guild_highest_ownage[[email protected]] = .guild_highest_ownage[[email protected]] +1 - .counttopunish; .guild_ownage_time[[email protected]] = gettimetick(2); } .guild_current_ownage[[email protected]] = .guild_current_ownage[[email protected]] +1 - .counttopunish; if (.guild_current_ownage[[email protected]] < 0) .guild_current_ownage[[email protected]] = 0; if (.guild_highest_ownage[[email protected]] < 0) .guild_highest_ownage[[email protected]] = 0; if ([email protected] && .guild_highest_ownage[[email protected]]) query_sql sprintf("replace into ownladder values (%d, '%s', %d, %d, from_unixtime(%d)), (%d, '%s', %d, %d, from_unixtime(%d))", [email protected], escape_sql(getguildname([email protected])), .guild_current_ownage[[email protected]], .guild_highest_ownage[[email protected]], .guild_ownage_time[[email protected]], [email protected], escape_sql(getguildname([email protected])), .guild_current_ownage[[email protected]], .guild_highest_ownage[[email protected]], .guild_ownage_time[[email protected]]); else query_sql sprintf("replace into ownladder values (%d, '%s', %d, %d, from_unixtime(%d))", [email protected], escape_sql(getguildname([email protected])), .guild_current_ownage[[email protected]], .guild_highest_ownage[[email protected]], .guild_ownage_time[[email protected]]); } else if ([email protected] && .guild_highest_ownage[[email protected]]) query_sql sprintf("replace into ownladder values (%d, '%s', %d, %d, from_unixtime(%d))", [email protected], escape_sql(getguildname([email protected])), .guild_current_ownage[[email protected]], .guild_highest_ownage[[email protected]], .guild_ownage_time[[email protected]]); end; } } [email protected]; [email protected]_sql_kills; if (@PlayersKilledStreak > @dota_sql_streaks) { @dota_sql_streaks = @PlayersKilledStreak; @dota_sql_streaktime = gettimetick(2); } if (@PlayersKilledStreak == .killingspree) setarray [email protected]$, "killingspree.wav", "is on a KILLING SPREE", "!"; else if (@PlayersKilledStreak == .dominating) setarray [email protected]$, "dominating.wav", "is DOMINATING", "!"; else if (@PlayersKilledStreak == .megakill) setarray [email protected]$, "megakill.wav", "has a MEGA KILL", "!"; else if (@PlayersKilledStreak == .unstoppable) setarray [email protected]$, "unstoppable.wav", "is UNSTOPPABLE", "!!"; else if (@PlayersKilledStreak == .wickedsick) setarray [email protected]$, "wickedsick.wav", "is WICKED SICK", "!!"; else if (@PlayersKilledStreak == .monsterkill) setarray [email protected]$, "monsterkill.wav", "has a MONSTER KILL", "!!"; else if (@PlayersKilledStreak == .godlike) setarray [email protected]$, "godlike.wav", "is GODLIKE", "!!!"; else if (@PlayersKilledStreak >= .holyshit && ((@PlayersKilledStreak - .holyshit) % .continue == 0)) setarray [email protected]$,"holyshit.wav", "is BEYOND GODLIKE",". Someone KILL "+( (Sex)?"HIM":"HER" ) +"!!!!!!"; if (getstrlen([email protected]$[1])) { announce sprintf("%s %s[%d] %s%s", [email protected]$, [email protected]$[1], @PlayersKilledStreak, (.mapname_announcement)?("at "+ [email protected]$):"", [email protected]$[2]), bc_blue|.dota_bc_flag; if (.sound == 1) soundeffectall [email protected]$[0], 0, [email protected]$; else if (.sound == 2) soundeffectall [email protected]$[0], 0; else if (.sound == 3) soundeffect [email protected]$[0], 0; } [email protected]_multikills; deltimer "DOTAPVP::OnStreakReset"; addtimer 18000, "DOTAPVP::OnStreakReset"; query_sql sprintf("replace into pvpladder values (%d, '%s', %d, %d, %d, from_unixtime(%d)), (%d, '%s', %d, %d, %d, from_unixtime(%d))", [email protected], escape_sql([email protected]$), @dota_sql_streaks, @dota_sql_kills, @dota_sql_deaths, @dota_sql_streaktime, [email protected], escape_sql([email protected]$), [email protected]_streaks, [email protected]_kills, [email protected]_deaths, [email protected]_streaktime); if ([email protected] && [email protected] != [email protected]) { ++.guild_current_ownage[[email protected]]; if (.guild_current_ownage[[email protected]] > .guild_highest_ownage[[email protected]] ) { .guild_highest_ownage[[email protected]] = .guild_current_ownage[[email protected]]; .guild_ownage_time[[email protected]] = gettimetick(2); } if ([email protected] && .guild_highest_ownage[[email protected]]) query_sql sprintf("replace into ownladder values (%d, '%s', %d, %d, from_unixtime(%d)), (%d, '%s', %d, %d, from_unixtime(%d))", [email protected], escape_sql(getguildname([email protected])), .guild_current_ownage[[email protected]], .guild_highest_ownage[[email protected]], .guild_ownage_time[[email protected]], [email protected], escape_sql(getguildname([email protected])), .guild_current_ownage[[email protected]], .guild_highest_ownage[[email protected]], .guild_ownage_time[[email protected]]); else query_sql sprintf("replace into ownladder values (%d, '%s', %d, %d, from_unixtime(%d))", [email protected], escape_sql(getguildname([email protected])), .guild_current_ownage[[email protected]], .guild_highest_ownage[[email protected]], .guild_ownage_time[[email protected]]); } else if ([email protected] && .guild_highest_ownage[[email protected]]) query_sql sprintf("replace into ownladder values (%d, '%s', %d, %d, from_unixtime(%d))", [email protected], escape_sql(getguildname([email protected])), .guild_current_ownage[[email protected]], .guild_highest_ownage[[email protected]], .guild_ownage_time[[email protected]]); [email protected]_multikills = @dota_multikills; sleep 1500; if ([email protected] && [email protected] != [email protected] && .guild_current_ownage[[email protected]] >= .owned && ((.guild_current_ownage[[email protected]] - .owned) % .owncontinue == 0)) { if ( .dota_bc_flag ) mapannounce [email protected]$, "The guild ["+ getguildname([email protected]) +"] is OWNING["+ .guild_current_ownage[[email protected]] +"] !!!", bc_blue; else announce "The guild ["+ getguildname([email protected]) +"] is OWNING["+ .guild_current_ownage[[email protected]] +"] !!!", bc_blue; if ( .sound == 1 ) soundeffectall "ownage.wav",0,[email protected]$; else if ( .sound == 2 ) soundeffectall "ownage.wav",0; else if ( .sound == 3 && attachrid([email protected]) ) soundeffect "ownage.wav",0; } sleep 1250; if (!attachrid([email protected])) end; if ([email protected]_multikills == 2) { if (.dota_bc_flag) mapannounce [email protected]$, [email protected]$ +" just got a Double Kill !", bc_blue; else announce strcharinfo(0) +" just got a Double Kill !", bc_blue; if (.sound == 1) soundeffectall "doublekill.wav", 0, [email protected]$; else if (.sound == 2) soundeffectall "doublekill.wav", 0; else if (.sound == 3) soundeffect "doublekill.wav", 0; } else if ([email protected]_multikills == 3) { if (.dota_bc_flag) mapannounce [email protected]$, [email protected]$ +" just got a Triple Kill !!!", bc_blue; else announce strcharinfo(0) +" just got a Triple Kill !!!", bc_blue; if (.sound == 1) soundeffectall "triplekill.wav", 0, [email protected]$; else if (.sound == 2) soundeffectall "triplekill.wav", 0; else if (.sound == 3) soundeffect "triplekill.wav", 0; } else if ([email protected]_multikills == 4) { if (.dota_bc_flag) mapannounce [email protected]$, [email protected]$ +" just got a Ultra Kill !!!", bc_blue; else announce strcharinfo(0) +" just got a Ultra Kill !!!", bc_blue; if (.sound == 1) soundeffectall "ultrakill.wav", 0, [email protected]$; else if (.sound == 2) soundeffectall "ultrakill.wav", 0; else if (.sound == 3) soundeffect "ultrakill.wav", 0; } else if ([email protected]_multikills >= 5) { if (.dota_bc_flag) mapannounce [email protected]$, [email protected]$ +" is on a Rampage !!!", bc_blue; else announce strcharinfo(0) +" is on a Rampage !!!", bc_blue; if (.sound == 1) soundeffectall "rampage.wav", 0, [email protected]$; else if (.sound == 2) soundeffectall "rampage.wav", 0; else if (.sound == 3) soundeffect "rampage.wav", 0; } end; OnStreakReset: @dota_multikills = 0; end; OnPCLoginEvent: if (.maptrigger$ != "all") end; OnPCLoadMapEvent: if ([email protected]_sql_kills && [email protected]_sql_deaths) { if (.maptrigger$ != "all") { [email protected]$ = strcharinfo(3); while ([email protected] < .maptriggersize && [email protected]$ != .maptrigger$[[email protected]]) [email protected]; if ([email protected] == .maptriggersize) end; } query_sql "select kills, deaths, streaks, unix_timestamp(streaktime) from pvpladder where char_id = "+ getcharid(0), @dota_sql_kills, @dota_sql_deaths, @dota_sql_streaks, @dota_sql_streaktime; } [email protected] = getcharid(2); if ([email protected] && !.guild_highest_ownage[[email protected]]) { query_sql "select currentown, highestown, unix_timestamp(owntime) from ownladder where guild_id = "+ [email protected], [email protected], [email protected], [email protected]; .guild_current_ownage[[email protected]] = [email protected]; .guild_highest_ownage[[email protected]] = [email protected]; .guild_ownage_time[[email protected]] = [email protected]; } end; } prontera,180,194,3 script PvP-StatsViewer 4_GEFFEN_11,{ [email protected]$ = strnpcinfo(0); while (true) { mes "["+ [email protected]$ +"]"; mes "Hello "+ strcharinfo(0) +"..."; mes "If you want to I can show you your PVP stats."; next; mes "["+ [email protected]$ +"]"; switch (select( "Most Kills", "Highest Streak", "Longest Ownage", "Own Information", "Explanation", (getgmlevel() >= 99 ? "^FF0000[GM] Reset Ranking^000000" : "") )) { case 1: [email protected] = query_sql("select name, kills, deaths from pvpladder order by kills desc limit "+ getvariableofnpc(.showtotal, "DOTAPVP"), [email protected]$, [email protected], [email protected]); if ([email protected]) { mes "The ladder currently is empty."; next; } for ([email protected] = 0; [email protected] < [email protected]; [email protected] += getvariableofnpc(.showpage,"DOTAPVP")) { for ([email protected] = [email protected]; [email protected] < (getvariableofnpc(.showpage,"DOTAPVP") + [email protected]) && [email protected] < [email protected]; [email protected]) mes "^996600"+ ([email protected]+1) +": ^006699"+ [email protected]$[[email protected]] +" ^00AA00["+ [email protected][[email protected]] +"] ^FF0000<"+ [email protected][[email protected]] +">^000000"; next; } break; case 2: [email protected] = query_sql("select name, streaks, date_format(streaktime,'%a %e/%c/%y %r') from pvpladder where streaks >= "+ getvariableofnpc(.loweststreak,"DOTAPVP") +" order by streaks desc limit "+ getvariableofnpc(.showtotal,"DOTAPVP"), [email protected]$, [email protected], [email protected]$); if ([email protected]) { mes "The ladder currently is empty."; next; } for ([email protected] = 0; [email protected] < [email protected]; [email protected] += getvariableofnpc(.showpage,"DOTAPVP") ) { for ( [email protected] = [email protected]; [email protected] < (getvariableofnpc(.showpage,"DOTAPVP") + [email protected]) && [email protected] < [email protected]; [email protected]) { mes "^996600"+ ([email protected]+1) +": ^006699"+ [email protected]$[[email protected]] +" ^70AC11{"+ [email protected][[email protected]] +"} ^000000on :"; mes " ^EE8800"+ [email protected]$[[email protected]] +"^000000"; } next; } break; case 3: [email protected] = query_sql("select name, highestown, date_format(owntime,'%a %e/%c/%y %r') from ownladder where highestown >= "+ getvariableofnpc(.lowestownage,"DOTAPVP") +" order by highestown desc limit "+ getvariableofnpc(.showtotal,"DOTAPVP"), [email protected]$, [email protected], [email protected]$); if ([email protected]) { mes "The ladder currently is empty."; next; } for ([email protected] = 0; [email protected] < [email protected]; [email protected] += getvariableofnpc(.showpage,"DOTAPVP")) { for ([email protected] = [email protected]; [email protected] < (getvariableofnpc(.showpage,"DOTAPVP") + [email protected]) && [email protected] < [email protected]; [email protected] ) { mes "^996600"+ ([email protected]+1) +": ^006699"+ [email protected]$[[email protected]] +" ^00AAAA("+ [email protected][[email protected]] +") ^000000on :"; mes " ^EE8800"+ [email protected]$[[email protected]] +"^000000"; } next; } break; case 4: if ([email protected]_sql_kills && [email protected]_sql_deaths) query_sql "select kills, deaths, streaks, unix_timestamp(streaktime), date_format(streaktime,'%a %e/%c/%y %r') from pvpladder where char_id = "+ getcharid(0), @dota_sql_kills, @dota_sql_deaths, @dota_sql_streaks, @dota_sql_streaktime, [email protected]$; else query_sql "select date_format(from_unixtime("+ @dota_sql_streaktime +"),'%a %e/%c/%y %r')", [email protected]$; if ([email protected]_sql_kills && [email protected]_sql_deaths) mes "You not yet kill any player."; else { mes "Your Current Streak : ^70AC11{"+ @PlayersKilledStreak +"}^000000"; mes "Your Total Kills : ^00AA00["+ @dota_sql_kills +"]^000000"; mes "Your Death Counts : ^FF0000<"+ @dota_sql_deaths +">^000000"; if (@dota_sql_kills || @dota_sql_streaks) { mes "Highest Streak was ^70AC11{"+ @dota_sql_streaks +"}^000000 on :"; mes " ^EE8800"+ [email protected]$ +"^000000"; } } next; [email protected] = getcharid(2); if ([email protected]) { if (!getvariableofnpc(.guild_ownage_time[[email protected]], "DOTAPVP")) { query_sql "select currentown, highestown, unix_timestamp(owntime), date_format(owntime,'%a %e/%c/%y %r') from ownladder where guild_id = "+ [email protected], [email protected], [email protected], [email protected], [email protected]$; set getvariableofnpc(.guild_current_ownage[[email protected]], "DOTAPVP"), [email protected]; set getvariableofnpc(.guild_highest_ownage[[email protected]], "DOTAPVP"),[email protected]; set getvariableofnpc(.guild_ownage_time[[email protected]], "DOTAPVP"), [email protected]; } else query_sql "select date_format( from_unixtime("+ getvariableofnpc(.guild_ownage_time[[email protected]], "DOTAPVP") +"),'%a %e/%c/%y %r')", [email protected]$; mes "["+ [email protected]$ +"]"; if (!getvariableofnpc(.guild_ownage_time[[email protected]], "DOTAPVP")) { mes "Your guild not yet kill any player."; } else { mes "Your guild name : ^006699"+ strcharinfo(2) +"^000000"; mes "Current Owning : ^00AAAA("+ getvariableofnpc(.guild_current_ownage[[email protected]], "DOTAPVP") +")^000000"; mes "Longest Ownage was ^00AAAA("+ getvariableofnpc(.guild_highest_ownage[[email protected]], "DOTAPVP") + ")^000000 on :"; mes " ^EE8800"+ [email protected]$ +"^000000"; } next; } break; case 5: mes "Explanation for Most Kills:"; mes " "; mes "^996600Rank. ^006699NAME ^00AA00[Total Kills] ^FF0000<Deaths>^000000"; mes " "; mes "--------------------------------"; mes " "; mes "The ^00AA00Kills^000000 added when a player kills another player."; mes " "; mes "^FF0000Deaths^000000 count increase when a player killed by another player, or suicide (eg: Grand Cross)."; mes " "; mes "A player killed by monsters, homunculus or pets will not add the kills or deaths count."; next; mes "["+ [email protected]$ +"]"; mes "Explanation for Highest Streak:"; mes " "; mes "^996600Rank. ^006699NAME ^70AC11{Highest Streak} ^000000on :"; mes " ^EE8800TIME^000000"; mes " "; mes "--------------------------------"; mes " "; mes "The ^70AC11Streak^000000 are added every time a player kills another player. It will reset upon log out, killed by another player, or suicide (eg: Sacrifice)."; mes " "; mes "Then it record in the server the ^EE8800TIME^000000 when that player got that highest streak."; mes " "; mes "A player killed by monsters, homunculus or pets will not reset the streak."; mes " "; mes "--------------------------------"; mes " "; mes "The numbers of straight kills to get these announcements are :"; mes "^70AC11"+ getvariableofnpc(.killingspree,"DOTAPVP") +"^000000 : Killing Spree"; mes "^70AC11"+ getvariableofnpc(.dominating,"DOTAPVP") +"^000000 : Dominating"; mes "^70AC11"+ getvariableofnpc(.megakill,"DOTAPVP") +"^000000 : Mega Kill"; mes "^70AC11"+ getvariableofnpc(.unstoppable,"DOTAPVP") +"^000000 : Unstoppable"; mes "^70AC11"+ getvariableofnpc(.wickedsick,"DOTAPVP") +"^000000 : Wicked Sick"; mes "^70AC11"+ getvariableofnpc(.monsterkill,"DOTAPVP") +"^000000 : Monster Kill"; mes "^70AC11"+ getvariableofnpc(.godlike,"DOTAPVP") +"^000000 : Godlike"; mes "^70AC11"+ getvariableofnpc(.holyshit,"DOTAPVP") +"^000000 : Beyond Godlike"; next; mes "["+ [email protected]$ +"]"; mes "Explanation for Longest Ownage:"; mes " "; mes "^996600Rank. ^006699NAME ^00AAAA(Longest Ownage) ^000000on :"; mes " ^EE8800TIME^000000"; mes " "; mes "--------------------------------"; mes " "; mes "The ^00AAAAOwnage^000000 added every time any guild members killed another player that doesn't belong to his/her guild. It will reset when any of the guild member was killed by ANY player, including his/her guild member."; mes " "; mes "Then it record in the server the ^EE8800TIME^000000 when the guild got that longest ownage."; mes " "; mes "If the server went under maintainance, the current ownage will survive after the server restart."; mes " "; mes "Any guild member killed by monster, homunculus or pets will not reset the ownage count."; next; if (getvariableofnpc(.lvltokill,"DOTAPVP")) { mes "["+ [email protected]$ +"]"; mes "You must kill another player with minimum base level of "+ getvariableofnpc(.lvltokill,"DOTAPVP") +", in order to get an announcement or get in the ladder."; mes " "; mes "It's possible for a base level 1 novice kills a base level 99 player and still can get in the ladder."; mes "However when a player level 99 kills a level 1 novice will get nothing."; next; } if (getvariableofnpc(.counttopunish,"DOTAPVP")) { mes "["+ [email protected]$ +"]"; mes "Some noob players try to kill the same person over and over again in hope of getting his/her name appear in the ladder."; mes "However if you trying to do the same thing on this ladder, your name will announce to the public, and your action will be recorded into the server to notify the GMs."; next; } if (getvariableofnpc(.minlvlrange,"DOTAPVP")) { mes "["+ [email protected]$ +"]"; mes "When you kill another player thats lower base level than you, the base level gap between you and that player must not more than "+ getvariableofnpc(.minlvlrange,"DOTAPVP") +"."; mes " "; if (getvariableofnpc(.minlvlrange,"DOTAPVP") >= 200) mes "In other words, if your base level is 500, the player you killed must be at least level "+(500 - getvariableofnpc(.minlvlrange,"DOTAPVP"))+" then only you will get the announcement and in the ladder."; else if (getvariableofnpc(.minlvlrange,"DOTAPVP") >= 70) mes "In other words, if your base level is 255, the player you killed must be at least level "+(255 - getvariableofnpc(.minlvlrange,"DOTAPVP"))+" then only you will get the announcement and in the ladder."; else mes "In other words, if your base level is 99, the player you killed must be at least level "+(99 - getvariableofnpc(.minlvlrange,"DOTAPVP"))+" then only you will get the announcement and in the ladder."; mes "Higher base level kills lower level gets nothing, however lower level player kills higher level will get the announcement."; next; } break; case 6: mes "Want reset ^FF0000PvP Ranking^000000?"; if (select("- ^17AA24Yes^000000", "^FF0000No^000000") == 1) { mes "Ranking will be cleared."; close2; donpcevent strnpcinfo(3)+"::OnReset"; end; } break; } } OnReset: query_sql("TRUNCATE TABLE `pvpladder`"); query_sql("TRUNCATE TABLE `ownladder`"); addrid(0); @PlayersKilledStreak = 0; @dota_sql_deaths = 0; @dota_multikills = 0; @dota_sql_streaks = 0; @dota_sql_streaktime = 0; @dota_sql_kills = 0; end; } - script pvp_ladder_statue FAKE_NPC,{ [email protected] = getelementofarray(getvariableofnpc(.npcgid, "DOTAPVP"), getnpcid(0)); mes "^996600[TOP "+ [email protected] +"]"; mes "^006699Name : "+ getelementofarray(getvariableofnpc(.statue_name$, "DOTAPVP"), [email protected]); [email protected]$ = getelementofarray(getvariableofnpc(.statue_guild$, "DOTAPVP"), [email protected]); mes "^00AAAAGuild : "+(([email protected]$ == "null")? "^AAAAAANone": [email protected]$); mes "^00AA00Total Kills : ["+ getelementofarray(getvariableofnpc(.statue_kills, "DOTAPVP"), [email protected]) +"]"; mes "^70AC11Highest Streaks : ["+ getelementofarray(getvariableofnpc(.statue_streaks, "DOTAPVP"), [email protected]) +"]"; mes "^FF0000Deaths : <"+ getelementofarray(getvariableofnpc(.statue_deaths, "DOTAPVP"), [email protected]) +">"; close; OnInit: [email protected] = strnpcinfo(2); set getvariableofnpc(.statue[[email protected]], "DOTAPVP"), getnpcid(0); set getvariableofnpc(.npcgid[getnpcid(0)], "DOTAPVP"), [email protected]; end; } prontera,138,170,4 duplicate(pvp_ladder_statue) pvp_ladder_statue#1 1_F_MARIA prontera,135,168,4 duplicate(pvp_ladder_statue) pvp_ladder_statue#2 1_F_MARIA prontera,141,168,4 duplicate(pvp_ladder_statue) pvp_ladder_statue#3 1_F_MARIA prontera,87,141,4 duplicate(pvp_ladder_statue) pvp_ladder_statue#4 1_F_MARIA prontera,88,145,4 duplicate(pvp_ladder_statue) pvp_ladder_statue#5 1_F_MARIA prontera,83,144,4 duplicate(pvp_ladder_statue) pvp_ladder_statue#6 1_F_MARIA prontera,89,150,4 duplicate(pvp_ladder_statue) pvp_ladder_statue#7 1_F_MARIA prontera,90,154,4 duplicate(pvp_ladder_statue) pvp_ladder_statue#8 1_F_MARIA prontera,93,158,4 duplicate(pvp_ladder_statue) pvp_ladder_statue#9 1_F_MARIA prontera,96,160,4 duplicate(pvp_ladder_statue) pvp_ladder_statue#10 1_F_MARIA
    1 point
  35. instance_db.yml - Id: 1 Name: Endless Tower TimeLimit: 14400 Enter: Map: [email protected] X: 50 Y: 355 NPC script prontera,155,181,5 script Sample 757,{ [email protected]_name$ = "Endless Tower"; if (!is_party_leader()) end; switch(select( "Create", "Enter", "Destroy" )) { case 1: instance_create([email protected]_name$, IM_PARTY); break; case 2: switch(instance_enter([email protected]_name$)) { case IE_NOMEMBER: mes "ERROR: Party not found."; break; case IE_NOINSTANCE: mes "ERROR: Party does not have an instance."; break; case IE_OTHER: mes "ERROR: Unknown error."; break; default: break; } break; case 3: instance_destroy; break; } close; }
    1 point
  36. - script Sample -1,{ OnInit: .map$ = "prtg_cas01"; setmapflag(.map$, MF_LOADEVENT); end; OnPCLoadMapEvent: if (.map$ == strcharinfo(3) && !(agitcheck() || agitcheck2() || agitcheck3()) { [email protected]_guild_id = getcastledata(.map$, CD_GUILD_ID); if ([email protected]_guild_id && getcharid(2) != [email protected]_guild_id) { mes "You aren't allow to enter this area."; close2; warp "SavePoint", 0, 0; } } end; }
    1 point
  37. @mhielo12 @hellowin On file /src/map/clif_packetdb.hpp After: #if PACKETVER_MAIN_NUM >= 20181031 || PACKETVER_RE_NUM >= 20181031 || PACKETVER_ZERO_NUM >= 20181114 parseable_packet( 0x0B14, sizeof( struct PACKET_CZ_INVENTORY_EXPAND ), clif_parse_dull, 0 ); parseable_packet( 0x0B16, sizeof( struct PACKET_CZ_INVENTORY_EXPAND_CONFIRMED ), clif_parse_dull, 0 ); parseable_packet( 0x0B19, sizeof( struct PACKET_CZ_INVENTORY_EXPAND_REJECTED ), clif_parse_dull, 0 ); #endif Add: #if PACKETVER_MAIN_NUM >= 20190227 || PACKETVER_RE_NUM >= 20190220 || PACKETVER_ZERO_NUM >= 20190220 parseable_packet( 0x0B1C, sizeof( struct PACKET_CZ_PING ), clif_parse_dull, 0 ) #endif If on file src/map/clif.cpp doest exists add following or if exists replace them maybe with following: void clif_ping( struct map_session_data* sd ){ #if PACKETVER_MAIN_NUM >= 20190213 || PACKETVER_RE_NUM >= 20190213 || PACKETVER_ZERO_NUM >= 20190130 nullpo_retv( sd ); int fd = sd->fd; if( !session_isActive( fd ) ){ return; } struct PACKET_ZC_PING p; p.packetType = HEADER_ZC_PING; clif_send( &p, sizeof( p ), &sd->bl, SELF ); #endif } After: void clif_parse_StopUseSkillToId (...) {... NOTE I recommend to use everytime the newest rAthena version. There are many ways to disable or change things! Rynbef~
    1 point
  38. Have you tried to clear lights before recalculating ?
    1 point
  39. You need erase close; lines and replace for end; i've made some fixes, tested and working fine. - script gm_is_online -1,{ OnPCLoginEvent: if (getgmlevel()>=99) goto L_admin; if (getgmlevel()>=90) goto L_co_admin; if (getgmlevel()>=10) goto L_head; if (getgmlevel()>=4) goto L_event; if (getgmlevel()>=3) goto L_support; if (getgmlevel()>=2) goto L_helper; if (getgmlevel()>=0) goto L_player; readparam(bStr); readparam(bAgi); readparam(bVit); readparam(bInt); readparam(bDex); readparam(bLuk); if ((class >= 4054 && class <= 4079) || (class >= 4023 && class <= 4045) || (class >= 4096 && class <= 4108)){ //3rd Job Class if (readparam(bStr) > 99 || readparam(bAgi) > 99 || readparam(bVit) > 99 || readparam(bInt) > 99 || readparam(Dex) > 99 || readparam(bLuk) > 99){ mes "[^FF0000Anti Cheat System^000000]"; mes "We have detected you having stats over the limit. You will be disconnected shortly. If this is an error please contact the Game Master immediately."; atcommand "@option 2 0 0"; atcommand "@battleignore"; setoption 0x2,1; sc_start sc_berserk, 1000000000, 1; sleep2 5000; //5 Seconds delay atcommand "@kick "+strcharinfo(0)+""; end; } } else { //Other than 3rd Job Class if (readparam(bStr) > 99 || readparam(bAgi) > 99 || readparam(bVit) > 99 || readparam(bInt) > 99 || readparam(Dex) > 99 || readparam(bLuk) > 99){ mes "[^FF0000Anti Cheat System^000000]"; mes "We have detected you having stats over the limit. You will be disconnected shortly. If this is an error please contact the Game Master immediately."; atcommand "@option 2 0 0"; atcommand "@battleignore"; setoption 0x2,1; sc_start sc_berserk, 1000000000, 1; sleep2 5000; //5 Seconds delay atcommand "@kick "+strcharinfo(0)+""; end; L_admin: atcommand "@speed 1"; announce "[ Admin ] "+strcharinfo(0)+" ist online",bc_all,0x00ff66; specialeffect2 377; specialeffect2 381; end; L_co_admin: atcommand "@speed 1"; announce "[ Co Admin ] "+strcharinfo(0)+" ist online",bc_all,0x00ff66; specialeffect2 377; specialeffect2 381; end; L_head: atcommand "@speed 1"; announce "[ Head GM ] "+strcharinfo(0)+" ist online",bc_all,0x00ff66; specialeffect2 377; specialeffect2 381; end; L_event: atcommand "@speed 1"; announce "[ Event GM ] "+strcharinfo(0)+" online",bc_all,0x00ff66; specialeffect2 377; specialeffect2 381; end; L_support: atcommand "@speed 1"; announce "[ Support GM ] "+strcharinfo(0)+" online",bc_all,0x00ff66; specialeffect2 377; specialeffect2 381; end; L_helper: atcommand "@speed 1"; announce "[ Helper ] "+strcharinfo(0)+" online",bc_all,0x00ff66; specialeffect2 377; specialeffect2 381; end; L_player: end; } } }
    1 point
  40. Version 1.0.0

    111 downloads

    Good use!
    Free
    1 point
  41. you can easily found it by searching the forum
    1 point
  42. Here you go sir ^_^. @ignoredropV1.1.patch
    1 point
  43. Not ready yet but i'm working on it: https://github.com/haurenburu/ragnarok-content/tree/master/rathena/illusions/frozen
    1 point
  44. isso é no client data/luafiles514/luafiles/singboardlist.lua ou .lub ai você precisa remover os que tiver em prontera.. (lembrando, tem que tomar cuidado com as { } pois se tiver prontera, 100, 200, basta deixar remover.
    1 point
  45. Version 1.0.1

    535 downloads

    Freebies NPC with gepard function (UniqueID) In response to this post :
    Free
    1 point
  46. when double click the box and click cancel the item disappear any solution for that heres my code function script WeponBox { setarray [email protected]$, "Shin Spear", "Shin Shuriken" , "Shin Kudachi" , "Shin Fist" , "Creator Shin Axe" , "Shin Katana" , "Shin Revolver" , "Stalker Shin Mega Bow" , "Shin Whip" , "Shin Guitar" , "Prof Shin Staff" , "Shin Katar" , "Sinx Shin Dagger" , "WS Shin Bloody Axe" , "WZ Shin Staff" , "HP Shin Reaper" , "Sniper Quincy Bow" , "SG Book"; setarray [email protected], 47001, 47002, 47003, 47004, 47005, 47006, 47007, 47008, 47010, 47011, 47012, 47014, 47015, 47016, 47017, 47018, 47019, 47020; [email protected] = getarraysize([email protected]$); for([email protected] = 0; [email protected] < [email protected]; [email protected]++) [email protected]$ = [email protected]$ + [email protected]$[[email protected]] + ":"; getitembound [email protected][select([email protected]$) - 1], 1, Bound_Char; end; } its a callfunc command or how can i make my box have a msg like this #TIA
    1 point
  47. 4,198 downloads

    These are the old versions of Izlude and Alberta. Including map files (.gat | .gnd | .rsw) and minimaps (.bmp)
    Free
    1 point
  48. you didn't do anything wrong ... why ? because Emistry script isn't working ... try this, full complete script function script timeleft__ { if ( ( [email protected] = getarg(0) ) <= 0 ) return getarg(0); [email protected] = [email protected] / 86400; [email protected] = [email protected] % 86400 / 3600; [email protected] = [email protected] % 3600 / 60; [email protected] = [email protected] % 60; if ( [email protected] ) return [email protected] +" day "+ [email protected] +" hour"; else if ( [email protected] ) return [email protected] +" hour "+ [email protected] +" min"; else if ( [email protected] ) return [email protected] +" min "+ [email protected] +" sec"; else return [email protected] +" sec"; } - shop vipshop#7 -1,501:100 - shop vipshop#30 -1,501:100 - script vipnpc FAKE_NPC,{ OnInit: bindatcmd "vipshop", strnpcinfo(0)+"::Onvipshop"; end; Onvipshop: if ( #vipshop == 1 ) callshop "vipshop#7", 1; else if ( #vipshop == 2 ) callshop "vipshop#30", 1; else { mes "which vip status do you want to buy ?"; mes "vip 7 days = 10 Cash points"; mes "vip 30 days = 20 Cash points"; next; if ( select ( "Vip 7 Days", "Vip 30 Days" ) == 1 ) { if ( #CASHPOINTS < 10 ) { mes "you don't have enough Cash points"; close; } mes "Thanks for purchasing !"; #vipshop = 1; #CASHPOINTS -= 10; addtimer 7*24*60*60*1000, strnpcinfo(0)+"::OnTimeUp"; #viptimeleft = 7*24*60*60 + gettimetick(2); close; } else { if ( #CASHPOINTS < 20 ) { mes "you don't have enough Cash points"; close; } mes "Thanks for purchasing !"; #vipshop = 2; #CASHPOINTS -= 20; // addtimer 30*24*60*60*1000, strnpcinfo(0)+"::OnTimeUp"; // over integer limit #viptimeleft = 30*24*60*60 + gettimetick(2); close; } } dispbottom "You currently have "+ #CASHPOINTS +" Cash points .Expire in "+ callfunc( "timeleft__", #viptimeleft - gettimetick(2) )+"."; end; OnPCLoginEvent: if ( #viptimeleft < gettimetick(2) ) addtimer 1, strnpcinfo(0)+"::OnTimeUp"; // sometimes doevent doesn't work else if ( #viptimeleft - gettimetick(2) < 2147483 ) // don't execute addtimer if over integer limit addtimer ( #viptimeleft - gettimetick(2) )*1000, strnpcinfo(0)+"::OnTimeUp"; end; OnTimeUp: #viptimeleft = #vipshop = 0; end; } - script vipnpc#7 FAKE_NPC,{ OnInit: function addshopitem { npcshopdelitem "vipshop#7", 501; [email protected] = getargcount(); for ( [email protected] = 0; [email protected] < [email protected]; [email protected]++ ) { if ( [email protected] % 2 == 0 ) .itemid[ [email protected] /2 ] = getarg( [email protected] ); else { .itemcost[ [email protected] /2 ] = getarg( [email protected] ); npcshopadditem "vipshop#7", .itemid[ [email protected] /2 ], .itemcost[ [email protected] /2 ]; } } } addshopitem // adds shop items here for vip#7 501,10, 502,20, 503,30, 504,40, 505,50; npcshopattach "vipshop#7"; [email protected] = getarraysize( .itemid ); for ( [email protected] = 0; [email protected] < [email protected]; [email protected]++ ) .itemcost[ .itemid[[email protected]] ] = .itemcost[[email protected]]; end; OnBuyItem: if ( [email protected]_quantity ) end; [email protected] = getarraysize( @bought_nameid ); for ( [email protected] = 0; [email protected] < [email protected]; [email protected]++ ) [email protected] += .itemcost[ @bought_nameid[[email protected]] ] * @bought_quantity[[email protected]]; if ( [email protected] > #CASHPOINTS ) { mes "you don't have enough Cash points"; close; } if ( !checkweight2( @bought_nameid, @bought_quantity ) ) { mes "you can't carry all these items !"; close; } #CASHPOINTS -= [email protected]; for ( [email protected] = 0; [email protected] < [email protected]; [email protected]++ ) getitem @bought_nameid[[email protected]], @bought_quantity[[email protected]]; end; } - script vipnpc#30 FAKE_NPC,{ OnInit: function addshopitem { npcshopdelitem "vipshop#30", 501; [email protected] = getargcount(); for ( [email protected] = 0; [email protected] < [email protected]; [email protected]++ ) { if ( [email protected] % 2 == 0 ) .itemid[ [email protected] /2 ] = getarg( [email protected] ); else { .itemcost[ [email protected] /2 ] = getarg( [email protected] ); npcshopadditem "vipshop#30", .itemid[ [email protected] /2 ], .itemcost[ [email protected] /2 ]; } } } addshopitem // adds shop items here for vip#30 501,5, 502,10, 503,15, 504,20, 505,25; npcshopattach "vipshop#30"; [email protected] = getarraysize( .itemid ); for ( [email protected] = 0; [email protected] < [email protected]; [email protected]++ ) .itemcost[ .itemid[[email protected]] ] = .itemcost[[email protected]]; end; OnBuyItem: if ( [email protected]_quantity ) end; [email protected] = getarraysize( @bought_nameid ); for ( [email protected] = 0; [email protected] < [email protected]; [email protected]++ ) [email protected] += .itemcost[ @bought_nameid[[email protected]] ] * @bought_quantity[[email protected]]; if ( [email protected] > #CASHPOINTS ) { mes "you don't have enough Cash points"; close; } if ( !checkweight2( @bought_nameid, @bought_quantity ) ) { mes "you can't carry all these items !"; close; } #CASHPOINTS -= [email protected]; for ( [email protected] = 0; [email protected] < [email protected]; [email protected]++ ) getitem @bought_nameid[[email protected]], @bought_quantity[[email protected]]; end; }
    1 point
  49. left side => npc:portal_event right side => start
    1 point
  50. I have ever seen similar topic in Ea forums and use ~AnnieRuru~'s code battle.c in function int battle_check_target find //Alliance state takes precedence over enemy one. else if( state&BCT_ENEMY && strip_enemy && state&(BCT_SELF|BCT_PARTY|BCT_GUILD) ) state&=~BCT_ENEMY; and add after if ( map_getcell( src->m, src->x, src->y, CELL_CHKBASILICA ) || map_getcell( target->m, target->x, target->y, CELL_CHKBASILICA ) || map_getcell( s_bl->m, s_bl->x, s_bl->y, CELL_CHKBASILICA ) || map_getcell( t_bl->m, t_bl->x, t_bl->y, CELL_CHKBASILICA ) ) state &= ~BCT_ENEMY;
    1 point
×
×
  • Create New...

Important Information

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