// https://rathena.org/board/topic/115277-mvp-ranking-with-rewards-help-please/
/*
create table mvp_rank (
char_id int(11) primary key,
name varchar(23) default '',
mvp_kills int(11) default 0,
key (mvp_kills)
) engine = innodb;
create table mvp_rank_archive (
weekindex int(11),
rank tinyint(4) unsigned,
char_id int(11) unsigned default 0,
name varchar(23) default '',
points int(11) unsigned not null,
key (weekindex)
) engine = myisam;
create table mvp_rank_reward (
char_id int(11),
weekindex int(11),
rank tinyint(4) unsigned,
key (char_id)
) engine = innodb;
*/
prontera,158,183,3 script MVP Ladder 100,{
mes "[MVP Ladder]";
mes "Hello!";
mes "What are you doing here?";
next;
switch( select( "Check rankings.", "My stats.", "Previous Week ranking", "Claim Rewards" ) ) {
mes "[MVP Ladder]";
case 1:
mes "Rankings :->";
.@query$ = "SELECT `name`, IF(@d=t.`mvp_kills`, @r, @r:=@i), @d:=t.`mvp_kills`, @i:=@i+1 ";
.@query$ += "FROM `mvp_rank` t, (SELECT @d:=0, @r:=0, @i:=1)q ";
.@query$ += "ORDER BY `mvp_kills` DESC LIMIT 10";
.@nb = query_sql(.@query$, .@name$, .@rank, .@kills, .@dummy);
if ( !.@nb ) {
mes " No entry.";
close;
}
for ( .@i = 0; .@i < .@nb; ++.@i )
mes .@rank[.@i] +". "+ .@name$[.@i] +" -> "+ .@kills[.@i] +" points";
close;
case 2:
if ( !query_sql( "SELECT `mvp_kills`, 1+(SELECT COUNT(1) FROM `mvp_rank` t1 WHERE t1.`mvp_kills` > t2.`mvp_kills`) FROM `mvp_rank` t2 WHERE `char_id` = "+ getcharid(0), .@kills, .@rank ) ) {
mes "You haven't kill MVP this week";
close;
}
mes "You have killed "+ .@kills +" MVPs";
mes "Your current rank is No."+ .@rank;
close;
case 3:
mes "Previous week ranking :->";
.@nb = query_sql( "select rank, name, points from mvp_rank_archive where weekindex = "+( .this_week_index -1 )+" order by rank", .@rank, .@name$, .@count );
if ( !.@nb ) {
mes " No entry";
close;
}
for ( .@i = 0; .@i < .@nb; ++.@i )
mes .@rank[.@i] +". "+ .@name$[.@i] +" -> "+ .@count[.@i] +" points";
close;
case 4:
.@nb = query_sql( "select weekindex, rank from mvp_rank_reward where char_id = "+ getcharid(0), .@week, .@rank );
if ( !.@nb ) {
mes "You don't have unclaim rewards.";
close;
}
mes "You have ["+ .@nb +"] unclaimed rewards.";
for ( .@i = 0; .@i < .@nb; ++.@i )
mes ( .@i +1 ) +". Rank."+ .@rank[.@i] +" from "+ callfunc( "F_InsertPlural", .this_week_index - .@week[.@i], "week" ) +" ago.";
next;
for ( .@i = 0; .@i < .@nb; ++.@i )
.@menu$[.@i] = "Claim Rank."+ .@rank[.@i] +" from "+ callfunc( "F_InsertPlural", .this_week_index - .@week[.@i], "week" ) +" ago.";
.@s = select( implode( .@menu$, ":" ) ) -1;
if ( checkweight( .reward[ .@rank[.@s] -1 ], .amount[ .@rank[.@s] -1 ] ) == false ) {
mes "You are currently overweight.";
close;
}
getitem .reward[ .@rank[.@s] -1 ], .amount[ .@rank[.@s] -1 ];
query_sql "delete from mvp_rank_reward where char_id = "+ getcharid(0) +" and weekindex = "+ .@week[.@s] +" and rank = "+ .@rank[.@s];
}
close;
OnInit:
// set reward here ... 1st place won 10 red pot, 2nd place won 9 orange pot ... etc ...
setarray .reward, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510;
setarray .amount, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1;
if ( !$mvp_rank_1st_sunday )
query_sql "select curdate() - dayofweek( curdate() ) +1", $mvp_rank_1st_sunday; // TRICK !! how to save the 1st sunday once the script installed
OnSun0000:
query_sql "select datediff( curdate(), '"+ $mvp_rank_1st_sunday +"' ) /7", .this_week_index;
if ( .this_week_index == $mvp_rank_week_index ) end;
.@query$ = "SELECT char_id, `name`, IF(@d=t.`mvp_kills`, @r, @r:=@i), @d:=t.`mvp_kills`, @i:=@i+1 ";
.@query$ += "FROM `mvp_rank` t, (SELECT @d:=0, @r:=0, @i:=1)q ";
.@query$ += "ORDER BY `mvp_kills` DESC LIMIT 10";
.@nb = query_sql(.@query$, .@cid, .@name$, .@rank, .@kills, .@dummy);
if ( .@nb ) {
for ( .@i = 0; .@i < .@nb; ++.@i ) {
.@reward_query$[.@i] = "( "+ .@cid[.@i] +", "+ $mvp_rank_week_index +", "+ .@rank[.@i] +" )";
.@archive_query$[.@i] = "( "+ $mvp_rank_week_index +", "+ .@rank[.@i] +", "+ .@cid[.@i] +", '"+ escape_sql(.@name$[.@i]) +"', "+ .@kills[.@i] +" )";
}
// query_sql "truncate table mvp_rank_archive"; // uncomment this line if you love to periodically clean your data
query_sql "insert into mvp_rank_reward values "+ implode( .@reward_query$, ", " );
query_sql "insert into mvp_rank_archive values "+ implode( .@archive_query$, ", " );
query_sql "truncate table mvp_rank";
}
$mvp_rank_week_index = .this_week_index;
end;
OnNPCKillEvent:
if ( getmonsterinfo( killedrid, MOB_MVPEXP ) ) {
query_sql "insert into mvp_rank values ( "+ getcharid(0) +", '"+ escape_sql( strcharinfo(0) ) +"', 1 ) on duplicate key update name = '"+ escape_sql( strcharinfo(0) )+"', mvp_kills = mvp_kills +1";
query_sql "select mvp_kills from `mvp_rank` where char_id = "+ getcharid(0), .@killed;
dispbottom "~ You've killed "+ .@killed +" MVP. ~";
specialeffect2 EF_HEAL2;
}
end;
}