Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 01/19/22 in all areas

  1. @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
  2. 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.
    2 points
  3. Version 1.0.5

    2300 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 : 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
    1 point
  4. Hi, I've uploaded a new version but it needs to be approved. There was a crash when someone was afk, sorry about that. I've added a ranking system to display on your website. @bginfo is indicating whether someone is in the queue of a BG that hasn't started, or if a BG has started with amount of players and time left. The Extended Battlegrounds are up on my server so it will be easier to discover/fix any issues. @Tdi123 you need to update your client, I responded in your other post.
    1 point
  5. 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 .@query$ = "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; .@nb = query_sql(.@query$, .@cid, .@name$, .@guild_id, .@class, .@sex$, .@hair, .@hair_color, .@clothes_color, .@body, .@head_top, .@head_mid, .@head_bottom, .@robe, .@kills, .@streaks, .@deaths); if (.fix_custom_sprite) { for (.@i = 0; .@i < .@nb; ++.@i) { setunitdata .statue[.@i +1], UNPC_HEADTOP, 0; setunitdata .statue[.@i +1], UNPC_HEADMIDDLE, 0; setunitdata .statue[.@i +1], UNPC_HEADBOTTOM, 0; setunitdata .statue[.@i +1], UNPC_ROBE, 0; } } for (.@i = 0; .@i < .@nb; ++.@i) { setunitdata .statue[.@i +1], UNPC_CLASS, .@class[.@i]; setunitdata .statue[.@i +1], UNPC_SEX, (.@sex$[.@i] == "F")? SEX_FEMALE:SEX_MALE; setunitdata .statue[.@i +1], UNPC_HAIRSTYLE, .@hair[.@i]; setunitdata .statue[.@i +1], UNPC_HAIRCOLOR, .@hair_color[.@i]; setunitdata .statue[.@i +1], UNPC_CLOTHCOLOR, .@clothes_color[.@i]; setunitdata .statue[.@i +1], UNPC_BODY2, .@body[.@i]; setunitdata .statue[.@i +1], UNPC_HEADTOP, .@head_top[.@i]; setunitdata .statue[.@i +1], UNPC_HEADMIDDLE, .@head_mid[.@i]; setunitdata .statue[.@i +1], UNPC_HEADBOTTOM, .@head_bottom[.@i]; setunitdata .statue[.@i +1], UNPC_ROBE, .@robe[.@i]; setnpcdisplay "pvp_ladder_statue#"+(.@i +1), .@name$[.@i]; .statue_name$[.@i +1] = .@name$[.@i]; .statue_guild$[.@i +1] = getguildname(.@guild_id[.@i]); .statue_kills[.@i +1] = .@kills[.@i]; .statue_streaks[.@i +1] = .@streaks[.@i]; .statue_deaths[.@i +1] = .@deaths[.@i]; } for (.@i = .@nb; .@i < .showstatue; ++.@i) setunitdata .statue[.@i +1], UNPC_CLASS, HIDDEN_WARP_NPC; initnpctimer; end; // script start. OnPCKillEvent: if (getgmlevel() >= .gmnokill) end; .@map$ = strcharinfo(3); if (.maptrigger$ != "all") { while (.@i < .maptriggersize && .@map$ != .maptrigger$[.@i]) ++.@i; if (.@i == .maptriggersize) end; } .@killername$ = strcharinfo(0); .@killeraid = getcharid(3); .@killercid = getcharid(0); .@killerguildid = getcharid(2); .@killerbaselevel = BaseLevel; attachrid killedrid; .@victimname$ = strcharinfo(0); .@victimaid = getcharid(3); .@victimcid = getcharid(0); .@victimguildid = getcharid(2); .@victimbaselevel = BaseLevel; if (.@killeraid != .@victimaid && (.msg_die || .msg_kill)) { if (.msg_die) message .@victimname$, "You have been killed by "+ .@killername$; if (.msg_kill) message .@killername$, "You just killed "+ .@victimname$; } if (@PlayersKilledStreak >= .holyshit) .@streakname$ = "Beyond Godlike"; else if (@PlayersKilledStreak >= .godlike) .@streakname$ = "Godlike"; else if (@PlayersKilledStreak >= .monsterkill) .@streakname$ = "Monster Kill"; else if (@PlayersKilledStreak >= .wickedsick) .@streakname$ = "Wicked Sick"; else if (@PlayersKilledStreak >= .unstoppable) .@streakname$ = "Unstoppable"; else if (@PlayersKilledStreak >= .megakill) .@streakname$ = "Mega-kill"; else if (@PlayersKilledStreak >= .dominating) .@streakname$ = "Dominating"; else if (@PlayersKilledStreak >= .killingspree) .@streakname$ = "Killing Spree"; if (@PlayersKilledStreak >= .killingspree && .@killeraid == .@victimaid) announce sprintf("%s has ended %s own %s[%d] streak %s", .@killername$, (Sex)?"him":"her", .@streakname$, @PlayersKilledStreak, (.mapname_announcement)?("at "+ .@map$):""), bc_blue|.dota_bc_flag; else if (@PlayersKilledStreak >= .killingspree) announce sprintf("%s has ended %s's %s[%d] streak %s", .@killername$, .@victimname$, .@streakname$, @PlayersKilledStreak, (.mapname_announcement)?("at "+ .@map$):""), bc_blue|.dota_bc_flag; else if (.killannounce && .@killeraid != .@victimaid) announce sprintf("%s has pawned %s's head %s", .@killername$, .@victimname$, (.mapname_announcement)?("at "+ .@map$):""), bc_blue|.dota_bc_flag; @PlayersKilledStreak = 0; ++@dota_sql_deaths; @dota_multikills = 0; if (.@victimguildid) .guild_current_ownage[.@victimguildid] = 0; if (.@killeraid == .@victimaid || .@victimbaselevel < .lvltokill || (.minlvlrange && .@victimbaselevel + .minlvlrange < .@killerbaselevel)) { query_sql sprintf("replace into pvpladder values (%d, '%s', %d, %d, %d, from_unixtime(%d))", .@victimcid, escape_sql(.@victimname$), @dota_sql_streaks, @dota_sql_kills, @dota_sql_deaths, @dota_sql_streaktime); if (.@victimguildid && .guild_highest_ownage[.@victimguildid]) query_sql sprintf("replace into ownladder values (%d, '%s', %d, %d, from_unixtime(%d))", .@victimguildid, escape_sql(getguildname(.@victimguildid)), .guild_current_ownage[.@victimguildid], .guild_highest_ownage[.@victimguildid], .guild_ownage_time[.@victimguildid]); end; } .@victim_kills = @dota_sql_kills; .@victim_deaths = @dota_sql_deaths; .@victim_streaks = @dota_sql_streaks; .@victim_streaktime = @dota_sql_streaktime; attachrid killerrid; if (.counttopunish) { if (@sitkillminute != gettime(DT_MINUTE)) { deletearray @sitkill; @sitkillminute = gettime(DT_MINUTE); } ++@sitkill[.@victimaid]; if (@sitkill[.@victimaid] >= .counttopunish) { warp "SavePoint", 0,0; announce .@killername$ +" , Stop killing "+ .@victimname$ + " !!!", bc_all; debugmes .@killername$ +" is sit-killing "+ .@victimname$ +" for "+ @sitkill[.@victimaid] + " times"; logmes "is sit-killing "+ .@victimname$ +" for "+ @sitkill[.@victimaid] +" 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))", .@killercid, escape_sql(.@killername$), @dota_sql_streaks, @dota_sql_kills, @dota_sql_deaths, @dota_sql_streaktime, .@victimcid, escape_sql(.@victimname$), .@victim_streaks, .@victim_kills, .@victim_deaths, .@victim_streaktime); if (.@killerguildid) { if (.guild_current_ownage[.@killerguildid] == .guild_highest_ownage[.@killerguildid]) { .guild_highest_ownage[.@killerguildid] = .guild_highest_ownage[.@killerguildid] +1 - .counttopunish; .guild_ownage_time[.@killerguildid] = gettimetick(2); } .guild_current_ownage[.@killerguildid] = .guild_current_ownage[.@killerguildid] +1 - .counttopunish; if (.guild_current_ownage[.@killerguildid] < 0) .guild_current_ownage[.@killerguildid] = 0; if (.guild_highest_ownage[.@killerguildid] < 0) .guild_highest_ownage[.@killerguildid] = 0; if (.@victimguildid && .guild_highest_ownage[.@victimguildid]) query_sql sprintf("replace into ownladder values (%d, '%s', %d, %d, from_unixtime(%d)), (%d, '%s', %d, %d, from_unixtime(%d))", .@killerguildid, escape_sql(getguildname(.@killerguildid)), .guild_current_ownage[.@killerguildid], .guild_highest_ownage[.@killerguildid], .guild_ownage_time[.@killerguildid], .@victimguildid, escape_sql(getguildname(.@victimguildid)), .guild_current_ownage[.@victimguildid], .guild_highest_ownage[.@victimguildid], .guild_ownage_time[.@victimguildid]); else query_sql sprintf("replace into ownladder values (%d, '%s', %d, %d, from_unixtime(%d))", .@killerguildid, escape_sql(getguildname(.@killerguildid)), .guild_current_ownage[.@killerguildid], .guild_highest_ownage[.@killerguildid], .guild_ownage_time[.@killerguildid]); } else if (.@victimguildid && .guild_highest_ownage[.@victimguildid]) query_sql sprintf("replace into ownladder values (%d, '%s', %d, %d, from_unixtime(%d))", .@victimguildid, escape_sql(getguildname(.@victimguildid)), .guild_current_ownage[.@victimguildid], .guild_highest_ownage[.@victimguildid], .guild_ownage_time[.@victimguildid]); end; } } ++@PlayersKilledStreak; ++@dota_sql_kills; if (@PlayersKilledStreak > @dota_sql_streaks) { @dota_sql_streaks = @PlayersKilledStreak; @dota_sql_streaktime = gettimetick(2); } if (@PlayersKilledStreak == .killingspree) setarray .@streakname$, "killingspree.wav", "is on a KILLING SPREE", "!"; else if (@PlayersKilledStreak == .dominating) setarray .@streakname$, "dominating.wav", "is DOMINATING", "!"; else if (@PlayersKilledStreak == .megakill) setarray .@streakname$, "megakill.wav", "has a MEGA KILL", "!"; else if (@PlayersKilledStreak == .unstoppable) setarray .@streakname$, "unstoppable.wav", "is UNSTOPPABLE", "!!"; else if (@PlayersKilledStreak == .wickedsick) setarray .@streakname$, "wickedsick.wav", "is WICKED SICK", "!!"; else if (@PlayersKilledStreak == .monsterkill) setarray .@streakname$, "monsterkill.wav", "has a MONSTER KILL", "!!"; else if (@PlayersKilledStreak == .godlike) setarray .@streakname$, "godlike.wav", "is GODLIKE", "!!!"; else if (@PlayersKilledStreak >= .holyshit && ((@PlayersKilledStreak - .holyshit) % .continue == 0)) setarray .@streakname$,"holyshit.wav", "is BEYOND GODLIKE",". Someone KILL "+( (Sex)?"HIM":"HER" ) +"!!!!!!"; if (getstrlen(.@streakname$[1])) { announce sprintf("%s %s[%d] %s%s", .@killername$, .@streakname$[1], @PlayersKilledStreak, (.mapname_announcement)?("at "+ .@map$):"", .@streakname$[2]), bc_blue|.dota_bc_flag; if (.sound == 1) soundeffectall .@streakname$[0], 0, .@map$; else if (.sound == 2) soundeffectall .@streakname$[0], 0; else if (.sound == 3) soundeffect .@streakname$[0], 0; } ++@dota_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))", .@killercid, escape_sql(.@killername$), @dota_sql_streaks, @dota_sql_kills, @dota_sql_deaths, @dota_sql_streaktime, .@victimcid, escape_sql(.@victimname$), .@victim_streaks, .@victim_kills, .@victim_deaths, .@victim_streaktime); if (.@killerguildid && .@killerguildid != .@victimguildid) { ++.guild_current_ownage[.@killerguildid]; if (.guild_current_ownage[.@killerguildid] > .guild_highest_ownage[.@killerguildid] ) { .guild_highest_ownage[.@killerguildid] = .guild_current_ownage[.@killerguildid]; .guild_ownage_time[.@killerguildid] = gettimetick(2); } if (.@victimguildid && .guild_highest_ownage[.@victimguildid]) query_sql sprintf("replace into ownladder values (%d, '%s', %d, %d, from_unixtime(%d)), (%d, '%s', %d, %d, from_unixtime(%d))", .@killerguildid, escape_sql(getguildname(.@killerguildid)), .guild_current_ownage[.@killerguildid], .guild_highest_ownage[.@killerguildid], .guild_ownage_time[.@killerguildid], .@victimguildid, escape_sql(getguildname(.@victimguildid)), .guild_current_ownage[.@victimguildid], .guild_highest_ownage[.@victimguildid], .guild_ownage_time[.@victimguildid]); else query_sql sprintf("replace into ownladder values (%d, '%s', %d, %d, from_unixtime(%d))", .@killerguildid, escape_sql(getguildname(.@killerguildid)), .guild_current_ownage[.@killerguildid], .guild_highest_ownage[.@killerguildid], .guild_ownage_time[.@killerguildid]); } else if (.@victimguildid && .guild_highest_ownage[.@victimguildid]) query_sql sprintf("replace into ownladder values (%d, '%s', %d, %d, from_unixtime(%d))", .@victimguildid, escape_sql(getguildname(.@victimguildid)), .guild_current_ownage[.@victimguildid], .guild_highest_ownage[.@victimguildid], .guild_ownage_time[.@victimguildid]); .@dota_multikills = @dota_multikills; sleep 1500; if (.@killerguildid && .@killerguildid != .@victimguildid && .guild_current_ownage[.@killerguildid] >= .owned && ((.guild_current_ownage[.@killerguildid] - .owned) % .owncontinue == 0)) { if ( .dota_bc_flag ) mapannounce .@map$, "The guild ["+ getguildname(.@killerguildid) +"] is OWNING["+ .guild_current_ownage[.@killerguildid] +"] !!!", bc_blue; else announce "The guild ["+ getguildname(.@killerguildid) +"] is OWNING["+ .guild_current_ownage[.@killerguildid] +"] !!!", bc_blue; if ( .sound == 1 ) soundeffectall "ownage.wav",0,.@map$; else if ( .sound == 2 ) soundeffectall "ownage.wav",0; else if ( .sound == 3 && attachrid(.@killeraid) ) soundeffect "ownage.wav",0; } sleep 1250; if (!attachrid(.@killeraid)) end; if (.@dota_multikills == 2) { if (.dota_bc_flag) mapannounce .@map$, .@killername$ +" 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, .@map$; else if (.sound == 2) soundeffectall "doublekill.wav", 0; else if (.sound == 3) soundeffect "doublekill.wav", 0; } else if (.@dota_multikills == 3) { if (.dota_bc_flag) mapannounce .@map$, .@killername$ +" 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, .@map$; else if (.sound == 2) soundeffectall "triplekill.wav", 0; else if (.sound == 3) soundeffect "triplekill.wav", 0; } else if (.@dota_multikills == 4) { if (.dota_bc_flag) mapannounce .@map$, .@killername$ +" 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, .@map$; else if (.sound == 2) soundeffectall "ultrakill.wav", 0; else if (.sound == 3) soundeffect "ultrakill.wav", 0; } else if (.@dota_multikills >= 5) { if (.dota_bc_flag) mapannounce .@map$, .@killername$ +" is on a Rampage !!!", bc_blue; else announce strcharinfo(0) +" is on a Rampage !!!", bc_blue; if (.sound == 1) soundeffectall "rampage.wav", 0, .@map$; 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 (!@dota_sql_kills && !@dota_sql_deaths) { if (.maptrigger$ != "all") { .@map$ = strcharinfo(3); while (.@i < .maptriggersize && .@map$ != .maptrigger$[.@i]) ++.@i; if (.@i == .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; } .@guildid = getcharid(2); if (.@guildid && !.guild_highest_ownage[.@guildid]) { query_sql "select currentown, highestown, unix_timestamp(owntime) from ownladder where guild_id = "+ .@guildid, .@c, .@h, .@t; .guild_current_ownage[.@guildid] = .@c; .guild_highest_ownage[.@guildid] = .@h; .guild_ownage_time[.@guildid] = .@t; } end; } prontera,180,194,3 script PvP-StatsViewer 4_GEFFEN_11,{ .@npcname$ = strnpcinfo(0); while (true) { mes "["+ .@npcname$ +"]"; mes "Hello "+ strcharinfo(0) +"..."; mes "If you want to I can show you your PVP stats."; next; mes "["+ .@npcname$ +"]"; switch (select( "Most Kills", "Highest Streak", "Longest Ownage", "Own Information", "Explanation", (getgmlevel() >= 99 ? "^FF0000[GM] Reset Ranking^000000" : "") )) { case 1: .@nb = query_sql("select name, kills, deaths from pvpladder order by kills desc limit "+ getvariableofnpc(.showtotal, "DOTAPVP"), .@name$, .@kills, .@deaths); if (!.@nb) { mes "The ladder currently is empty."; next; } for (.@j = 0; .@j < .@nb; .@j += getvariableofnpc(.showpage,"DOTAPVP")) { for (.@i = .@j; .@i < (getvariableofnpc(.showpage,"DOTAPVP") + .@j) && .@i < .@nb; ++.@i) mes "^996600"+ (.@i+1) +": ^006699"+ .@name$[.@i] +" ^00AA00["+ .@kills[.@i] +"] ^FF0000<"+ .@deaths[.@i] +">^000000"; next; } break; case 2: .@nb = 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"), .@name$, .@streak, .@time$); if (!.@nb) { mes "The ladder currently is empty."; next; } for (.@j = 0; .@j < .@nb; .@j += getvariableofnpc(.showpage,"DOTAPVP") ) { for ( .@i = .@j; .@i < (getvariableofnpc(.showpage,"DOTAPVP") + .@j) && .@i < .@nb; ++.@i) { mes "^996600"+ (.@i+1) +": ^006699"+ .@name$[.@i] +" ^70AC11{"+ .@streak[.@i] +"} ^000000on :"; mes " ^EE8800"+ .@time$[.@i] +"^000000"; } next; } break; case 3: .@nb = 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"), .@name$, .@owned, .@time$); if (!.@nb) { mes "The ladder currently is empty."; next; } for (.@j = 0; .@j < .@nb; .@j += getvariableofnpc(.showpage,"DOTAPVP")) { for (.@i = .@j; .@i < (getvariableofnpc(.showpage,"DOTAPVP") + .@j) && .@i < .@nb; ++.@i ) { mes "^996600"+ (.@i+1) +": ^006699"+ .@name$[.@i] +" ^00AAAA("+ .@owned[.@i] +") ^000000on :"; mes " ^EE8800"+ .@time$[.@i] +"^000000"; } next; } break; case 4: if (!@dota_sql_kills && !@dota_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, .@time1$; else query_sql "select date_format(from_unixtime("+ @dota_sql_streaktime +"),'%a %e/%c/%y %r')", .@time1$; if (!@dota_sql_kills && !@dota_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"+ .@time1$ +"^000000"; } } next; .@guildid = getcharid(2); if (.@guildid) { if (!getvariableofnpc(.guild_ownage_time[.@guildid], "DOTAPVP")) { query_sql "select currentown, highestown, unix_timestamp(owntime), date_format(owntime,'%a %e/%c/%y %r') from ownladder where guild_id = "+ .@guildid, .@c, .@h, .@t, .@time2$; set getvariableofnpc(.guild_current_ownage[.@guildid], "DOTAPVP"), .@c; set getvariableofnpc(.guild_highest_ownage[.@guildid], "DOTAPVP"),.@h; set getvariableofnpc(.guild_ownage_time[.@guildid], "DOTAPVP"), .@t; } else query_sql "select date_format( from_unixtime("+ getvariableofnpc(.guild_ownage_time[.@guildid], "DOTAPVP") +"),'%a %e/%c/%y %r')", .@time2$; mes "["+ .@npcname$ +"]"; if (!getvariableofnpc(.guild_ownage_time[.@guildid], "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[.@guildid], "DOTAPVP") +")^000000"; mes "Longest Ownage was ^00AAAA("+ getvariableofnpc(.guild_highest_ownage[.@guildid], "DOTAPVP") + ")^000000 on :"; mes " ^EE8800"+ .@time2$ +"^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 "["+ .@npcname$ +"]"; 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 "["+ .@npcname$ +"]"; 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 "["+ .@npcname$ +"]"; 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 "["+ .@npcname$ +"]"; 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 "["+ .@npcname$ +"]"; 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,{ .@id = getelementofarray(getvariableofnpc(.npcgid, "DOTAPVP"), getnpcid(0)); mes "^996600[TOP "+ .@id +"]"; mes "^006699Name : "+ getelementofarray(getvariableofnpc(.statue_name$, "DOTAPVP"), .@id); .@guildname$ = getelementofarray(getvariableofnpc(.statue_guild$, "DOTAPVP"), .@id); mes "^00AAAAGuild : "+((.@guildname$ == "null")? "^AAAAAANone": .@guildname$); mes "^00AA00Total Kills : ["+ getelementofarray(getvariableofnpc(.statue_kills, "DOTAPVP"), .@id) +"]"; mes "^70AC11Highest Streaks : ["+ getelementofarray(getvariableofnpc(.statue_streaks, "DOTAPVP"), .@id) +"]"; mes "^FF0000Deaths : <"+ getelementofarray(getvariableofnpc(.statue_deaths, "DOTAPVP"), .@id) +">"; close; OnInit: .@id = strnpcinfo(2); set getvariableofnpc(.statue[.@id], "DOTAPVP"), getnpcid(0); set getvariableofnpc(.npcgid[getnpcid(0)], "DOTAPVP"), .@id; 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
  6. View File Glast Heim Challenge Mode[ Items Only ] the content of this files are ONLY the ITEMS not the instance not the mobs just the ITEMS and ENCHANTS, i already made a PR but i'll also post here while it isn't merge https://github.com/haurenburu/ragnarok-content/blob/master/rathena/Old_Glast_Heim_Challenge_Mode.txt Submitter HaureN Submitted 06/08/2020 Category Games, Events, Quests Video Content Author HaureN - Gravity  
    1 point
  7. Currently untested you'll have to let me know if somethings up. At this point I'm just compiling all of my edits into this script because many people are asking for it. //===== Hourly Points Script ========================================= //===== By: ========================================================== //= GorthexTiger modified by Nibi //===== Current Version: ============================================= //= 1.4.1 //===== Compatible With: ============================================= //= Any eAthena Version //===== Description: ================================================= //= Get Points every successful hours of gameplay, you cannot get //= the points even if you miss a second or a minute. A player will //= get a very big bonus if they played 3 hours consecutively //= or without logging out of the game. If the player is vending //= the script will then stop. //===== Additional Comments: ========================================= //= You can modify the script to your liking. //= The default points is Kafrapoints change it anyway if you like. //= 1.1 = Check Chatting too //= 1.2 = 5 Minute Idle Check & @at/@autotrade check. //= 1.3 = Corrected the current balance line on 12 Hours Consecutive //= 1.4 = Added command to check remaining time and updated idle check. (Skorm) //= 1.4.1 = Modified the msgs to display according to .timer. (Skorm) //==================================================================== - script hourlypoints -1,{ OnPointGet: //Check for idle. while(checkvending() >= 1 || checkchatting() == 1 || checkidle() >= .idle) { if( .@mes$ == "" ) { dispbottom set( .@mes$, "The hourly points event stopped because you were vending, chatting, or idle!" ); set @hourly_points_timer, 0; } sleep2 .delay; } @consecutive_timer++; .@time_string$ = Time2Str( @consecutive_timer * ( .timer / 1000 ) ); dispbottom "You received "+.points+" Kafrapoint(s) by staying ingame for "+.@time_string$+"."; #CASHPOINTS = #CASHPOINTS + .points; dispbottom "Current Balance = "+#CASHPOINTS+" Kafrapoints"; @consecutive_bonus++; //Check for consecutive timer. if(@consecutive_bonus == .cdelay) { @consecutive_bonus = 0; #CASHPOINTS = #CASHPOINTS + .cpoints; dispbottom "You receive a bonus "+.cpoints+" Kafrapoint(s) by playing for "+.@time_string$+" consecutively!!!"; dispbottom "Current Balance = "+#CASHPOINTS+" Kafrapoint(s)"; } OnPCLoginEvent: addtimer .timer,"hourlypoints::OnPointGet"; @hourly_points_timer = gettimetick(2) + ( .timer / 1000 ); end; OnCmdHour: message strcharinfo(0),@hourly_points_timer ? Time2Str( @hourly_points_timer )+" remaining before you get your Hourly Reward(s).":"Something went wrong or you're considered idle at the moment, try relogging!"; end; OnInit: bindatcmd "ctr","hourlypoints::OnCmdHour"; //@ctr to view time till next point. .timer = 1000*60*60; //Timer in milliseconds. ( Default: 1000*60*60 [ = 1 Hour ] ) .cdelay = 3; //Delay before receiving the consecutive bonus. ( Default: 3 [ { ~ 3 Hours } *Using default timer ] ) .cpoints = 10; //Points gained for consecutive time online. ( Default: 10 ) .points = 1; //Normal points gained. ( Default: 1 ) .delay = 1000; //Delay for idle re-check check. ( Default: 1000 [ = 1 Second ] ) .idle = 60*5; //Player is idle after not moving for this many seconds. ( Default: 60*5 [ = 5 Minutes ] ) } - script check -1,{ OnInit: bindatcmd "check",strnpcinfo(3)+"::OnCheck"; end; OnCheck: dispbottom "You have " +#CASHPOINTS+ " cash points."; end; }
    1 point
×
×
  • Create New...