// Configure 'flagmaps' table using this custom flags
// 1: PvP
// 2: PvP No Party
// 4: PvP No Guild
// 8: GvG
// 16: GvG No Party
// 32: No Skill
// 64: Nightmare Drops (only rAthena)
// Function to Set / Unset the World Map Flags
function script applyMapFlags {
set $@MapFlagStatus,getarg(0);
set .@Cnt,0;
do {
set .@Rows, query_sql("select map, flag from flagmaps where flag > 0 limit " + .@Page + ",100", .@Map$, .@Flags);
set .@Flag, .@Flags[0];
for (set .@x,0; .@x < .@Rows; set .@x, .@x + 1) {
set .@SelectedMap$, .@Map$[.@x];
if ($@MapFlagStatus) {
if (.@Flag & 1) setmapflag .@SelectedMap$, mf_pvp;
if (.@Flag & 2) setmapflag .@SelectedMap$, mf_pvp_noparty;
if (.@Flag & 4) setmapflag .@SelectedMap$, mf_pvp_noguild;
if (.@Flag & 8) setmapflag .@SelectedMap$, mf_gvg;
if (.@Flag & 16) setmapflag .@SelectedMap$, mf_gvg_noparty;
if (.@Flag & 32) setmapflag .@SelectedMap$, mf_noskill;
if (.@Flag & 64) setmapflag .@SelectedMap$, mf_nightmaredrop;
} else {
if (.@Flag & 1) removemapflag .@SelectedMap$, mf_pvp;
if (.@Flag & 2) removemapflag .@SelectedMap$, mf_pvp_noparty;
if (.@Flag & 4) removemapflag .@SelectedMap$, mf_pvp_noguild;
if (.@Flag & 8) removemapflag .@SelectedMap$, mf_gvg;
if (.@Flag & 16) removemapflag .@SelectedMap$, mf_gvg_noparty;
if (.@Flag & 32) removemapflag .@SelectedMap$, mf_noskill;
if (.@Flag & 64) removemapflag .@SelectedMap$, mf_nightmaredrop;
}
}
set .@Page, .@Page + 100; // Move to the Next Page
} while(.@Rows);
return;
}
// Broadcast
- script MFBC -1,{
OnInit:
setarray .msgs$[0],
"The night is slowly taking over Rune midgard.","^FF4848",
"Weaklings and cowards stay in towns, while fierce warriors grab their weapons and prepare for bloody fights....","^FF4848",
"Players whose level is lower than lv40 can't kill/be killed by other players during NMM","^0080FF";
end;
Ontimer1000:
for (set .@m,0; .@m < getarraysize(.msgs$); set .@m, .@m + 2) {
announce .msgs$[.@m],bc_all,.msgs$[.@m + 1];
sleep 5000;
}
stopnpctimer;
}
// Map Flag Manager
- script MFM -1,{
ceroLeft:
set .@Num$, getarg(0);
while (getstrlen(.@Num$) < getarg(1)) {
set .@Num$, "0" + .@Num$;
}
return .@Num$;
setRates:
setbattleflag "base_exp_rate", getarg(0);
setbattleflag "job_exp_rate", getarg(1);
atcommand "@reloadmobdb";
return;
OnInit:
set .baseexp, getbattleflag("base_exp_rate");
set .jobexp, getbattleflag("job_exp_rate");
// Sample Configuration: These pairs of numbers are hours with minutes
// (23:00 to 00:00 - 00:00 to 03:30 - 15:47 to 15:48)
// Don't mix hours of two days (ie: "2300","0330") because doesn't work, in this cases add 2 consecutive ranges: "2300","2359","0000","0100"
setarray .Changes$[0],"0300","0315","0600","0615","0900","0915","1200","1215","1500","1515","1800","1815","2100","2115","0000","0015","2202","2235";
set .Count, getarraysize(.Changes$);
sleep 2000;
OnWhisperGlobal:
OnTimer60000: // Check every 1 minute (support restarts)
set .@PKEnable,0;
for (set .@x,0; .@x < .Count; set .@x, .@x + 2) {
set .@CurrentHour$, callsub(ceroLeft,gettime(3),2) + callsub(ceroLeft,gettime(2),2);
set .@Hour1$, .Changes$[.@x];
set .@Hour2$, .Changes$[.@x + 1];
// If this is a valid range...
if (.@CurrentHour$ >= .@Hour1$ && .@CurrentHour$ <= .@Hour2$) {
set .@PKEnable,1;
if (!$@MapFlagStatus) {
night;
initnpctimer "MFBC"; // Broadcast in a separated thread
debugmes "[" + .@CurrentHour$ + "] Enabling Nightmare Flags [" + .@Hour1$ + " to " + .@Hour2$ + "]";
callfunc "applyMapFlags",1; // Activating Map Flags
mapwarp "pvp_y_1-2","prontera",155,180; //warps the players in the pvp map
callsub setRates, (2 * .baseexp), (2 * .jobexp);
}
}
}
// If there are not valid ranges but the nightmare mode is enabled...
if (!.@PKEnable && $@MapFlagStatus) {
debugmes "[" + .@CurrentHour$ + "] Disabling Nightmare Flags [" + .@Hour1$ + " to " + .@Hour2$ + "]";
callfunc "applyMapFlags",0; // Disabling Map Flags
day;
announce "Nightmares: A new day is starting, you had sweet dreams ? Nightmare Mode deactivated! .",bc_all;
callsub setRates, .baseexp, .jobexp;
}
initnpctimer;
end;
OnPCDieEvent:
if (!$@MapFlagStatus) end;
callfunc "PenaltyBaseExp", (killerrid > 1999999?2:1);
}
function script PenaltyBaseExp {
if (BaseExp) {
set BaseExp, BaseExp - (BaseExp / 100 * getarg(0));
announce "~ Nightmare Penalty: -" + getarg(0) + "% Base Exp", bc_self, 0xEAC8E7;
}
return;
}