// Global variables: // $SPD_Enable Event enabled? // $SPD_HourMax Maximum of boxes spawned per hour [config] // $SPD_HourLeft Number of boxes left this hour // $SPD_Boxes Number of boxes currently around // $SPD_BoxesFound Number of boxes found // $SPD_BoxesMinGlobal Minimum amount of bloxes spawned [config] // $SPD_BoxesMaxGlobal Maximum ~ [config] // $SPD_LeprechCnt Default number of leprechauns on the treasure map [config] gm_in,135,75,4 script PatsEvent 954,{ mes "[St. Patricks Event]"; if( $SPD_Enable ) mes "Event is ^00ff00Enabled^000000"; else mes "Event is ^ff0000Disabled^000000"; mes " "; mes "Password hint:"; mes "will i ever be there again? if so, only with you."; input @pw$; if( @pw$ != "tri metri" ) { next; mes "[St. Patricks Event]"; mes "^ff0000I doubt you will.^000000"; close; } S_MENU: next; mes "[St. Patricks Event]"; if( $SPD_Enable ) mes "Event status: ^00ff00Enabled^000000"; else mes "Event status: ^ff0000Disabled^000000"; mes "Boxes around: " + $SPD_Boxes; mes "Boxes found: " + $SPD_BoxesFound; next; switch( select("View box locations", "Relocate boxes", "Spawn settings", "Enable/Disable", "Cancel") ) { case 1: // Box locations mes "[St. Patricks Event]"; if( $SPD_Boxes ) { for(set .@i,0; .@i < 50; set .@i, .@i + 1) { if( getd("$SPD_BoxUsed" + .@i) == 1 ) { mes "Box ^ff0000" + .@i + "^000000: " + getd("$SPD_Box"+.@i+"Map$") + " [" + getd("$SPD_Box"+.@i+"X") + " " + getd("$SPD_Box"+.@i+"Y")+"]"; } } } else { mes "There are no boxes around."; } goto S_MENU; case 2: // Relocate mes "[St. Patricks Event]"; mes "What box do you want to reset?"; next; input .@i; mes "[St. Patricks Event]"; if( getd("$SPD_BoxUsed" + .@i) != 1 ) { mes "^ff0000This box is now spawned at the moment.^000000"; goto S_MENU; } callfunc "DespawnBox", .@i; callfunc "SpawnBox"; mes "Respawned."; goto S_MENU; case 3: // Spawn settings SPAWN_SETTINGS: mes "[St. Patricks Event]"; mes "Leprechaun count: ^ff0000" + $SPD_LeprechCnt + "^000000."; mes "Max. overall boxes: ^ff0000" + $SPD_BoxesMaxGlobal + "^000000."; mes "Max. boxes per hour: ^ff0000" + $SPD_HourMax + "^000000."; mes "Quick respawn number: ^ff0000" + $SPD_BoxesMinGlobal + "^000000"; next; switch( select("Leprechaun Count", "Max overall boxes", "Max per hour", "Quick respawn value", "Cancel") ) { case 1: input $SPD_LeprechCnt; if( $SPD_LeprechCnt == 0 ) set $SPD_LeprechCnt, 15; break; case 2: input $SPD_BoxesMaxGlobal; if( $SPD_BoxesMaxGlobal == 0 ) set $SPD_BoxesMaxGlobal, 42; break; case 3: input $SPD_HourMax; if( $SPD_HourMax == 0 ) set $SPD_HourMax, 5; break; case 4: input $SPD_BoxesMinGlobal; if( $SPD_BoxesMinGlobal == 0 ) set $SPD_BoxesMinGlobal, 20; case 5: goto S_MENU; } if( select("Done", "Continue") == 1 ) goto S_MENU; else goto SPAWN_SETTINGS; case 4: // Enable / Disable mes "[St. Patricks Event]"; if( $SPD_Enable ) { mes "Do you want to ^ff0000disable^000000 the event?"; mes "Disabling it will remove all boxes."; } else { mes "Do you want to ^00ff00enable^000000 the event?"; } if( select("No", "Yes") == 2 ) { if( $SPD_Enable ) { set $SPD_Enable, 0; callfunc "RemovePatsBoxes"; mes "Event ^ff0000disabled^000000."; } else { set $SPD_Enable, 1; set $SPD_HourLeft, $SPD_HourMax; callfunc "SpawnPatsBoxes"; mes "Event ^00ff00enabled^000000."; } } goto S_MENU; case 5: // Cancel close; } close; OnInit: initnpctimer; callfunc "InitPatsDay"; end; end; OnTimer240000: if( $SPD_Boxes > $SPD_BoxesMinGlobal ) end; OnTimer1000: for( set .@i,0; .@i<50; set .@i,.@i+1) { if( getd("$SPD_BoxUsed"+.@i) == 1 && (gettimetick(2) - getd("$SPD_Box"+.@i+"T")) > 1800 ) { callfunc "DespawnBox", .@i; callfunc "SpawnBox"; } } if( $SPD_Enable != 1 ) end; if( $SPD_Boxes < $SPD_BoxesMaxGlobal ) { if( $SPD_HourLeft > 0 || ($SPD_Boxes < $SPD_BoxesMinGlobal && $SPD_HourLeft > (-$SPD_HourMax / 2)) ) { callfunc "SpawnBox"; set $SPD_HourLeft, $SPD_HourLeft - 1; } } end; OnTimer480000: // Love you too, eAthena setnpctimer 0; stopnpctimer; initnpctimer; end; OnMinute00: if( $SPD_Enable != 1 ) end; set $SPD_HourLeft, $SPD_HourMax; if( gettime(3) % 2 == 0 ) announce "Keep your eyes open for leprechauns! They might have precious treasures!", bc_all; end; } function script DespawnByPos { for( set .@i,0; .@i<50; set .@i, .@i + 1) { if( getd("$SPD_Box"+.@i+"Map$") == getarg(0) ) { callfunc "DespawnBox", .@i; return 1; } } return 0; } function script DespawnBox { // DEBUG //announce "Box " + getarg(0) + " despawned.", bc_all; donpcevent "PatsBox" + getarg(0) + "::OnDisable"; set $SPD_Boxes, $SPD_Boxes - 1; setd "$SPD_BoxUsed" + getarg(0), 0; setd "$SPD_Box" + getarg(0) + "Map$", ""; setd "$SPD_Box" + getarg(0) + "X", 0; setd "$SPD_Box" + getarg(0) + "Y", 0; return; } function script RemovePatsBoxes { for(set .@i,0; .@i<50; set .@i,.@i+1) { callfunc "DespawnBox", .@i; } return; } function script SpawnPatsBoxes { while( $SPD_Boxes < $SPD_BoxesMinGlobal ) { callfunc "SpawnBox"; } return; } function script InitPatsDay { if( $SPD_BoxesMinGlobal == 0 ) set $SPD_BoxesMinGlobal, 20; if( $SPD_BoxesMaxGlobal == 0 ) set $SPD_BoxesMaxGlobal, 45; set $SPD_Boxes, 0; if( $SPD_LeprechCnt == 0 ) set $SPD_LeprechCnt, 15; set $SPD_Enable, 0; if( $SPD_HourMax == 0 ) set $SPD_HourMax, 5; for(set .@i,0; .@i<$SPD_BoxesMaxGlobal; set .@i,.@i+1) { setd "$SPD_BoxUsed" + .@i, 0; setd "$SPD_Box"+.@i+"Map$", ""; setd "$SPD_Box"+.@i+"X", 0; setd "$SPD_Box"+.@i+"Y", 0; } for(set .@i,0; .@i<=140; set .@i,.@i+1) setd "$SPD_MapT" + .@i, 0; set $SPD_MapN0$, "alberta"; set $SPD_MapN1$, "alb_ship"; set $SPD_MapN2$, "alb2trea"; set $SPD_MapN3$, "gef_fild00"; set $SPD_MapN4$, "gef_fild01"; set $SPD_MapN5$, "gef_fild02"; set $SPD_MapN6$, "gef_fild03"; set $SPD_MapN7$, "gef_fild04"; set $SPD_MapN8$, "gef_fild05"; set $SPD_MapN9$, "gef_fild06"; set $SPD_MapN10$, "gef_fild07"; set $SPD_MapN11$, "gef_fild08"; set $SPD_MapN12$, "gef_fild09"; set $SPD_MapN13$, "gef_fild10"; set $SPD_MapN14$, "gef_fild11"; set $SPD_MapN15$, "gef_fild12"; set $SPD_MapN16$, "gef_fild13"; set $SPD_MapN17$, "gef_fild14"; set $SPD_MapN18$, "geffen"; set $SPD_MapN19$, "izlude"; set $SPD_MapN20$, "izlu2dun"; set $SPD_MapN21$, "moc_fild01"; set $SPD_MapN22$, "moc_fild02"; set $SPD_MapN23$, "moc_fild03"; set $SPD_MapN24$, "moc_fild07"; set $SPD_MapN25$, "moc_fild11"; set $SPD_MapN26$, "moc_fild12"; set $SPD_MapN27$, "moc_fild13"; set $SPD_MapN28$, "moc_fild16"; set $SPD_MapN29$, "moc_fild17"; set $SPD_MapN30$, "moc_fild18"; set $SPD_MapN31$, "moc_fild19"; set $SPD_MapN32$, "moc_fild20"; set $SPD_MapN33$, "moc_ruins"; set $SPD_MapN34$, "morocc"; set $SPD_MapN35$, "pay_arche"; set $SPD_MapN36$, "pay_fild01"; set $SPD_MapN37$, "pay_fild02"; set $SPD_MapN38$, "pay_fild03"; set $SPD_MapN39$, "pay_fild04"; set $SPD_MapN40$, "pay_fild05"; set $SPD_MapN41$, "pay_fild06"; set $SPD_MapN42$, "pay_fild07"; set $SPD_MapN43$, "pay_fild08"; set $SPD_MapN44$, "pay_fild09"; set $SPD_MapN45$, "pay_fild10"; set $SPD_MapN46$, "pay_fild11"; set $SPD_MapN47$, "prontera"; set $SPD_MapN48$, "prt_fild01"; set $SPD_MapN49$, "prt_fild02"; set $SPD_MapN50$, "prt_fild03"; set $SPD_MapN51$, "prt_fild04"; set $SPD_MapN52$, "prt_fild05"; set $SPD_MapN53$, "prt_fild06"; set $SPD_MapN54$, "prt_fild07"; set $SPD_MapN55$, "prt_fild08"; set $SPD_MapN56$, "prt_fild09"; set $SPD_MapN57$, "prt_fild10"; set $SPD_MapN58$, "prt_fild11"; set $SPD_MapN59$, "xmas"; set $SPD_MapN60$, "xmas_fild01"; set $SPD_MapN61$, "cmd_fild01"; set $SPD_MapN62$, "cmd_fild02"; set $SPD_MapN63$, "cmd_fild03"; set $SPD_MapN64$, "cmd_fild04"; set $SPD_MapN65$, "cmd_fild05"; set $SPD_MapN66$, "cmd_fild06"; set $SPD_MapN67$, "cmd_fild07"; set $SPD_MapN68$, "cmd_fild08"; set $SPD_MapN69$, "cmd_fild09"; set $SPD_MapN70$, "comodo"; set $SPD_MapN71$, "tur_dun01"; set $SPD_MapN72$, "yuno"; set $SPD_MapN73$, "yuno_fild01"; set $SPD_MapN74$, "yuno_fild02"; set $SPD_MapN75$, "yuno_fild03"; set $SPD_MapN76$, "yuno_fild04"; set $SPD_MapN77$, "amatsu"; set $SPD_MapN78$, "gonryun"; set $SPD_MapN79$, "umbala"; set $SPD_MapN80$, "um_fild01"; set $SPD_MapN81$, "um_fild02"; set $SPD_MapN82$, "um_fild03"; set $SPD_MapN83$, "um_fild04"; set $SPD_MapN84$, "payon"; set $SPD_MapN85$, "ayothaya"; set $SPD_MapN86$, "einbroch"; set $SPD_MapN87$, "einbech"; set $SPD_MapN88$, "ein_fild04"; set $SPD_MapN89$, "ein_fild03"; set $SPD_MapN90$, "ein_fild06"; set $SPD_MapN91$, "ein_fild07"; set $SPD_MapN92$, "ein_fild08"; set $SPD_MapN93$, "ein_fild09"; set $SPD_MapN94$, "ein_fild10"; set $SPD_MapN95$, "lhz_fild02"; set $SPD_MapN96$, "lhz_fild03"; set $SPD_MapN97$, "yuno_pre"; set $SPD_MapN98$, "lhz_fild01"; set $SPD_MapN99$, "lighthalzen"; set $SPD_MapN100$, "hu_fild07"; set $SPD_MapN101$, "hu_fild05"; set $SPD_MapN102$, "hu_fild04"; set $SPD_MapN103$, "hu_fild01"; set $SPD_MapN104$, "yuno_fild06"; set $SPD_MapN105$, "hugel"; set $SPD_MapN106$, "odin_tem01"; set $SPD_MapN107$, "odin_tem02"; set $SPD_MapN108$, "odin_tem03"; set $SPD_MapN109$, "hu_fild02"; set $SPD_MapN110$, "hu_fild03"; set $SPD_MapN111$, "hu_fild06"; set $SPD_MapN112$, "ein_fild01"; set $SPD_MapN113$, "ein_fild02"; set $SPD_MapN114$, "ein_fild05"; set $SPD_MapN115$, "yuno_fild10"; set $SPD_MapN116$, "rachel"; set $SPD_MapN117$, "ra_fild01"; set $SPD_MapN118$, "ra_fild02"; set $SPD_MapN119$, "ra_fild03"; set $SPD_MapN120$, "ra_fild04"; set $SPD_MapN121$, "ra_fild05"; set $SPD_MapN122$, "ra_fild06"; set $SPD_MapN123$, "ra_fild07"; set $SPD_MapN124$, "ra_fild08"; set $SPD_MapN125$, "ra_fild09"; set $SPD_MapN126$, "ra_fild10"; set $SPD_MapN127$, "ra_fild11"; set $SPD_MapN128$, "ra_fild12"; set $SPD_MapN129$, "ra_fild13"; set $SPD_MapN130$, "veins"; set $SPD_MapN131$, "ve_fild01"; set $SPD_MapN132$, "ve_fild02"; set $SPD_MapN133$, "ve_fild03"; set $SPD_MapN134$, "ve_fild04"; set $SPD_MapN135$, "ve_fild05"; set $SPD_MapN136$, "ve_fild06"; set $SPD_MapN137$, "ve_fild07"; set $SPD_MapN138$, "moscovia"; set $SPD_MapN139$, "mosk_fild01"; set $SPD_MapN140$, "mosk_fild02"; } // 0 - ignore timeouts function script RandomMap { set .@i, 0; while( .@i < 10 ) { set .@i, .@i + 1; set .@r, rand(0, 140); if( getarg(0,0) == 1 && (gettimetick(2) - getd("$SPD_MapT" + .@r)) < 5400 ) continue; setd "$SPD_MapT" + .@r, gettimetick(2); return getd("$SPD_MapN" + .@r + "$"); } set $SPD_MapT71, gettimetick(2); return $SPD_MapN71$; } function script UnusedBox { for(set .@i, 0; .@i < 50; set .@i, .@i + 1) { if( getd("$SPD_BoxUsed" + .@i) == 0 ) { setd "$SPD_BoxUsed" + .@i, 1; return .@i; } } return -1; } // Spawns one box function script SpawnBox { set .@box, callfunc("UnusedBox"); if( .@box == -1 ) { // wtf? end; } set .@map$, callfunc("RandomMap"); set .@xy, movenpcex("PatsBox" + .@box, .@map$, 0, 0); set .@x, .@xy >> 10; set .@y, .@xy & 0x3FF; setd "$SPD_Box" + .@box + "T", gettimetick(2); setd "$SPD_Box" + .@box + "Map$", .@map$; setd "$SPD_Box" + .@box + "X", .@x; setd "$SPD_Box" + .@box + "Y", .@y; donpcevent "PatsBox" + .@box + "::OnEnable"; set $SPD_Boxes, $SPD_Boxes + 1; // DEBUG //announce "Boxes spawned on " + .@map$, bc_all; return; } gm_in,2,1,0 script #::PatsBox0 139,{ end; OnDisable: getmapxy .@map$, .@x, .@y, 1; killmonster .@map$, strnpcinfo(3) + "::OnLepDead_small"; killmonster .@map$, strnpcinfo(3) + "::OnMobDead"; stopnpctimer; disablenpc strnpcinfo(3); end; OnEnable: getmapxy .@map$, .@x, .@y, 1; monster .@map$, 0, 0, "Leprechaun", 2002, $SPD_LeprechCnt, strnpcinfo(3) + "::OnLepDead_small"; enablenpc strnpcinfo(3); initnpctimer; end; OnTimer5000: getmapxy .@map$, .@x, .@y, 1; specialeffect 410; stopnpctimer; initnpctimer; end; OnLepDead_small: getmapxy .@map$, .@x, .@y, 1; killmonster .@map$, strnpcinfo(3) + "::OnLepDead_small"; dispbottomex "You cought a leprechaun! It's treasure must be somewhere on this map...", 0xEEF44C; monster .@map$, .@x, .@y, "Treasure Box", 2001, 1, strnpcinfo(3) + "::OnMobDead"; end; OnMobDead: if( playerattached() ) set BoxesKilled, BoxesKilled + 1; getmapxy .@map$, .@x, .@y, 1; set $SPD_BoxesFound, $SPD_BoxesFound + 1; callfunc "DespawnByPos", .@map$, .@x, .@y; end; } gm_in,129,59,0 duplicate(PatsBox0) #::PatsBox89 139 gm_in,130,59,0 duplicate(PatsBox0) #::PatsBox90 139 gm_in,1,1,0 duplicate(PatsBox0) #::PatsBox1 139 gm_in,1,2,0 duplicate(PatsBox0) #::PatsBox2 139 gm_in,1,3,0 duplicate(PatsBox0) #::PatsBox3 139 gm_in,1,4,0 duplicate(PatsBox0) #::PatsBox4 139 gm_in,1,5,0 duplicate(PatsBox0) #::PatsBox5 139 gm_in,1,6,0 duplicate(PatsBox0) #::PatsBox6 139 gm_in,1,7,0 duplicate(PatsBox0) #::PatsBox7 139 gm_in,1,8,0 duplicate(PatsBox0) #::PatsBox8 139 gm_in,1,9,0 duplicate(PatsBox0) #::PatsBox9 139 gm_in,1,10,0 duplicate(PatsBox0) #::PatsBox10 139 gm_in,1,11,0 duplicate(PatsBox0) #::PatsBox11 139 gm_in,1,12,0 duplicate(PatsBox0) #::PatsBox12 139 gm_in,1,13,0 duplicate(PatsBox0) #::PatsBox13 139 gm_in,1,14,0 duplicate(PatsBox0) #::PatsBox14 139 gm_in,1,15,0 duplicate(PatsBox0) #::PatsBox15 139 gm_in,1,16,0 duplicate(PatsBox0) #::PatsBox16 139 gm_in,1,17,0 duplicate(PatsBox0) #::PatsBox17 139 gm_in,1,18,0 duplicate(PatsBox0) #::PatsBox18 139 gm_in,1,19,0 duplicate(PatsBox0) #::PatsBox19 139 gm_in,1,20,0 duplicate(PatsBox0) #::PatsBox20 139 gm_in,1,21,0 duplicate(PatsBox0) #::PatsBox21 139 gm_in,1,22,0 duplicate(PatsBox0) #::PatsBox22 139 gm_in,1,23,0 duplicate(PatsBox0) #::PatsBox23 139 gm_in,1,24,0 duplicate(PatsBox0) #::PatsBox24 139 gm_in,1,25,0 duplicate(PatsBox0) #::PatsBox25 139 gm_in,1,26,0 duplicate(PatsBox0) #::PatsBox26 139 gm_in,1,27,0 duplicate(PatsBox0) #::PatsBox27 139 gm_in,1,28,0 duplicate(PatsBox0) #::PatsBox28 139 gm_in,1,29,0 duplicate(PatsBox0) #::PatsBox29 139 gm_in,1,30,0 duplicate(PatsBox0) #::PatsBox30 139 gm_in,1,31,0 duplicate(PatsBox0) #::PatsBox31 139 gm_in,1,32,0 duplicate(PatsBox0) #::PatsBox32 139 gm_in,1,33,0 duplicate(PatsBox0) #::PatsBox33 139 gm_in,1,34,0 duplicate(PatsBox0) #::PatsBox34 139 gm_in,1,35,0 duplicate(PatsBox0) #::PatsBox35 139 gm_in,1,36,0 duplicate(PatsBox0) #::PatsBox36 139 gm_in,1,37,0 duplicate(PatsBox0) #::PatsBox37 139 gm_in,1,38,0 duplicate(PatsBox0) #::PatsBox38 139 gm_in,1,39,0 duplicate(PatsBox0) #::PatsBox39 139 gm_in,1,40,0 duplicate(PatsBox0) #::PatsBox40 139 gm_in,1,41,0 duplicate(PatsBox0) #::PatsBox41 139 gm_in,1,42,0 duplicate(PatsBox0) #::PatsBox42 139 gm_in,1,43,0 duplicate(PatsBox0) #::PatsBox43 139 gm_in,1,44,0 duplicate(PatsBox0) #::PatsBox44 139 gm_in,1,45,0 duplicate(PatsBox0) #::PatsBox45 139 gm_in,1,46,0 duplicate(PatsBox0) #::PatsBox46 139 gm_in,1,47,0 duplicate(PatsBox0) #::PatsBox47 139 gm_in,1,48,0 duplicate(PatsBox0) #::PatsBox48 139 gm_in,1,49,0 duplicate(PatsBox0) #::PatsBox49 139