Jump to content

Scarlet Butterfly

Members
  • Posts

    62
  • Joined

  • Last visited

Everything posted by Scarlet Butterfly

  1. 1. I believe it is the latest Quest Shop from Euphy's collection. 2. I'm using rAthena SVN r12761 Client: 2013-08-07 Pre-Renewal 3. As far as I'm aware, no there's no error on the map server either.
  2. Whenever I try to take on one item from the Quest Shop, it doesn't show me what the requirements are (see screenshot below): Requirements Window: Step 1: Step 2: Script: Credits to: Euphy - Quest Shop //===== rAthena Script ======================================= //= Euphy's Quest Shop //===== By: ================================================== //= Euphy //===== Current Version: ===================================== //= 1.6c //===== Compatible With: ===================================== //= rAthena Project //===== Description: ========================================= //= A dynamic quest shop based on Lunar's, with easier config. //= Includes support for multiple shops & cashpoints. //= Item Preview script by ToastOfDoom. //===== Additional Comments: ================================= //= 1.0 Initial script. //= 1.2 Added category support. //= 1.3 More options and fixes. //= 1.4 Added debug settings. //= 1.5 Replaced categories with shop IDs. //= 1.6 Added support for purchasing stackables. //= 1.6a Added support for previewing costumes and robes. //= 1.6b Added 'disable_items' command. //= 1.6c Replaced function 'A_An' with "F_InsertArticle". //============================================================ // Shop NPCs -- supplying no argument displays entire menu. // callfunc "qshop"{,<shop ID>{,<shop ID>{,...}}}; //============================================================ payoo,75,122,6 script Rewards 71,{ callfunc "qshop"; } // Script Core //============================================================ - script quest_shop -1,{ function Add; function Chk; function Slot; OnInit: freeloop(1); // ----------------------------------------------------------- // Basic shop settings. // ----------------------------------------------------------- set .Announce,1; // Announce quest completion? (1: yes / 0: no) set .ShowSlot,1; // Show item slots? (2: all equipment / 1: if slots > 0 / 0: never) set .ShowID,0; // Show item IDs? (1: yes / 0: no) set .ShowZeny,0; // Show Zeny cost, if any? (1: yes / 0: no) set .MaxStack,100; // Max number of quest items purchased at one time. // ----------------------------------------------------------- // Points variable -- optional quest requirement. // setarray .Points$[0],"<variable name>","<display name>"; // ----------------------------------------------------------- setarray .Points$[0],"#CASHPOINTS","Cash Points"; // ----------------------------------------------------------- // Shop IDs -- to add shops, copy dummy data at bottom of file. // setarray .Shops$[1],"<Shop 1>","<Shop 2>"{,...}; // ----------------------------------------------------------- setarray .Shops$[1],"Headgears","Weapons","Other"; // ----------------------------------------------------------- // Quest items -- do NOT use a reward item more than once! // Add(<shop ID>,<reward ID>,<reward amount>, // <Zeny cost>,<point cost>, // <required item ID>,<required item amount>{,...}); // ----------------------------------------------------------- Add(1,5022,1,0,0,7086,1,969,10,999,40,1003,50,984,2); Add(1,5032,1,0,0,1059,250,2221,1,2227,1,7063,600); Add(1,5027,1,0,0,2252,1,1036,400,7001,50,4052,1); Add(1,5045,1,0,0,2252,1,1054,450,943,1200); Add(2,1224,1,0,0,7297,30,969,10,999,50,714,10); Add(2,1225,1,0,0,7292,30,969,10,999,50,714,10); Add(3,531,1,3,0,512,1,713,1); Add(3,532,1,3,0,513,1,713,1); Add(3,533,1,3,0,514,1,713,1); Add(3,534,1,3,0,515,1,713,1); // ----------------------------------------------------------- freeloop(0); set .menu$,""; for(set .@i,1; .@i<=getarraysize(.Shops$); set .@i,.@i+1) { set .menu$, .menu$+.Shops$[.@i]+":"; npcshopdelitem "qshop"+.@i,909; } end; OnMenu: set .@size, getarraysize(@i); if (!.@size) set @shop_index, select(.menu$); else if (.@size == 1) set @shop_index, @i[0]; else { for(set .@j,0; .@j<.@size; set .@j,.@j+1) set .@menu$, .@menu$+.Shops$[@i[.@j]]+":"; set @shop_index, @i[select(.@menu$)-1]; } deletearray @i[0],getarraysize(@i); if (.Shops$[@shop_index] == "") { message strcharinfo(0),"An error has occurred."; end; } dispbottom "Select one item at a time."; callshop "qshop"+@shop_index,1; npcshopattach "qshop"+@shop_index; end; OnBuyItem: // .@q[] : RewardID, BoughtAmt, RewardAmt, BaseAmt, ReqZeny, ReqPts, { ReqItem, ReqAmt, ... } setarray .@q[0],@bought_nameid[0],((@bought_quantity[0] > .MaxStack)?.MaxStack:@bought_quantity[0]); copyarray .@q[3],getd(".q_"+@shop_index+"_"+.@q[0]+"[0]"),getarraysize(getd(".q_"+@shop_index+"_"+.@q[0])); set .@q[2],.@q[1]*.@q[3]; if (!.@q[2] || .@q[2] > 30000) { message strcharinfo(0),"You can't purchase that many "+getitemname(.@q[0])+"."; end; } mes "[Quest Shop]"; mes "Reward: ^0055FF"+((.@q[2] > 1)?.@q[2]+"x ":"")+Slot(.@q[0])+"^000000"; mes "Requirements:"; disable_items; if (.@q[4]) mes " > "+Chk(Zeny,.@q[4]*.@q[1])+(.@q[4]*.@q[1])+" Zeny^000000"; if (.@q[5]) mes " > "+Chk(getd(.Points$[0]),.@q[5]*.@q[1])+(.@q[5]*.@q[1])+" "+.Points$[1]+" ("+getd(.Points$[0])+"/"+(.@q[5]*.@q[1])+")^000000"; if (.@q[6]) for(set .@i,6; .@i<getarraysize(.@q); set .@i,.@i+2) mes " > "+Chk(countitem(.@q[.@i]),.@q[.@i+1]*.@q[1])+((.ShowID)?"{"+.@q[.@i]+"} ":"")+Slot(.@q[.@i])+" ("+countitem(.@q[.@i])+"/"+(.@q[.@i+1]*.@q[1])+")^000000"; next; setarray @qe[1], getiteminfo(.@q[0],5), getiteminfo(.@q[0],11); if (@qe[2] > 0 && ((@qe[1] & 1) || (@qe[1] & 256) || (@qe[1] & 512) || (@qe[1] & 1024) || (@qe[1] & 2048) || (@qe[1] & 4096) || (@qe[1] & 4) || (@qe[1] & 8192))) set .@preview,1; addtimer 1000, strnpcinfo(0)+"::OnEnd"; while(1) { switch(select(" ~ Purchase ^0055FF"+getitemname(.@q[0])+"^000000:"+((.@preview && !@qe[7])?" ~ Preview...":"")+": ~ ^777777Cancel^000000")) { case 1: if (@qe[0]) { mes "[Quest Shop]"; mes "You're missing one or more quest requirements."; close; } if (!checkweight(.@q[0],.@q[2])) { mes "[Quest Shop]"; mes "^FF0000You need "+(((.@q[2]*getiteminfo(.@q[0],6))+Weight-MaxWeight)/10)+" additional weight capacity to complete this trade.^000000"; close; } if (.@q[4]) set Zeny, Zeny-(.@q[4]*.@q[1]); if (.@q[5]) setd .Points$[0], getd(.Points$[0])-(.@q[5]*.@q[1]); if (.@q[6]) for(set .@i,6; .@i<getarraysize(.@q); set .@i,.@i+2) delitem .@q[.@i],.@q[.@i+1]*.@q[1]; getitem .@q[0],.@q[2]; if (.Announce) announce strcharinfo(0)+" has created "+((.@q[2] > 1)?.@q[2]+"x "+getitemname(.@q[0]):callfunc("F_InsertArticle",getitemname(.@q[0])))+"!",0; specialeffect2 EF_FLOWERLEAF; close; case 2: setarray @qe[3], getlook(LOOK_HEAD_BOTTOM), getlook(LOOK_HEAD_TOP), getlook(LOOK_HEAD_MID), getlook(LOOK_ROBE), 1; if ((@qe[1] & 1) || (@qe[1] & 4096)) changelook LOOK_HEAD_BOTTOM, @qe[2]; else if ((@qe[1] & 256) || (@qe[1] & 1024)) changelook LOOK_HEAD_TOP, @qe[2]; else if ((@qe[1] & 512) || (@qe[1] & 2048)) changelook LOOK_HEAD_MID, @qe[2]; else if ((@qe[1] & 4) || (@qe[1] & 8192)) changelook LOOK_ROBE, @qe[2]; break; case 3: close; } } OnEnd: if (@qe[7]) { changelook LOOK_HEAD_BOTTOM, @qe[3]; changelook LOOK_HEAD_TOP, @qe[4]; changelook LOOK_HEAD_MID, @qe[5]; changelook LOOK_ROBE, @qe[6]; } deletearray @qe[0],8; end; function Add { if (getitemname(getarg(1)) == "null") { debugmes "Quest reward #"+getarg(1)+" invalid (skipped)."; return; } setarray .@j[0],getarg(2),getarg(3),getarg(4); for(set .@i,5; .@i<getargcount(); set .@i,.@i+2) { if (getitemname(getarg(.@i)) == "null") { debugmes "Quest requirement #"+getarg(.@i)+" invalid (skipped)."; return; } else setarray .@j[.@i-2],getarg(.@i),getarg(.@i+1); } copyarray getd(".q_"+getarg(0)+"_"+getarg(1)+"[0]"),.@j[0],getarraysize(.@j); npcshopadditem "qshop"+getarg(0),getarg(1),((.ShowZeny)?getarg(3):0); return; } function Chk { if (getarg(0) < getarg(1)) { set @qe[0],1; return "^FF0000"; } else return "^00FF00"; } function Slot { set .@s$,getitemname(getarg(0)); switch(.ShowSlot) { case 1: if (!getitemslots(getarg(0))) return .@s$; case 2: if (getiteminfo(getarg(0),2) == 4 || getiteminfo(getarg(0),2) == 5) return .@s$+" ["+getitemslots(getarg(0))+"]"; default: return .@s$; } } } function script qshop { deletearray @i[0],getarraysize(@i); for(set .@i,0; .@i<getargcount(); set .@i,.@i+1) set @i[.@i],getarg(.@i); doevent "quest_shop::OnMenu"; end; } // Dummy shop data -- copy as needed. //============================================================ - shop qshop1 -1,909:-1 - shop qshop2 -1,909:-1 - shop qshop3 -1,909:-1 - shop qshop4 -1,909:-1 - shop qshop5 -1,909:-1 Any help would be appreciated! Thank you.
  3. Just thought that this is a simple question for scripters: How do I take out the chat bubble on top of this NPC? (see image below) PVP Warper Script Credits to: Zealock! //===== rAthena Script ======================================= //= Untitle Script //===== By: ================================================== //= Zealock! //===== Current Version: ===================================== //= 1.0 //===== Compatible With: ===================================== //= rAthena , eAthena //===== Description: ========================================= //= PVP Warper //============================================================ payoo,100,118,6 script PvP Warper 120,{ mes "[ PVP Warper ]"; mes "Do you have what it takes?!"; next; menu "Yes, I have a Hunger for Blood",PatayanNa,"No, Too Lazy to Kill",No; PatayanNa: mes "[ PvP Warper ]"; mes "You Made the Right Choice! GOODLUCK!"; next; mes "Let's Go!"; warp "guild_vs2",0,0; L_All: announce "[ PvP Warper ] Announcer: "+strcharinfo(0)+" has entered the Room ",0; close; No: mes "[ PvP Warper ]"; mes "Are you Scared?"; next; mes "Come Back Again, if you already have the Guts!"; close; //WAITING ROOM updates every 2.5 second OnInit: while(1) { delwaitingroom; waitingroom "PvP Warper ["+getmapusers("guild_vs2")+"]",0; sleep 2500; //2.5 seconds } end; } // Mapflags guild_vs2 mapflag nowarp guild_vs2 mapflag nowarpto guild_vs2 mapflag pvp on guild_vs2 mapflag noteleport guild_vs2 mapflag nosave SavePoint Also, is there a script that I can add to it, that gives the ability for characters to choose what PVP Map they want to join in? Thank you!
  4. I have a different script now that works with my fluxcp. So whoever gets the most kills achieves the Best Player title. But I'm wondering now if it's possible to have a script that would reward an item for this one? Full Credits to: ~AnnieRuru~ //===== eAthena Script ======================================================= //= PVP ladder script with dota announcement ( SQL only ) //===== By: ================================================================== //= ~AnnieRuru~ //===== Current Version: ===================================================== //= 2.9 //===== Compatible With: ===================================================== //= eAthena SQL 14279, with MySQL 5.1 //===== Description: ========================================================= //= PVP ladder store in SQL table //= plus anti-sit-killer feature //===== Topic ================================================================ //= http://www.eathena.ws/board/index.php?showtopic=177918 //===== Additional Comments: ================================================= //= still don't have modify value option, will be done ... in next year ... //============================================================================ // 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 guild_vs4 mapflag loadevent guild_vs5 mapflag loadevent - script DOTAPVP -1,{ OnInit: // Config set .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 set .announce, 0; // announce to : 0 - global, 1 - map set .announcemap, 1; // announce the map name in the announcement ? : 0 - off, 1 - on set .announcekill, 0; // announce who pawn who's head : 0 - off, 1 - on set .msg_die, 0; // show message who kill you when die : 0 - off, 1 - on set .msg_kill, 0; // show message you kill who when killed someone : 0 - off, 1 - on set .gmnokill, 0; // 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 set .killingspree, 3; set .dominating, 4; set .megakill, 5; set .unstoppable, 6; set .wickedsick, 7; set .monsterkill, 8; set .godlike, 9; set .holyshit, 10; set .continue, 1; // after beyond-godlike, every <this number> kills will make announcement again set .owned, 5; // how many times the party/guild has to kill to announce ownage set .owncontinue, 1; // after ownage, every <this number> party/guild cumulative kills will make ownage announce again set .min_gm_menu, 90; // minimum level of GM can use the GM menu on ladder npc set .showtotal, 20; // show the length of ladder. Note : Maximum value = 128 set .showpage, 10; // set the views per page. Note : Maximum value = 128 set .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 set .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 // 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 ) set .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 set .counttopunish, 0; // 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 set .minlvlrange, 0; // Config ends ------------------------------------------------------------------------------------------ // to prevent bug happen if ( .announce < 0 || .announce > 1 ) set .announce, 0; if ( .continue < 1 ) set .continue, 1; if ( .owncontinue < 1 ) set .owncontinue, 1; if ( .gmnokill <= 0 ) set .gmnokill, 100; if ( .lvltokill <= 1 ) set .lvltokill, 0; if ( .counttopunish <= 1 ) set .counttopunish, 0; set .maptriggersize, getarraysize(.maptrigger$); end; // script start. OnPCKillEvent: if ( getgmlevel() >= .gmnokill ) end; getmapxy .@map$, .@x, .@y, 0; if ( .maptrigger$ != "all" ) { for ( set .@i, 0; .@i < .maptriggersize; set .@i, .@i +1 ) { if ( .@map$ == .maptrigger$[.@i] ) break; } if ( .@i == .maptriggersize ) end; } attachrid killedrid; if ( killerrid != getcharid(3) && ( .msg_die || .msg_kill ) ) { if ( .msg_die ) message strcharinfo(0),"You have been killed by "+ rid2name(killerrid); if ( .msg_kill ) message rid2name(killerrid),"You just killed "+ strcharinfo(0); } if ( @PlayersKilledStreak >= .holyshit ) set .@streakname$,"Beyond Godlike"; else if ( @PlayersKilledStreak >= .godlike ) set .@streakname$,"Godlike"; else if ( @PlayersKilledStreak >= .monsterkill ) set .@streakname$,"Monster Kill"; else if ( @PlayersKilledStreak >= .wickedsick ) set .@streakname$,"Wicked Sick"; else if ( @PlayersKilledStreak >= .unstoppable ) set .@streakname$,"Unstoppable"; else if ( @PlayersKilledStreak >= .megakill ) set .@streakname$,"Mega-kill"; else if ( @PlayersKilledStreak >= .dominating ) set .@streakname$,"Dominating"; else if ( @PlayersKilledStreak >= .killingspree ) set .@streakname$,"Killing Spree"; if ( @PlayersKilledStreak >= .killingspree && killerrid == getcharid(3) ) announce strcharinfo(0) +" has ended "+( (sex)?"him":"her" )+" own "+ .@streakname$ +"["+ @PlayersKilledStreak +"] streak "+( (.announcemap)?("at "+ .@map$):""),16|.announce; else if ( @PlayersKilledStreak >= .killingspree ) announce rid2name(killerrid) +" has ended "+ strcharinfo(0) +"'s "+ .@streakname$ +"["+ @PlayersKilledStreak +"] streak "+( (.announcemap)?("at "+ .@map$):""),16|.announce; else if ( .announcekill && killerrid != getcharid(3) ) announce rid2name(killerrid) +" has pawned "+ strcharinfo(0) +"'s head "+( (.announcemap)?("at "+ .@map$):""),16|.announce; set @PlayersKilledStreak,0; set @dota_sql_deaths, @dota_sql_deaths +1; set @dota_multikills,0; query_sql "replace into pvpladder values ( "+ getcharid(0) +", '"+ escape_sql(strcharinfo(0)) +"', "+ @dota_sql_streaks +", "+ @dota_sql_kills +", "+ @dota_sql_deaths +", from_unixtime("+ @dota_sql_streaktime +") )"; set .@killed_gid, getcharid(2); if ( .@killed_gid ) { setd ".dota_sql_"+ .@killed_gid +"_c", 0; if ( getd(".dota_sql_"+ .@killed_gid +"_h") ) query_sql "replace into ownladder values ( "+ .@killed_gid +", '"+ escape_sql(getguildname(.@killed_gid)) +"', "+ getd(".dota_sql_"+ .@killed_gid +"_c") +", "+ getd(".dota_sql_"+ .@killed_gid +"_h") +", from_unixtime("+ getd(".dota_sql_"+ .@killed_gid +"_t") +") )"; } if ( killerrid == getcharid(3) || baselevel < .lvltokill ) end; if ( .minlvlrange ) set .@killedlvl, baselevel; attachrid killerrid; if ( .minlvlrange && .@killedlvl + .minlvlrange < baselevel ) end; if ( .counttopunish ) { if ( @sitkillminute != gettime(2) ) { deletearray @sitkillid, 128; deletearray @sitkilltimes, 128; set @sitkillminute, gettime(2); } set .@sitkillsize, getarraysize(@sitkillid); for ( set .@i,0; .@i < .@sitkillsize; set .@i, .@i +1 ) { if ( @sitkillid[.@i] != killedrid ) continue; else { set @sitkilltimes[.@i], @sitkilltimes[.@i] +1 ; if ( @sitkilltimes[.@i] >= .counttopunish ) { warp "SavePoint",0,0; announce strcharinfo(0) +" , Stop killing "+ rid2name(killedrid) + " !!!",0; debugmes strcharinfo(0) +" is sit-killing "+ rid2name(killedrid) +" for "+ @sitkilltimes[.@i] + " times"; logmes "is sit-killing "+ rid2name(killedrid) +" for "+ @sitkilltimes[.@i] +" times"; if ( @PlayersKilledStreak == @dota_sql_streaks ) { set @dota_sql_streaks, @dota_sql_streaks +1 - .counttopunish; set @dota_sql_streaktime, gettimetick(2); } set @PlayersKilledStreak, @PlayersKilledStreak +1 - .counttopunish; set @dota_sql_kills, @dota_sql_kills +1 - .counttopunish; query_sql "replace into pvpladder values ( "+ getcharid(0) +", '"+ escape_sql(strcharinfo(0)) +"', "+ @dota_sql_streaks +", "+ @dota_sql_kills +", "+ @dota_sql_deaths +", from_unixtime("+ @dota_sql_streaktime +") )"; set .@killer_gid, getcharid(2); if ( .@killer_gid ) { if ( getd(".dota_sql_"+ .@killer_gid +"_c") == getd(".dota_sql_"+ .@killer_gid +"_h") ) { setd ".dota_sql_"+ .@killer_gid +"_h", getd(".dota_sql_"+ .@killer_gid +"_h") +1 - .counttopunish; setd ".dota_sql_"+ .@killer_gid +"_t", gettimetick(2); } setd (".dota_sql_"+ .@killer_gid +"_c"), getd(".dota_sql_"+ .@killer_gid +"_c") +1 - .counttopunish; query_sql "replace into ownladder values ( "+ .@killer_gid +", '"+ escape_sql(getguildname(.@killer_gid)) +"', "+ getd(".dota_sql_"+ .@killer_gid +"_c") +", "+ getd(".dota_sql_"+ .@killer_gid +"_h") +", from_unixtime("+ getd(".dota_sql_"+ .@killer_gid +"_t") +") )"; } end; } break; } } if ( .@i == .@sitkillsize ) { set @sitkillid[.@i], killedrid; set @sitkilltimes[.@i], 1; } } set @PlayersKilledStreak, @PlayersKilledStreak +1 ; set @dota_sql_kills, @dota_sql_kills +1 ; if ( @PlayersKilledStreak > @dota_sql_streaks ) { set @dota_sql_streaks, @PlayersKilledStreak; set @dota_sql_streaktime, gettimetick(2); } query_sql "replace into pvpladder values ( "+ getcharid(0) +", '"+ escape_sql(strcharinfo(0)) +"', "+ @dota_sql_streaks +", "+ @dota_sql_kills +", "+ @dota_sql_deaths +", from_unixtime("+ @dota_sql_streaktime +") )"; 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 ( .@streakname$[1] != "" ) { announce strcharinfo(0) +" "+ .@streakname$[1] +"["+ @PlayersKilledStreak +"] "+( (.announcemap)?("at "+ .@map$):"") + .@streakname$[2],16|.announce; if ( .sound == 1 ) soundeffectall .@streakname$[0],0,.@map$; else if ( .sound == 2 ) soundeffectall .@streakname$[0],0; else if ( .sound == 3 ) soundeffect .@streakname$[0],0; } set @dota_multikills, @dota_multikills + 1; deltimer "DOTAPVP::OnStreakReset"; addtimer 18000,"DOTAPVP::OnStreakReset"; set .@killer_gid, getcharid(2); if ( .@killer_gid && .@killer_gid != .@killed_gid ) { setd ".dota_sql_"+ .@killer_gid +"_c", getd(".dota_sql_"+ .@killer_gid +"_c") +1 ; if ( getd(".dota_sql_"+ .@killer_gid +"_c") > getd(".dota_sql_"+ .@killer_gid +"_h") ) { setd ".dota_sql_"+ .@killer_gid +"_h", getd(".dota_sql_"+ .@killer_gid +"_c"); setd ".dota_sql_"+ .@killer_gid +"_t", gettimetick(2); } query_sql "replace into ownladder values ( "+ .@killer_gid +", '"+ escape_sql(getguildname(.@killer_gid)) +"', "+ getd(".dota_sql_"+ .@killer_gid +"_c") +", "+ getd(".dota_sql_"+ .@killer_gid +"_h") +", from_unixtime("+ getd(".dota_sql_"+ .@killer_gid +"_t") +") )"; } set .@dota_multikills, @dota_multikills; set .@origin, getcharid(3); sleep 1500; if ( .@killer_gid && .@killer_gid != .@killed_gid && getd(".dota_sql_"+ .@killer_gid +"_c") >= .owned && ( ( getd(".dota_sql_"+ .@killer_gid +"_c") - .owned ) % .owncontinue == 0 ) ) { if ( .announce ) mapannounce .@map$, "The guild ["+ getguildname(.@killer_gid) +"] is OWNING["+ getd(".dota_sql_"+ .@killer_gid +"_c") +"] !!!",16; else announce "The guild ["+ getguildname(.@killer_gid) +"] is OWNING["+ getd(".dota_sql_"+ .@killer_gid +"_c") +"] !!!",16; if ( .sound == 1 ) soundeffectall "ownage.wav",0,.@map$; else if ( .sound == 2 ) soundeffectall "ownage.wav",0; else if ( .sound == 3 && attachrid(.@origin) ) soundeffect "ownage.wav",0; } sleep 1250; if ( !attachrid(.@origin) ) end; if ( .@dota_multikills == 2 ) { if ( .announce ) mapannounce .@map$, strcharinfo(0) +" just got a Double Kill !",16; else announce strcharinfo(0) +" just got a Double Kill !",16; 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 ( .announce ) mapannounce .@map$, strcharinfo(0) +" just got a Triple Kill !!!",16; else announce strcharinfo(0) +" just got a Triple Kill !!!",16; 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 ( .announce ) mapannounce .@map$, strcharinfo(0) +" just got a Ultra Kill !!!",16; else announce strcharinfo(0) +" just got a Ultra Kill !!!",16; 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 ( .announce ) mapannounce .@map$, strcharinfo(0) +" is on a Rampage !!!",16; else announce strcharinfo(0) +" is on a Rampage !!!",16; 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: set @dota_multikills, 0; end; OnWhisperGlobal: if ( @spam_dotapvp + 3 >= gettimetick(2) ) // 3 seconds interval so player don spam this command end; set @spam_dotapvp, gettimetick(2); if ( @dota_sql_kills == 0 && @dota_sql_deaths == 0 ) 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; if ( @dota_sql_kills || @dota_sql_deaths ) { dispbottom "Your current Streak : "+ @PlayersKilledStreak; dispbottom "Your total Kills : "+ @dota_sql_kills; dispbottom "Your total Deaths : "+ @dota_sql_deaths; dispbottom "Your highest Streak : "+ @dota_sql_streaks; query_sql "select date_format( from_unixtime("+ @dota_sql_streaktime +"),'%a %e/%c/%y %r')", .@time1$; dispbottom "Your highest Streak on : "+ .@time1$; } else dispbottom "You are not in the pvp ladder yet."; if ( getcharid(2) ) { if ( getd(".dota_sql_"+ getcharid(2) +"_h") == 0 ) { query_sql "select currentown, highestown, unix_timestamp(owntime) from ownladder where guild_id = "+ getcharid(2), .@c, .@h, .@t; setd ".dota_sql_"+ getcharid(2) +"_c", .@c; setd ".dota_sql_"+ getcharid(2) +"_h", .@h; setd ".dota_sql_"+ getcharid(2) +"_t", .@t; } if ( getd(".dota_sql_"+ getcharid(2) +"_h") ) { dispbottom "Your guild current Own : "+ getd(".dota_sql_"+ getcharid(2) +"_c"); dispbottom "Your guild highest Own : "+ getd(".dota_sql_"+ getcharid(2) +"_h"); query_sql "select date_format( from_unixtime("+ getvariableofnpc( getd(".dota_sql_"+ getcharid(2) +"_t"), "DOTAPVP" ) +"),'%a %e/%c/%y %r')", .@time2$; dispbottom "Your guild highest Own on : "+ .@time2$; } else dispbottom "Your guild is not in the ladder yet."; } end; OnPCLoginEvent: if ( .maptrigger$ != "all" ) end; OnPCLoadMapEvent: if ( @dota_sql_kills == 0 && @dota_sql_deaths == 0 ) { if ( .maptrigger$ != "all" ) { getmapxy .@map$, .@x, .@y, 0; for ( set .@i, 0; .@i < .maptriggersize; set .@i, .@i +1 ) { if ( .@map$ == .maptrigger$[.@i] ) break; } 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; } if ( getcharid(2) && getd(".dota_sql_"+ getcharid(2) +"_h") == 0 ) { query_sql "select currentown, highestown, unix_timestamp(owntime) from ownladder where guild_id = "+ getcharid(2), .@c, .@h, .@t; setd ".dota_sql_"+ getcharid(2) +"_c", .@c; setd ".dota_sql_"+ getcharid(2) +"_h", .@h; setd ".dota_sql_"+ getcharid(2) +"_t", .@t; } end; } support,62,49,5 script PvP-StatsViewer 57,{ set .@npcname$, strnpcinfo(0); while (1) { mes "["+ .@npcname$ +"]"; mes "Hello "+ strcharinfo(0) +"..."; mes "If you want to I can show you your PVP stats."; next; switch ( select ( "Most Kills","Highest Streak","Longest Ownage","Own Information","Explanation" ) ) { case 1: set .@nb, query_sql("select name, kills, deaths from pvpladder order by kills desc limit "+ getvariableofnpc(.showtotal,"DOTAPVP"), .@name$, .@kills, .@deaths); if ( .@nb == 0 ) { mes "["+ .@npcname$ +"]"; mes "The ladder currently is empty."; next; } for ( set .@j,0; .@j < .@nb; set .@j, .@j + getvariableofnpc(.showpage,"DOTAPVP") ) { mes "["+ .@npcname$ +"]"; for ( set .@i, .@j; .@i < (getvariableofnpc(.showpage,"DOTAPVP") + .@j) && .@i < .@nb; set .@i, .@i + 1 ) { mes "^996600"+ (.@i+1) +": ^006699"+ .@name$[.@i] +" ^00AA00["+ .@kills[.@i] +"] ^FF0000<"+ .@deaths[.@i] +">^000000"; } next; } break; case 2: set .@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 == 0 ) { mes "["+ .@npcname$ +"]"; mes "The ladder currently is empty."; next; } for ( set .@j,0; .@j < .@nb; set .@j, .@j + getvariableofnpc(.showpage,"DOTAPVP") ) { mes "["+ .@npcname$ +"]"; for ( set .@i, .@j; .@i < (getvariableofnpc(.showpage,"DOTAPVP") + .@j) && .@i < .@nb; set .@i, .@i + 1 ) { mes "^996600"+ (.@i+1) +": ^006699"+ .@name$[.@i] +" ^70AC11{"+ .@streak[.@i] +"} ^000000on :"; mes " ^EE8800"+ .@time$[.@i] +"^000000"; } next; } break; case 3: set .@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 == 0 ) { mes "["+ .@npcname$ +"]"; mes "The ladder currently is empty."; next; } for ( set .@j,0; .@j < .@nb; set .@j, .@j + getvariableofnpc(.showpage,"DOTAPVP") ) { mes "["+ .@npcname$ +"]"; for ( set .@i, .@j; .@i < (getvariableofnpc(.showpage,"DOTAPVP") + .@j) && .@i < .@nb; set .@i, .@i + 1 ) { mes "^996600"+ (.@i+1) +": ^006699"+ .@name$[.@i] +" ^00AAAA("+ .@owned[.@i] +") ^000000on :"; mes " ^EE8800"+ .@time$[.@i] +"^000000"; } next; } break; case 4: if ( @dota_sql_kills == 0 && @dota_sql_deaths == 0 ) 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$; mes "["+ .@npcname$ +"]"; if ( @dota_sql_kills == 0 && @dota_sql_deaths == 0 ) 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 :"; query_sql "select date_format( from_unixtime("+ @dota_sql_streaktime +"),'%a %e/%c/%y %r')", .@time1$; mes " ^EE8800"+ .@time1$ +"^000000"; } } next; if ( getcharid(2) ) { if ( getvariableofnpc( getd(".dota_sql_"+ getcharid(2) +"_h"), "DOTAPVP" ) == 0 ) { query_sql "select currentown, highestown, unix_timestamp(owntime) from ownladder where guild_id = "+ getcharid(2), .@c, .@h, .@t; set getvariableofnpc( getd(".dota_sql_"+ getcharid(2) +"_c"), "DOTAPVP" ), .@c; set getvariableofnpc( getd(".dota_sql_"+ getcharid(2) +"_h"), "DOTAPVP" ), .@h; set getvariableofnpc( getd(".dota_sql_"+ getcharid(2) +"_t"), "DOTAPVP" ), .@t; } mes "["+ .@npcname$ +"]"; if ( getvariableofnpc( getd(".dota_sql_"+ getcharid(2) +"_h"), "DOTAPVP" ) == 0 ) { mes "Your guild not yet kill any player."; } else { mes "Your guild name : ^006699"+ strcharinfo(2) +"^000000"; mes "Current Owning : ^00AAAA("+ getvariableofnpc( getd(".dota_sql_"+ getcharid(2) +"_c"), "DOTAPVP" ) +")^000000"; mes "Longest Ownage was ^00AAAA("+ getvariableofnpc( getd(".dota_sql_"+ getcharid(2) +"_h"), "DOTAPVP" ) + ")^000000 on :"; query_sql "select date_format( from_unixtime("+ getvariableofnpc( getd(".dota_sql_"+ getcharid(2) +"_t"), "DOTAPVP" ) +"),'%a %e/%c/%y %r')", .@time2$; mes " ^EE8800"+ .@time2$ +"^000000"; } next; } break; case 5: mes "["+ .@npcname$ +"]"; 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; } } } Thank you.
  5. It worked! It now recognizes PvP all around. But one problem is, when I got the top rank - I didn't receive the reward item (Example: item # 512). Tried completely re-logging in as well and still no luck. PVP Ladder: //===== Stolao Scripts ================================== //= PvP Ladder //===== Author ================================================== //= Stolao (Original Author) //= Happy (2.0) //===== Current Version: ===================================== //= 2.0(unofficial) //===== Compatible With: ===================================== //= rAthena SVN, Hercules, 3ceam, eAthena //===== Description: ========================================= // Configurable Pvp Ladder //===== Comments: ============================================ //= [Stolao] // Needs bug testing, please report any bugs // Unable to test thurally on my comp atm //= [Happy] // Update* I tested it and found tons of bugs, I'm in rush so // I fixed them myself. It is now working 100%. // The version is unofficial version. Sorry Stolao I fixed it // Without your permission XD //===== Additional Comments: ================================= //= 1.00 Initial Release //= 1.01 Added Location with veiwing of ladder //= 1.02 Added GM Menu //= 1.03 Added atcommand //= 1.04 Shortend menu script //= 1.05 Added PvpPoints into confug and script //= 1.06 Added Abuse Protection //= 1.07 Made Pvp Points Configurable //= 1.08 Fixed typo in Reset Option //= 1.09 Made Amount of pvp points earned configurable //= 1.0A Ajusted Spacing for easier reading //= 1.0B Added Warp to savepoint on abuse into config //= 2.0 (unofficial)Fixed bugs on ranking modification and // bitwise permissions //= 2.0b minor fix on resetting the ladder //= 2.1 tested fix to ladder reset part //===== Contact Ifo: ========================================= //= [Stolao] // Email: [email protected] //= [Happy] // Email: http://hercules.ws/board/user/164-happy/ //============================================================ payoo,96,123,0 script PVP Ladder 857,{ mes "[PVP Ladder]"; OnPvpLadder: mes "Ranking"; if(getgmlevel() >= .GM){ // Menu Generator for GM and Normal Player set .@i,select("View Ranking:Leave:Reset PVP Stats"); } else { set .@i,select("View Ranking:Leave"); } switch(.@i) { // Where generated menu goes to case 3: // DReset PvP Stats mes "Are you sure you want to delete"; mes "ALL pvp records?"; if(select("No:Yes")==1) close; next; mes "Wait one Moment..."; mes "....."; cleararray $TOPPK$[0],0,127; // Clears array where top rank char names are stored. cleararray $TOPPK[0],0,127; // Clears array where top rank kill count are stored. query_sql("DELETE FROM `char_reg_num_db` WHERE `key` = 'pl_pkcount'"); // Clears kills saved on character variables set .@self, getcharid(3); // Remembers RID of current char talking to npc set .@size, query_sql("select account_id from `char` where online = 1", .@aid); for(set .@i,0; .@i<.@size; set .@i,.@i+1) { // Deletes kills of online players if(attachrid(.@aid[.@i])){ //attach rid of online player 1 by 1 and remove kills set pl_pkcount,0; } } attachrid(.@self); // attach remembered rid back mes "Cleared pvp data."; close; case 1: // View PvP Records for(set .@i,1; .@i <= .MaxPlayers; set .@i,.@i+1){ mes (.@i)+": "+ $TOPPK$[.@i] +" with "+ $TOPPK[.@i] +" kills"; if((.@i) % 10 == 0){ // A nice way to create multiple pages by 10 ranks if(select("Read More:Leave") == 1){ next; } else { close; } } } case 2: // Leave close; } close; OnPCKillEvent: if(.Options&2 && (agitcheck() || agitcheck2())){ // Check to disable during woe end; } if(getgmlevel() <= .GmLvl){ if(.Options&1 || strcharinfo(3) == .Map$){ if(.Options&32){ // Repeatkill abuse counter for(set .@i,.RepeatCount; .@i > 0; set .@i, .@i-1){ set @PKedID[.@i+1], @PKedID[.@i]; // Old killedrids moved to upper array elements } set @PKedID,killedrid; // set killedrid to [0] position. for(set .@i,1; .@i < .RepeatCount; set .@i,.@i + 1){ if(@PKedID[0] == @PKedID[.@i]){ // check if killerid same as the previously killedrids set .@s, .@s + 1; // if all 5 past killedrid are the same then this would become 5 and trigger protection } else { break; // else stop checking } } } if(.@s < .RepeatCount){ // if not abusing kills according to repeatcount set pl_pkcount,pl_pkcount + 1; if(.Options&16) { set getd(.PointType$),getd(.PointType$) + .PvpEarned; // add points } if(pl_pkcount > $TOPPK[.MaxPlayers]) { // If higher than last ranker for(set .@i,1; .@i <= .MaxPlayers ; set .@i, .@i + 1) { // Reorganize the ranking if (pl_pkcount > $TOPPK[.@i] && !.@newrank) { set .@newrank,.@i; } if (strcharinfo(0) == $TOPPK$[.@i] && .@newrank == .@i) { setarray $TOPPK$[.@i], strcharinfo(0); setarray $TOPPK[.@i], pl_pkcount; set .@newrank,0; break; } if ( strcharinfo(0) == $TOPPK$[.@i] && .@newrank != .@i) { set .@existrank,.@i; break; } } if (.@newrank) { for (set .@e,.MaxPlayers; .@e >= 0 ; set .@e, .@e - 1) { if (.@e < .@existrank) { setarray $TOPPK$[.@e + 1], $TOPPK$[.@e]; // move this ranker backward setarray $TOPPK[.@e + 1], $TOPPK[.@e]; } if (.@e == .@newrank) { setarray $TOPPK$[.@e], strcharinfo(0); setarray $TOPPK[.@e], pl_pkcount; if(.Options&4) { announce strcharinfo(0)+"'s rank is now "+(.@e)+"",bc_all; } break; } } } } } else { if(.Options&64) { warp "Save",0,0; } } } } end; OnInit: set .GM,99; set .MaxPlayers,10; // Number of Players held in Records set .GmLvl,99; // Highest GM level Able to Hold a Record, if Option 8 is Disabled set .Map$,"prontera"; // Map Pvp Must Take Place on in order to Count, if Option 1 is Disabled set .RepeatCount,5; // Number of kills on same person before it detects abuse, max of 128 set .PointType$,"#PvpPoints"; // Name of points earned, E.G. #Cash Points set .PvpEarned,1; // Number of Pvp Points Earned set .Options,1|4|32|64; // Bitwise Variable // 1: Only Counts Kills on .Map$ if Disabled // 2: Disables Record Holding during WOE // 4: Announce When Someone Takes a Rank // 8: Allow Gms Above level .GmLvl To Be on Ladder // 16: Gain PvP Points on Kills (#PvpPoints) // 32: Repeat Kill Protection // 64: Warp to Save on abuse // Example: "1+2+4 = 7" No Forced Map, Disables Record Holding during WOE and Announces New Record Holders bindatcmd("PvpLadder" ,"Pvp_Ladder::OnPvpLadder",0,99); end; OnPCLoginEvent: if( $TOPPK$ == strcharinfo(0) && countitem(512) < 1) { getitembound 512,1,4; } else if(countitem(512) >= 1){ delitem 512,1; } }
  6. How many kills does it need to take til a ranking is recognized? Because I've tested it by killing a player multiple times with that add-on in the script, and it shows no progress on the rankings (please see image below). Ranking (0 with 0 kills from 1-10): Script with add-on: //===== Stolao Scripts ================================== //= PvP Ladder //===== Author ================================================== //= Stolao (Original Author) //= Happy (2.0) //===== Current Version: ===================================== //= 2.0(unofficial) //===== Compatible With: ===================================== //= rAthena SVN, Hercules, 3ceam, eAthena //===== Description: ========================================= // Configurable Pvp Ladder //===== Comments: ============================================ //= [Stolao] // Needs bug testing, please report any bugs // Unable to test thurally on my comp atm //= [Happy] // Update* I tested it and found tons of bugs, I'm in rush so // I fixed them myself. It is now working 100%. // The version is unofficial version. Sorry Stolao I fixed it // Without your permission XD //===== Additional Comments: ================================= //= 1.00 Initial Release //= 1.01 Added Location with veiwing of ladder //= 1.02 Added GM Menu //= 1.03 Added atcommand //= 1.04 Shortend menu script //= 1.05 Added PvpPoints into confug and script //= 1.06 Added Abuse Protection //= 1.07 Made Pvp Points Configurable //= 1.08 Fixed typo in Reset Option //= 1.09 Made Amount of pvp points earned configurable //= 1.0A Ajusted Spacing for easier reading //= 1.0B Added Warp to savepoint on abuse into config //= 2.0 (unofficial)Fixed bugs on ranking modification and // bitwise permissions //= 2.0b minor fix on resetting the ladder //= 2.1 tested fix to ladder reset part //===== Contact Ifo: ========================================= //= [Stolao] // Email: [email protected] //= [Happy] // Email: http://hercules.ws/board/user/164-happy/ //============================================================ payoo,96,123,0 script PVP Ladder 857,{ mes "[PVP Ladder]"; OnPvpLadder: mes "Ranking"; if(getgmlevel() >= .GM){ // Menu Generator for GM and Normal Player set .@i,select("View Ranking:Leave:Reset PVP Stats"); } else { set .@i,select("View Ranking:Leave"); } switch(.@i) { // Where generated menu goes to case 3: // DReset PvP Stats mes "Are you sure you want to delete"; mes "ALL pvp records?"; if(select("No:Yes")==1) close; next; mes "Wait one Moment..."; mes "....."; cleararray $TOPPK$[0],0,127; // Clears array where top rank char names are stored. cleararray $TOPPK[0],0,127; // Clears array where top rank kill count are stored. query_sql("DELETE FROM `char_reg_num_db` WHERE `key` = 'pl_pkcount'"); // Clears kills saved on character variables set .@self, getcharid(3); // Remembers RID of current char talking to npc set .@size, query_sql("select account_id from `char` where online = 1", .@aid); for(set .@i,0; .@i<.@size; set .@i,.@i+1) { // Deletes kills of online players if(attachrid(.@aid[.@i])){ //attach rid of online player 1 by 1 and remove kills set pl_pkcount,0; } } attachrid(.@self); // attach remembered rid back mes "Cleared pvp data."; close; case 1: // View PvP Records for(set .@i,1; .@i <= .MaxPlayers; set .@i,.@i+1){ mes (.@i)+": "+ $TOPPK$[.@i] +" with "+ $TOPPK[.@i] +" kills"; if((.@i) % 10 == 0){ // A nice way to create multiple pages by 10 ranks if(select("Read More:Leave") == 1){ next; } else { close; } } } case 2: // Leave close; } close; OnPCKillEvent: if(.Options&2 && (agitcheck() || agitcheck2())){ // Check to disable during woe end; } if(getgmlevel() <= .GmLvl){ if(.Options&1 || strcharinfo(3) == .Map$){ if(.Options&32){ // Repeatkill abuse counter for(set .@i,.RepeatCount; .@i > 0; set .@i, .@i-1){ set @PKedID[.@i+1], @PKedID[.@i]; // Old killedrids moved to upper array elements } set @PKedID,killedrid; // set killedrid to [0] position. for(set .@i,1; .@i < .RepeatCount; set .@i,.@i + 1){ if(@PKedID[0] == @PKedID[.@i]){ // check if killerid same as the previously killedrids set .@s, .@s + 1; // if all 5 past killedrid are the same then this would become 5 and trigger protection } else { break; // else stop checking } } } if(.@s < .RepeatCount){ // if not abusing kills according to repeatcount set pl_pkcount,pl_pkcount + 1; if(.Options&16) { set getd(.PointType$),getd(.PointType$) + .PvpEarned; // add points } if(pl_pkcount > $TOPPK[.MaxPlayers]) { // If higher than last ranker for(set .@i,1; .@i <= .MaxPlayers ; set .@i, .@i + 1) { // Reorganize the ranking if (pl_pkcount > $TOPPK[.@i] && !.@newrank) { set .@newrank,.@i; } if (strcharinfo(0) == $TOPPK$[.@i] && .@newrank == .@i) { setarray $TOPPK$[.@i], strcharinfo(0); setarray $TOPPK[.@i], pl_pkcount; set .@newrank,0; break; } if ( strcharinfo(0) == $TOPPK$[.@i] && .@newrank != .@i) { set .@existrank,.@i; break; } } if (.@newrank) { for (set .@e,.MaxPlayers; .@e >= 0 ; set .@e, .@e - 1) { if (.@e < .@existrank) { setarray $TOPPK$[.@e + 1], $TOPPK$[.@e]; // move this ranker backward setarray $TOPPK[.@e + 1], $TOPPK[.@e]; } if (.@e == .@newrank) { setarray $TOPPK$[.@e], strcharinfo(0); setarray $TOPPK[.@e], pl_pkcount; if(.Options&4) { announce strcharinfo(0)+"'s rank is now "+(.@e)+"",bc_all; } break; } } } } } else { if(.Options&64) { warp "Save",0,0; } } } } end; OnInit: set .GM,99; set .MaxPlayers,10; // Number of Players held in Records set .GmLvl,99; // Highest GM level Able to Hold a Record, if Option 8 is Disabled set .Map$,"prontera"; // Map Pvp Must Take Place on in order to Count, if Option 1 is Disabled set .RepeatCount,5; // Number of kills on same person before it detects abuse, max of 128 set .PointType$,"#PvpPoints"; // Name of points earned, E.G. #Cash Points set .PvpEarned,1; // Number of Pvp Points Earned set .Options,4|32|64; // Bitwise Variable // 1: Only Counts Kills on .Map$ if Disabled // 2: Disables Record Holding during WOE // 4: Announce When Someone Takes a Rank // 8: Allow Gms Above level .GmLvl To Be on Ladder // 16: Gain PvP Points on Kills (#PvpPoints) // 32: Repeat Kill Protection // 64: Warp to Save on abuse // Example: "1+2+4 = 7" No Forced Map, Disables Record Holding during WOE and Announces New Record Holders bindatcmd("PvpLadder" ,"Pvp_Ladder::OnPvpLadder",0,99); end; } OnPCLoginEvent: if( $TOPPK$ == strcharinfo(0) && countitem(<512>) < 1) { getitembound <512>,1,4; } else if(countitem(<512>) >= 1){ delitem <512>,1; } Thank you.
  7. This is the PVP Ladder that I'm currently using. Credits to: Stolao //===== Stolao Scripts ================================== //= PvP Ladder //===== Author ================================================== //= Stolao (Original Author) //= Happy (2.0) //===== Current Version: ===================================== //= 2.0(unofficial) //===== Compatible With: ===================================== //= rAthena SVN, Hercules, 3ceam, eAthena //===== Description: ========================================= // Configurable Pvp Ladder //===== Comments: ============================================ //= [Stolao] // Needs bug testing, please report any bugs // Unable to test thurally on my comp atm //= [Happy] // Update* I tested it and found tons of bugs, I'm in rush so // I fixed them myself. It is now working 100%. // The version is unofficial version. Sorry Stolao I fixed it // Without your permission XD //===== Additional Comments: ================================= //= 1.00 Initial Release //= 1.01 Added Location with veiwing of ladder //= 1.02 Added GM Menu //= 1.03 Added atcommand //= 1.04 Shortend menu script //= 1.05 Added PvpPoints into confug and script //= 1.06 Added Abuse Protection //= 1.07 Made Pvp Points Configurable //= 1.08 Fixed typo in Reset Option //= 1.09 Made Amount of pvp points earned configurable //= 1.0A Ajusted Spacing for easier reading //= 1.0B Added Warp to savepoint on abuse into config //= 2.0 (unofficial)Fixed bugs on ranking modification and // bitwise permissions //= 2.0b minor fix on resetting the ladder //= 2.1 tested fix to ladder reset part //===== Contact Ifo: ========================================= //= [Stolao] // Email: [email protected] //= [Happy] // Email: http://hercules.ws/board/user/164-happy/ //============================================================ payoo,96,123,0 script PVP Ladder 857,{ mes "[PVP Ladder]"; OnPvpLadder: mes "Ranking"; if(getgmlevel() >= .GM){ // Menu Generator for GM and Normal Player set .@i,select("View Ranking:Leave:Reset PVP Stats"); } else { set .@i,select("View Ranking:Leave"); } switch(.@i) { // Where generated menu goes to case 3: // DReset PvP Stats mes "Are you sure you want to delete"; mes "ALL pvp records?"; if(select("No:Yes")==1) close; next; mes "Wait one Moment..."; mes "....."; cleararray $TOPPK$[0],0,127; // Clears array where top rank char names are stored. cleararray $TOPPK[0],0,127; // Clears array where top rank kill count are stored. query_sql("DELETE FROM `char_reg_num_db` WHERE `key` = 'pl_pkcount'"); // Clears kills saved on character variables set .@self, getcharid(3); // Remembers RID of current char talking to npc set .@size, query_sql("select account_id from `char` where online = 1", .@aid); for(set .@i,0; .@i<.@size; set .@i,.@i+1) { // Deletes kills of online players if(attachrid(.@aid[.@i])){ //attach rid of online player 1 by 1 and remove kills set pl_pkcount,0; } } attachrid(.@self); // attach remembered rid back mes "Cleared pvp data."; close; case 1: // View PvP Records for(set .@i,1; .@i <= .MaxPlayers; set .@i,.@i+1){ mes (.@i)+": "+ $TOPPK$[.@i] +" with "+ $TOPPK[.@i] +" kills"; if((.@i) % 10 == 0){ // A nice way to create multiple pages by 10 ranks if(select("Read More:Leave") == 1){ next; } else { close; } } } case 2: // Leave close; } close; OnPCKillEvent: if(.Options&2 && (agitcheck() || agitcheck2())){ // Check to disable during woe end; } if(getgmlevel() <= .GmLvl){ if(.Options&1 || strcharinfo(3) == .Map$){ if(.Options&32){ // Repeatkill abuse counter for(set .@i,.RepeatCount; .@i > 0; set .@i, .@i-1){ set @PKedID[.@i+1], @PKedID[.@i]; // Old killedrids moved to upper array elements } set @PKedID,killedrid; // set killedrid to [0] position. for(set .@i,1; .@i < .RepeatCount; set .@i,.@i + 1){ if(@PKedID[0] == @PKedID[.@i]){ // check if killerid same as the previously killedrids set .@s, .@s + 1; // if all 5 past killedrid are the same then this would become 5 and trigger protection } else { break; // else stop checking } } } if(.@s < .RepeatCount){ // if not abusing kills according to repeatcount set pl_pkcount,pl_pkcount + 1; if(.Options&16) { set getd(.PointType$),getd(.PointType$) + .PvpEarned; // add points } if(pl_pkcount > $TOPPK[.MaxPlayers]) { // If higher than last ranker for(set .@i,1; .@i <= .MaxPlayers ; set .@i, .@i + 1) { // Reorganize the ranking if (pl_pkcount > $TOPPK[.@i] && !.@newrank) { set .@newrank,.@i; } if (strcharinfo(0) == $TOPPK$[.@i] && .@newrank == .@i) { setarray $TOPPK$[.@i], strcharinfo(0); setarray $TOPPK[.@i], pl_pkcount; set .@newrank,0; break; } if ( strcharinfo(0) == $TOPPK$[.@i] && .@newrank != .@i) { set .@existrank,.@i; break; } } if (.@newrank) { for (set .@e,.MaxPlayers; .@e >= 0 ; set .@e, .@e - 1) { if (.@e < .@existrank) { setarray $TOPPK$[.@e + 1], $TOPPK$[.@e]; // move this ranker backward setarray $TOPPK[.@e + 1], $TOPPK[.@e]; } if (.@e == .@newrank) { setarray $TOPPK$[.@e], strcharinfo(0); setarray $TOPPK[.@e], pl_pkcount; if(.Options&4) { announce strcharinfo(0)+"'s rank is now "+(.@e)+"",bc_all; } break; } } } } } else { if(.Options&64) { warp "Save",0,0; } } } } end; OnInit: set .GM,99; set .MaxPlayers,10; // Number of Players held in Records set .GmLvl,99; // Highest GM level Able to Hold a Record, if Option 8 is Disabled set .Map$,"prontera"; // Map Pvp Must Take Place on in order to Count, if Option 1 is Disabled set .RepeatCount,5; // Number of kills on same person before it detects abuse, max of 128 set .PointType$,"#PvpPoints"; // Name of points earned, E.G. #Cash Points set .PvpEarned,1; // Number of Pvp Points Earned set .Options,4|32|64; // Bitwise Variable // 1: Only Counts Kills on .Map$ if Disabled // 2: Disables Record Holding during WOE // 4: Announce When Someone Takes a Rank // 8: Allow Gms Above level .GmLvl To Be on Ladder // 16: Gain PvP Points on Kills (#PvpPoints) // 32: Repeat Kill Protection // 64: Warp to Save on abuse // Example: "1+2+4 = 7" No Forced Map, Disables Record Holding during WOE and Announces New Record Holders bindatcmd("PvpLadder" ,"Pvp_Ladder::OnPvpLadder",0,99); end; }
  8. Is there a script that exists that gives the ability to reward a player items when he achieves "Top PVP Player" title? Then if he looses that title, he will loose the items as well automatically? Or is that not possible at all? Any help will be appreciated. Thank you!
  9. SORRY!!! Nevermind! I figured it out through my sprite folder! Thank you again everyone! Thank you everyone for all your help !!! Now I completely understand how to implement custom items !!! Alright, the issue doesn't come from your settings, it was the drag files. Copy the files from the attached archive in this post in your ¾ÆÀÌÅÛ folder. Update: Now that I uploaded those files you sent me, it wouldn't let me view it through equipment info (see image below). And the same thing goes for - Angel Wings, Angelic Wings, Angeling Wings. So far the only ones that worked are - Hollow Mask and Baby Angel wings. itemInfo.lub [29001] = { unidentifiedDisplayName = "Fox Tail", unidentifiedResourceName = "fox_tail", unidentifiedDescriptionName = { "Unknown Item, can be identified by [Magnifier]." }, identifiedDisplayName = "Fox Tail", identifiedResourceName = "fox_tail", identifiedDescriptionName = { "The original fox tail.", "Class: ^777777Headgear^000000", "Defense: ^7777775^000000", "Location: ^777777Lower^000000", "Weight: ^77777710^000000", "Applicable Job: ^777777Every Job^000000" }, slotCount = 2, ClassNum = 1083 }, [29002] = { unidentifiedDisplayName = "Angel Wings", unidentifiedResourceName = "angel_wings", unidentifiedDescriptionName = { "Unknown Item, can be identified by [Magnifier]." }, identifiedDisplayName = "Angel Wings", identifiedResourceName = "angel_wings", identifiedDescriptionName = { "Angel Wings.", "Class: ^777777Headgear^000000", "Defense: ^7777775^000000", "Location: ^777777Mid^000000", "Weight: ^77777710^000000", "Applicable Job: ^777777Every Job^000000" }, slotCount = 2, ClassNum = 1084 }, [29003] = { unidentifiedDisplayName = "Angelic Wings", unidentifiedResourceName = "angelic_wings", unidentifiedDescriptionName = { "Unknown Item, can be identified by [Magnifier]." }, identifiedDisplayName = "Angelic Wings", identifiedResourceName = "angelic_wings", identifiedDescriptionName = { "Angelic Wings.", "Class: ^777777Headgear^000000", "Defense: ^7777775^000000", "Location: ^777777Mid^000000", "Weight: ^77777710^000000", "Applicable Job: ^777777Every Job^000000" }, slotCount = 2, ClassNum = 1085 }, [29004] = { unidentifiedDisplayName = "Angeling Wings", unidentifiedResourceName = "angeling_wings", unidentifiedDescriptionName = { "Unknown Item, can be identified by [Magnifier]." }, identifiedDisplayName = "Angeling Wings", identifiedResourceName = "angeling_wings", identifiedDescriptionName = { "Angeling Wings.", "Class: ^777777Headgear^000000", "Defense: ^7777775^000000", "Location: ^777777Mid^000000", "Weight: ^77777710^000000", "Applicable Job: ^777777Every Job^000000" }, slotCount = 2, ClassNum = 1086 }, [29005] = { unidentifiedDisplayName = "Baby Angel Wings", unidentifiedResourceName = "baby_angel", unidentifiedDescriptionName = { "Unknown Item, can be identified by [Magnifier]." }, identifiedDisplayName = "Baby Angel Wings", identifiedResourceName = "baby_angel", identifiedDescriptionName = { "Wings from a baby angel.", "Class: ^777777Headgear^000000", "Defense: ^7777775^000000", "Location: ^777777Mid^000000", "Weight: ^77777710^000000", "Applicable Job: ^777777Every Job^000000" }, slotCount = 2, ClassNum = 1087 }, Item_db.txt 29000,hollow_mask,Hollow Mask,5,5,0,10,,5,,3,0xFFFFFFFF,7,2,512,,1,1,1082,{},{},{} 29001,fox_tail,Fox Tail,5,5,0,10,,5,,3,0xFFFFFFFF,7,2,512,,1,1,1083,{},{},{} 29002,angel_wings,Angel Wings,5,5,0,10,,5,,4,0xFFFFFFFF,7,2,1,,1,1,1084,{},{},{} 29003,angelic_wings,Angelic Wings,5,5,0,10,,5,,4,0xFFFFFFFF,7,2,1,,1,1,1085,{},{},{} 29004,angeling_wings,Angeling Wings,5,5,0,10,,5,,4,0xFFFFFFFF,7,2,1,,1,1,1086,{},{},{} 29005,baby_angel,Baby Angel Wings,5,5,0,10,,5,,4,0xFFFFFFFF,7,2,1,,1,1,1087,{},{},{} accessoryid.lub ACCESSORY_hollow_mask = 1082, ACCESSORY_fox_tail = 1083, ACCESSORY_angel_wings = 1084, ACCESSORY_angelic_wings = 1085, ACCESSORY_angeling_wings = 1086, ACCESSORY_baby_angel = 1087, } Accname.lub [ACCESSORY_IDs.ACCESSORY_hollow_mask] = "_hollow_mask", [ACCESSORY_IDs.ACCESSORY_fox_tail] = "_fox_tail", [ACCESSORY_IDs.ACCESSORY_angel_wings] = "_angel_wings", [ACCESSORY_IDs.ACCESSORY_angelic_wings] = "_angelic_wings", [ACCESSORY_IDs.ACCESSORY_angeling_wings] = "_angeling_wings", [ACCESSORY_IDs.ACCESSORY_baby_angel] = "_baby_angel", }
  10. Oh, that's not the fox tail I used. The item I have came from this link: https://rathena.org/board/files/file/3112-custom-collection-102-items/
  11. Thank you! The Hollow Mask works (see image 1), but when I try to wear the Fox Tail, the client crashes (see image 2). I thought I installed it the same way as the mask. So I don't see why it errors. Image 1 Image 2 Item_db.txt 29000,hollow_mask,Hollow Mask,5,5,0,10,,5,,3,0xFFFFFFFF,7,2,512,,1,1,1082,{},{},{} 29001,brown_fox_tail,Fox Tail,5,5,0,10,,5,,3,0xFFFFFFFF,7,2,512,,1,1,1083,{},{},{} data\luafiles514\lua files\datainfo\accessoryid.lub ACCESSORY_hollow_mask = 1082, ACCESSORY_brown_fox_tail = 1083, } data\luafiles514\lua files\datainfo\accname.lub [ACCESSORY_IDs.ACCESSORY_hollow_mask] = "_hollow_mask", [ACCESSORY_IDs.ACCESSORY_brown_fox_tail] = "_brown_fox_tail", } itemInfo.lub [29000] = { unidentifiedDisplayName = "Natzu Mask", unidentifiedResourceName = "hollow_mask", unidentifiedDescriptionName = { "Unknown Item, can be identified by [Magnifier]." }, identifiedDisplayName = "Natzu Mask", identifiedResourceName = "hollow_mask", identifiedDescriptionName = { "A mask exclusively for the administrator Natzu.", "Class: ^777777Headgear^000000", "Defense: ^7777775^000000", "Location: ^777777Mid^000000", "Weight: ^77777710^000000", "Applicable Job: ^777777Every Job^000000" }, slotCount = 4, ClassNum = 1082 }, [29001] = { unidentifiedDisplayName = "Fox Tail", unidentifiedResourceName = "brown_fox_tail", unidentifiedDescriptionName = { "Unknown Item, can be identified by [Magnifier]." }, identifiedDisplayName = "Fox Tail", identifiedResourceName = "brown_fox_tail", identifiedDescriptionName = { "The original fox tail.", "Class: ^777777Headgear^000000", "Defense: ^7777775^000000", "Location: ^777777Lower^000000", "Weight: ^77777710^000000", "Applicable Job: ^777777Every Job^000000" }, slotCount = 2, ClassNum = 1083 }, ITEMS: Female: Male: Item: Collection: Drop:
  12. By 'Main GRF' - I assume you mean MyServer.GRF? Here are screenshots of my files in my main grf using GRF Builder. Item: Collection: Drop: Female? Male? Now when I attempted to upload another custom item, and double clicked it to wear it - it errors and boots me off the game. Why is that? Screenshot: itemInfo.lub: [29001] = { unidentifiedDisplayName = "Fox Tail", unidentifiedResourceName = "_brownfoxtail", unidentifiedDescriptionName = { "Unknown Item, can be identified by [Magnifier]." }, identifiedDisplayName = "Fox Tail", identifiedResourceName = "_brownfoxtail", identifiedDescriptionName = { "The original fox tail.", "Class: ^777777Headgear^000000", "Defense: ^7777775^000000", "Location: ^777777Lower^000000", "Weight: ^77777710^000000", "Applicable Job: ^777777Every Job^000000" }, slotCount = 2, ClassNum = 1083 }, item_db.txt 29001,_brownfoxtail,Fox Tail,5,5,0,10,,5,,3,0xFFFFFFFF,7,2,512,,1,1,1083,{},{},{}
  13. how about the sprite / act of that item is it already on the directory? I mean those drops / male / female sprites. Yes I believe I have the right folders and images in the right places. Please see screenshots below for reference. Data Folder: Item: Collection: Sprite: Female? Male?
  14. This is what I have... itemInfo.lub [29000] = { unidentifiedDisplayName = "Hollow Mask", unidentifiedResourceName = "hollow_mask", unidentifiedDescriptionName = { "Unknown Item, can be identified by [Magnifier]." }, identifiedDisplayName = "Hollow Mask", identifiedResourceName = "hollow_mask", identifiedDescriptionName = { "<desc>", "<goes>", "<here>", "Class: ^777777Headgear^000000", "Defense: ^7777775^000000", "Location: ^777777Mid^000000", "Weight: ^77777710^000000", "Applicable Job: ^777777Every Job^000000" }, slotCount = 3, ClassNum = 1082 }, Item_db.txt 29000,hollow_mask,Hollow Mask,5,5,0,10,,5,,3,0xFFFFFFFF,7,2,512,,1,1,1082,{},{},{}
  15. Thank you !! It almost worked though !! One more little problem - it doesn't show it in my character's face. But at least it shows the item in my equipment menu (please see image below).
  16. Ohhhh, okay. So just to double check: Output: C:\Users\xxx\...\patchname.thor [File] Directory: C:\Users\xxx\...\System\itemInfo.lub (updated itemInfo.lub) Directory: Root? (A little pop up window appeared after clicking generate) Sorry for asking too much questions. I just want to make sure it's correct. Thank you so much for all your help!
  17. Ohhh I see. Though what I'm wondering about now is that whether the itemInfo.lub file goes back to RO/System folder? Or does it go to my data folder to create patch.
  18. Ok and how would my players get the same file?
  19. Just a couple questions here: Do I put the itemInfo.lub file back to the RO/System folder? Is there any guide to implementing custom items for 2013 Clients? Thank you so much for all your help.
  20. Oh really? And no, I'm using a 2013 client. Is there any guide on how to go about implementing custom items with a 2013 client?
  21. So I'm trying to implement a custom item called "Hollow Mask" from the Downloads section here in rAthena. But when I go in game, it shows as an Unknown Item and when I try to wear it - it shows that I'm wearing it on the Equipment menu but not my actual character (please see images for reference). What could be wrong with my settings? Preview: My files: - files - item file - collection file My settings: File Location: data/... idnum2itemdesctable 29000# ^008000[ Hollow Mask ]^000000 Item description coming soon~ Class :^777777 Headgear^000000 Defense :^777777 5^000000 Equipped On :^777777 Middle^000000 Weight :^777777 10^000000 Required Level :^777777 1^000000 Applicable Job :^777777 Every Job^000000 # idnum2itemdisplaynametable 29000#Hollow Mask# idnum2itemresnametable 29000#hollow_mask# itemslotcounttable 29000#3# luafiles514/luafiles/datainfo... accessoryid.lub ACCESSORY_IDs = { ACCESSORY_HOLLOW_MASK = 1082 } accname.lub AccNameTable = { [ACCESSORY_IDs.ACCESSORY_HOLLOW_MASK] = "_hollow_mask" } trunk/db/pre-re/item_db.txt 29000,hollow_mask,Hollow Mask,5,5,0,10,,5,,3,0xFFFFFFFF,7,2,512,,1,1,1082,{},{},{} Please let me know if you require any more files. Any help would be appreciated. Thank you.
  22. Regarding the EXP rates - after disabling it from those files that you mentioned, it still seems like the penalty is in effect. What could I be doing wrong? File Location: trunk/db/re/level_penalty.txt // Experience & Drop Rate Modifier Database // // Structure of Database: // Type,Class,Level difference,Rate // // TYPE: // 1=experience, 2=item drop // CLASS: // 0=Normal monsters, 1=Boss monsters, 2=Guardians // // Note: RENEWAL_DROP and/or RENEWAL_EXP must be enabled. // EXP modifiers due to level difference //1,0,16,40 //1,0,15,115 //1,0,14,120 //1,0,13,125 //1,0,12,130 //1,0,11,135 //1,0,10,140 //1,0,9,135 //1,0,8,130 //1,0,7,125 //1,0,6,120 //1,0,5,115 //1,0,4,110 //1,0,3,105 //1,0,0,100 //1,0,-1,100 //1,0,-6,95 //1,0,-11,90 //1,0,-16,85 //1,0,-21,60 //1,0,-26,35 //1,0,-31,10 // Boss Type //1,1,0,100 // Guardian Type //1,2,0,100 // Drop rate modifiers due to level difference //2,0,16,50 //2,0,13,60 //2,0,10,70 //2,0,7,80 //2,0,4,90 //2,0,0,100 //2,0,-4,90 //2,0,-7,80 //2,0,-10,70 //2,0,-13,60 //2,0,-16,50 // Boss Type //2,1,0,100 // Guardian Type //2,2,0,100 File Location: trunk/src/config/renewal.h // Copyright (c) rAthena Dev Teams - Licensed under GNU GPL // For more information, see LICENCE in the main folder #ifndef _CONFIG_RENEWAL_H_ #define _CONFIG_RENEWAL_H_ //quick option to disable all renewal option, used by ./configure //#define PRERE #ifndef PRERE /** * rAthena configuration file (http://rathena.org) * For detailed guidance on these check http://rathena.org/wiki/SRC/config/ **/ /** * @INFO: This file holds general-purpose renewal settings, for class-specific ones check /src/config/classes folder **/ /// Game renewal server mode /// (disable by commenting the line) /// /// Leave this line to enable renewal specific support such as renewal formulas //#define RENEWAL /// Renewal cast time /// (disable by commenting the line) /// /// Leave this line to enable renewal casting time algorithms and enable fixed cast bonuses. /// See also default_fixed_castrate in conf/battle/skill.conf for default fixed cast time (default is 20%). /// Cast time is altered be 2 portion, Variable Cast Time (VCT) and Fixed Cast Time (FCT). /// By default FCT is 20% of VCT (some skills aren't) /// - VCT is decreased by DEX * 2 + INT. /// - FCT is NOT reduced by stats, reduced by equips or buffs. /// Example: /// On a skill whos cast time is 10s, only 8s may be reduced. the other 2s are part of a FCT //#define RENEWAL_CAST /// Renewal drop rate algorithms /// (disable by commenting the line) /// /// Leave this line to enable renewal item drop rate algorithms /// While enabled a special modified based on the difference between the player and monster level is applied /// Based on the http://irowiki.org/wiki/Drop_System#Level_Factor table //#define RENEWAL_DROP /// Renewal exp rate algorithms /// (disable by commenting the line) /// /// Leave this line to enable renewal item exp rate algorithms /// While enabled a special modified based on the difference between the player and monster level is applied //#define RENEWAL_EXP /// Renewal level modifier on damage /// (disable by commenting the line) /// // Leave this line to enable renewal base level modifier on skill damage (selected skills only) //#define RENEWAL_LVDMG /// Renewal ASPD [malufett] /// (disable by commenting the line) /// /// Leave this line to enable renewal ASPD /// - shield penalty is applied /// - AGI has a greater factor in ASPD increase /// - there is a change in how skills/items give ASPD /// - some skill/item ASPD bonuses won't stack //#define RENEWAL_ASPD /// Renewal stat calculations /// (disable by commenting the line) /// /// Leave this line to enable renewal calculation for increasing status/parameter points //#define RENEWAL_STAT #endif #endif // _CONFIG_RENEWAL_H_
  23. I apologize in advance if I'm in the wrong section for this. Drop Rates: I'm a bit confused regarding the drop rates in my server. I want it to be MVP 1% and Normal Cards to be 10%. These are my settings below: // Item drop rates (Note 2) // The rate the common items are dropped (Items that are in the ETC tab, besides card) item_rate_common: 10000 item_rate_common_boss: 10000 item_drop_common_min: 1 item_drop_common_max: 10000 // The rate healing items are dropped (items that restore HP or SP) item_rate_heal: 10000 item_rate_heal_boss: 10000 item_drop_heal_min: 1 item_drop_heal_max: 10000 // The rate at which usable items (in the item tab) other then healing items are dropped. item_rate_use: 10000 item_rate_use_boss: 10000 item_drop_use_min: 1 item_drop_use_max: 10000 // The rate at which equipment is dropped. item_rate_equip: 10000 item_rate_equip_boss: 10000 item_drop_equip_min: 1 item_drop_equip_max: 10000 // The rate at which cards are dropped item_rate_card: 20 item_rate_card_boss: 5 item_drop_card_min: 100000 item_drop_card_max: 100000 // The rate adjustment for the MVP items that the MVP gets directly in their inventory // Mode: 0 - official order, 1 - random order, 2 - all items item_rate_mvp: 1000 item_drop_mvp_min: 1 item_drop_mvp_max: 10000 item_drop_mvp_mode: 0 // The rate adjustment for card-granted item drops. item_rate_adddrop: 100 item_drop_add_min: 1 item_drop_add_max: 10000 // Rate adjustment for Treasure Box drops (these override all other modifiers) item_rate_treasure: 100 item_drop_treasure_min: 1 item_drop_treasure_max: 10000 I also noticed that when I made changes to the rates, it gave me this error message when I compiled and restarted the server. EXP Rates: I've noticed, as you get about 30 levels higher than a certain mob, the amount of the exp I get gets reduced down to 10% out of 100. So I'm wondering how to go about removing this. Thank you.
  24. o.o ...Yes, but to be completely honest with you, I'm not 100% sure how to go about configuring FluxCP. Is it possible to get some sort of guide for it? I actually just know basic scripting, but I'm trying to find ways to learn how to - just like you developers of rAthena. Thank you for your time.
×
×
  • Create New...