//===== eAthena Script ===========================================//= Invasion NPC//===== By: ======================================================//= SketchyPhoenix//===== Current Version: =========================================//= 2.1//===== Compatible With: =========================================//= Anything revision not ancient :p//===== Description: =============================================//= Summons every MVP from a list at a random number on a random map.//= There are 3 different types of spawns the invasion supports.//===== Additional Comments: =====================================//= 1.1 Added Invasion Control Panel//= 1.1 Whisper to NPC:Invasion to access the Panel (lv 90 or higher GMs)//= 1.2 Fixed a lot of variables (wrong scope)//= 1.2 Cleared up some script errors | SonicR//= 1.21 Fixed up all the errors I could find after a lot of testing//= 1.21 added array population, event triggers in the panel//= 1.22 Fixed the mob counting issue with invasion type 3//= 1.23 Added a counter setting for invasions type 2 and 3.//= 1.24 Fixed a variable typo for invasion types 2,3 causing unattached rid errors.//= 1.3 Added a time setter (converted the custom WoE Setter to a function) /lazy on//= 1.31 Added invasion type setting to timers and the menu returns to the beginning instead of closing//= 2.1 Added an option to set and remove maps via panel//===== Variable Explanations ====================================//= $mvplist | All our MvPs and Mini Bosses are contained here.//= .@mapname$ | Our list of potential invasion maps.//= .@r | How many times should each monster spawn?//= .clear | Is the event done?//= $alteredlist | When you alter the array list, we dont want it to be overwritten.//= .eventisoff | Prevents the event from starting (various reasons)//= $invtype | Affects how the script spawns the monsters//= .gmreq | Required GM level to use the panel.//= .i_type2_count | Controls how many monsters spawn on invasion type 2//= .i_type3_count | Same for type 3//= $i_map$ | The map randomly chosen earlier is copied to a permanent var so that it can be used by the control panel //===================================================================- script Invasion -1,{end;OnInit:if(.i_type2_count==0)set .i_type2_count, 50; //Don't touch. Just defaults for how many monsters if(.i_type3_count==0)set .i_type3_count, 50; //to spawn on invasions type 2 and 3 use the panel insteadset .gmreq, 50;end;OnMinute00:// starting time checkset $@num,0;L_StartLoop:if($inv_sday[$@num]==0&& $inv_eday[$@num]==0&& $inv_time[$@num]==0&& $inv_time2[$@num]==0)goto L_StartLoopEnd;if(gettime(4)==$inv_sday[$@num]&&gettime(3)>=$inv_time[$@num]&&(gettime(3)<$inv_time2[$@num] || $inv_sday[$@num]!=$inv_eday[$@num]))goto L_Start;set $@num,$@num+1;goto L_StartLoop;// end time checks L_StartLoopEnd:set $@num,0; L_EndLoop:if($inv_eday[$@num]==0&& $inv_time[$@num]==0&& $inv_time2[$@num]==0)end;if((gettime(4)==$inv_eday[$@num])&&(gettime(3)==$inv_time2[$@num]))goto L_End;set $@num,$@num+1;goto L_EndLoop;end;L_Start:if(.clear==1 || agitcheck()==1 || .eventisoff==1)end;if($alteredlist ==0){setarray $mvplist[0],1511,1647,1785,1630,1039,1399,1874,1272,1719,1046,1389,1112,1115,1418,1871,1252,1768,1086,1885,1649,1651,1832,1492,1734,1251,1779,1688,1646,1373,1147,1059,1150,1087,1190,1038,1157,1159,1502,1623,1650,1583,1708,1312,1751,1685,1648,1658,1219,1275,1096,1388,1268,1250,1283,1270,1302,1108,1582,1091,1093,1205,1120,1299,1259,1376,1296,1090,1289,1313,1262,1203,1204,1308,1065,1089,1618,1092,1088,1200;setarray $mapname$[0],"prontera","izlude","geffen","morocc";}L_Event:set .@m, rand(0,getarraysize($mapname$));if(.@m ==getarraysize($mapname$))set .@m, .@m-1; //Simply putting a -1 in the line abouve didn't seem to work so I just used this.set $i_map$, $mapname$[.@m]; //For Panelset .mobcount, 0;set .totalkills, 0;set .@mcount, 0;if($inv_timetype[.@num]==2)goto L_Type2;if($inv_timetype[.@num]==3 || $inv_timetype[.@num]==0)goto L_Type3;L_Type1:if($invtype ==1){for(set .@i,0; .@i < getarraysize($mvplist) ; set .@i,.@i+1){set .@r, rand(1,3);monster $mapname$[.@m],0,0,""+getmonsterinfo($mvplist[.@i],0)+"",$mvplist[.@i],.@r,"Invasion::OnInvasion";set .mobcount, .mobcount+.@r;}}L_Type2:if($invtype ==2){for(set .@b,0; .@b < .i_type2_count ; set .@b,.@b+1){set .@r, rand(1,3);monster $mapname$[.@m],0,0,"Enslaved Minion",-1,.@r,"Invasion::OnInvasion";set .mobcount, .mobcount+.@r;}}L_Type3:if($invtype ==3 || $invtype ==0){for(set .@c,0; .@c < .i_type3_count ; set .@c,.@c+1){set .@r, rand(1,3);if(.@mcount ==10){set .@mr, rand(0,getarraysize($mvplist)-1);monster $mapname$[.@m],0,0,""+getmonsterinfo($mvplist[.@mr],0)+"",$mvplist[.@mr],.@r,"Invasion::OnInvasion";set .mobcount, .mobcount+.@r;set .@mcount, 0;}monster $mapname$[.@m],0,0,"Enslaved Minion",-1,.@r,"Invasion::OnInvasion";set .mobcount, .mobcount+.@r;set .@mcount, .@mcount+1;}}announce"Look out! Monsters are invading!! ("+$mapname$[.@m]+")",0;set .clear, 1;end;OnWhisperGlobal:if(getgmlevel() < .gmreq || @whispervar0$ !="Panel")end;mes"[Invasion NPC Control Panel]";mes"Current List of Monsters Spawned by the Invasion Array.";next;set .@jl, 0;for(set .@j,0; .@j < getarraysize($mvplist) ; set .@j,.@j+1){set .@jl,.@j+1;mes"["+.@jl+"]. "+getmonsterinfo($mvplist[.@j],0)+",";}next;mes"[Invasion NPC Control Panel]";L_PanelMenu:mes"What action would you like to take?";switch(select("Populate Arrays","Add a monster","Remove a monster","Add a map","Remove a map","Set Invasion Count","Set Invasion Type","Disable Events","Trigger Event","Cancel Event","Set Invasion Times")){case1:next;setarray $mvplist[0],1511,1647,1785,1630,1039,1399,1874,1272,1719,1046,1389,1112,1115,1418,1871,1252,1768,1086,1885,1649,1651,1832,1492,1734,1251,1779,1688,1646,1373,1147,1059,1150,1087,1190,1038,1157,1159,1502,1623,1650,1583,1708,1312,1751,1685,1648,1658,1219,1275,1096,1388,1268,1250,1283,1270,1302,1108,1582,1091,1093,1205,1120,1299,1259,1376,1296,1090,1289,1313,1262,1203,1204,1308,1065,1089,1618,1092,1088,1200;setarray $mapname$[0],"prontera","izlude","geffen","morocc";mes"[Invasion NPC Control Panel]";mes"Arrays populated!";next;;goto L_PanelMenu;case2:next;if(getarraysize($mvplist)==128){mes"[Invasion NPC Control Panel]";mes"The list of MVPs is full!";mes"Please delete an MVP from the list first.";close;}mes"[Invasion NPC Control Panel]";mes"Add the monster's ^0000ffID^000000 to the list.";mes"0 = cancel.";input @mobid;next;if(@mobid <=0 || getmonsterinfo(@mobid,1)==-1){mes"[Invasion NPC Control Panel]";mes"Invalid monster or user-cancelled!";close;}setarray $mvplist[getarraysize($mvplist)],@mobid;mes"[Invasion NPC Control Panel]";mes"The monster, "+getmonsterinfo(@mobid,0)+", has been added to the list!";set $alteredlist, 1;next;goto L_PanelMenu;case3:next;mes"[Invasion NPC Control Panel]";mes"Which monster would you like to delete from the list?";mes"(No. on the list | 0 to cancel)";input @l;if(@l <=0){mes"[Invasion NPC Control Panel]";mes"Invalid Entry!";close;}//Have to seperate these checks otherwise there's an error | -1 isn't an index :{set @l, @l-1;if(getmonsterinfo($mvplist[@l],1)==-1){next;mes"[Invasion NPC Control Panel]";mes"Invalid Entry!";close;}next;mes"[Invasion NPC Control Panel]";mes"You have deleted monster, "+getmonsterinfo($mvplist[@l],0)+", from the list!";deletearray $mvplist[@l],1;set $alteredlist, 1;next;goto L_PanelMenu;case4:next;mes"[Invasion NPC Control Panel]";mes"Current List of maps used by the Invasion Array.";next;set .@mnl, 0;for(set .@p,0; .@p < getarraysize($mapname$) ; set .@p,.@p+1){set .@mnl,.@p+1;mes"["+.@mnl+"]. "+$mapname$[.@p]+",";}next; if(getarraysize($mapname$)==128){mes"[Invasion NPC Control Panel]";mes"The list of maps is full!";mes"Please delete a map from the list first.";close;}mes"[Invasion NPC Control Panel]";mes"Add the map to the list.";mes"0 = cancel.";input @mapname$;next;if(@mapname$ =="0" || getmapmobs(@mapname$)==-1){mes"[Invasion NPC Control Panel]";mes"Invalid map or user-cancelled!";close;}setarray $mapname$[getarraysize($mapname$)],@mapname$;mes"[Invasion NPC Control Panel]";mes"The map, "+@mapname$+", has been added to the list!";set $alteredlist, 1;next;goto L_PanelMenu;case5:next;mes"[Invasion NPC Control Panel]";mes"Current List of maps used by the Invasion Array.";next;set .@mnl, 0;for(set .@p,0; .@p < getarraysize($mapname$) ; set .@p,.@p+1){set .@mnl,.@p+1;mes"["+.@mnl+"]. "+$mapname$[.@p]+",";}next;mes"[Invasion NPC Control Panel]";mes"Which map would you like to delete from the list?";mes"(No. on the list | 0 to cancel)";input @map$;if(@map$ =="0"){mes"[Invasion NPC Control Panel]";mes"Cancelled!";next;goto L_PanelMenu;}for(set @b,0; @b < getarraysize($mapname$) ; set @b, @b+1){if($mapname$[@b]== @map$){next;mes"[Invasion NPC Control Panel]";mes"You have deleted map, "+$mapname$[@b]+", from the list!";deletearray $mapname$[@b],1;set $alteredlist, 1;next;goto L_PanelMenu;}}next;mes"[Invasion NPC Control Panel]";mes"Map not found!";next;goto L_PanelMenu;case6:mes"[Invasion NPC Control Panel]";mes"Input the amount of monsters to spawn for invasion type 2. ( 0 to cancel/skip to type 3 )";input .@i_type2_count;if(.@i_type2_count < 1){mes"Invasion Type 2 skipped.";}elseif(.@i_type2_count > 0){set .i_type2_count, .@i_type2_count;mes"Type 2 will now spawn "+.i_type2_count+" monsters.";}next;mes"[Invasion NPC Control Panel]";mes"Input the amount of monsters to spawn for invasion type 3. ( 0 to cancel )";input .@i_type3_count;if(.@i_type3_count < 1){mes"Invasion Type 3 skipped.";}elseif(.@i_type3_count > 0){set .i_type3_count, .@i_type3_count;mes"Type 3 will now spawn "+.i_type3_count+" monsters.";}next;mes"[Invasion NPC Control Panel]";mes"Thank you for using the Invasion Panel!";next;goto L_PanelMenu;case7:next;mes"[Invasion NPC Control Panel]";mes"Invasion Types:";mes"1 - Only monsters from the Invasion Array will spawn.";mes"2 - Only Dead Branch / Bloody Branch monsters will spawn.";mes"3 - Spawns 1 Invasion Array monster for every 10 DB/BB monsters spawned.";next;mes"[Invasion NPC Control Panel]";mes"Which one do you want?";mes"(Number of Invasion type. 0 to cancel)";input $invtype;next;if($invtype <=0 || $invtype >=4){mes"[Invasion NPC Control Panel]";mes"Invalid number or cancelled!";close;}mes"[Invasion NPC Control Panel]";mes"Invasion style "+$invtype+" set!";next;goto L_PanelMenu;case8:next;if(.eventisoff==0){mes"[Invasion NPC Control Panel]";mes"The Invasion events will cease to run until the NPC is reloaded or is set back on.";set .eventisoff, 1;close;}mes"[Invasion NPC Control Panel]";mes"The Invasion events will continue as scheduled.";set .eventisoff, 0;next;goto L_PanelMenu;case9:mes"[Invasion NPC Control Panel]";mes"Now triggering event...";close2;goto L_Event;case10:killmonster $i_map$,"Invasion::OnInvasion";announce"The Invasion Event has been cancelled!",0;set .clear, 0;next;goto L_PanelMenu;case11:callfunc"inv_setter";next;goto L_PanelMenu;case12:mes"[Invasion NPC Control Panel]";mes"Thank you for using Phoenix Invasion.";close;}L_End:if(.clear==1){killmonster $i_map$,"Invasion::OnInvasion";announce"Time has run out! The Invasion has ended!",0;set .clear, 0;end;}OnInvasion:set .totalkills, .totalkills+1;if(.totalkills >= .mobcount){set .clear, 0;announce"Congratulations, the invasion was stopped!",0;end;}end;OnAgitStart:if(.clear==1){killmonster $i_map$,"Invasion::OnInvasion";announce"WoE has begun, the Invasion event has ended!",0;set .clear, 0;end;}}function script inv_setter {mes"[Invasion NPC Control Panel]";mes"Please use this menu to control Invasion Times.";mes"Simply follow the intruction given in each section after this, and it should be set and ready to use";menu"Add an Invasion time",L_Add,"Reset all Invasion times.",L_Reset,"View Current Invasion times",-;mes"[Invasion NPC Control Panel]";mes"Current Invasion times are set for...:-";set .@num,0;L_LoopList:if($inv_sday[.@num]==0&& $inv_eday[.@num]==0&& $inv_time[.@num]==0&& $inv_time2[.@num]==0)goto L_LoopListEnd;if($inv_sday[.@num]==0)set $@inv_tempday$,"Sunday";if($inv_sday[.@num]==1)set $@inv_tempday$,"Monday";if($inv_sday[.@num]==2)set $@inv_tempday$,"Tuesday";if($inv_sday[.@num]==3)set $@inv_tempday$,"Wednesday";if($inv_sday[.@num]==4)set $@inv_tempday$,"Thursday";if($inv_sday[.@num]==5)set $@inv_tempday$,"Friday";if($inv_sday[.@num]==6)set $@inv_tempday$,"Saturday";if($inv_eday[.@num]==0)set $@inv_tempday2$,"Sunday";if($inv_eday[.@num]==1)set $@inv_tempday2$,"Monday";if($inv_eday[.@num]==2)set $@inv_tempday2$,"Tuesday";if($inv_eday[.@num]==3)set $@inv_tempday2$,"Wednesday";if($inv_eday[.@num]==4)set $@inv_tempday2$,"Thursday";if($inv_eday[.@num]==5)set $@inv_tempday2$,"Friday";if($inv_eday[.@num]==6)set $@inv_tempday2$,"Saturday";if($inv_eday[.@num]==$inv_sday[.@num])mes $@inv_tempday$+" from "+$inv_time[.@num]+":00 till "+$inv_time2[.@num]+":00 : Type "+$inv_timetype[.@num];if($inv_eday[.@num]!=$inv_sday[.@num])mes"From "+$@inv_tempday$+" "+$inv_time[.@num]+":00 till "+$@inv_tempday2$+" "+$inv_time2[.@num]+":00 : Type "+$inv_timetype[.@num];set .@num,.@num+1;goto L_LoopList;L_LoopListEnd:return;L_Add:set .@num,0;L_AddLoop:if($inv_sday[.@num]==0&& $inv_eday[.@num]==0&& $inv_time[.@num]==0&& $inv_time2[.@num]==0)goto L_AddLoopEnd;set .@num,.@num+1;goto L_AddLoop;L_AddLoopEnd:mes"[Invasion NPC Control Panel]";mes"What day do you want the Invasion to start ^FF0000start^000000 in?";next;menu"Sunday",-,"Monday",-,"Tuesday",-,"Wednesday",-,"Thursday",-,"Friday",-,"Saturday",-;if(@menu==1)set $inv_sday[.@num],0;if(@menu==2)set $inv_sday[.@num],1;if(@menu==3)set $inv_sday[.@num],2;if(@menu==4)set $inv_sday[.@num],3;if(@menu==5)set $inv_sday[.@num],4;if(@menu==6)set $inv_sday[.@num],5;if(@menu==7)set $inv_sday[.@num],6;mes"[Invasion NPC Control Panel]";mes"Ok, now please enter the hour you want the Invasion to ^FF0000start^000000 at";mes"This is using a 24 hour clock";mes"00 = Midnight";mes"12 = Mid-day";mes"23 = 11pm";next;input .@input;if(.@input < 0 || .@input > 24)goto L_BadNumber;set $inv_time[.@num],.@input;mes"[Invasion NPC Control Panel]";mes"What day do you want the Invasion to start ^FF0000finish^000000 in?";next;menu"Same as start",-,"Sunday",-,"Monday",-,"Tuesday",-,"Wednesday",-,"Thursday",-,"Friday",-,"Saturday",-;if(@menu==1)set $inv_eday[.@num],$inv_sday[@num];if(@menu==2)set $inv_eday[.@num],0;if(@menu==3)set $inv_eday[.@num],1;if(@menu==4)set $inv_eday[.@num],2;if(@menu==5)set $inv_eday[.@num],3;if(@menu==6)set $inv_eday[.@num],4;if(@menu==7)set $inv_eday[.@num],5;if(@menu==8)set $inv_eday[.@num],6;mes"[Invasion NPC Control Panel]";mes"Ok, now please enter the hour you want the Invasion to ^FF0000finish^000000 at";mes"This also uses the 24 hour clock";mes"00 = Midnight";mes"12 = Mid-day";mes"23 = 11pm";next;input .@input;if(.@input < 0 || .@input > 24)goto L_BadNumber;set $inv_time2[.@num],.@input;mes"[Invasion NPC Control Panel]";mes"Set the Invasion Type for this time.";input .@input;if(.@input < 1 || .@input > 3)goto L_BadNumber;set $inv_timetype[.@num],.@input;mes"Your Invasion time has now been set";mes"To confirm this, ask me to show you the ^FF0000'Current Invasion times'^000000";return;L_Reset:mes"[Invasion NPC Control Panel]";mes"You are about to reset all the set Invasion times you have created";mes"Are you sure?";next;menu"No, what was I thinking",L_No,"Yes I really want to do it",-;if(.clear==1)goto L_InvOn;deletearray $inv_sday[0],200;deletearray $inv_eday[0],200;deletearray $inv_time[0],200;deletearray $inv_time2[0],200; mes"[Invasion NPC Control Panel]";mes"They are all gone now, please remember to set new ones";return;L_InvOn:mes"[Invasion NPC Control Panel]";mes"Sorry, since there is a Invasion in progress you cannot reset the Invasion times";return;L_No:mes"[Invasion NPC Control Panel]";mes"Oh, good, come back whenever";return;L_BadNumber:mes"[Invasion NPC Control Panel]";mes"Sorry that was an invalid number, please try again";return;}//Blacklist :: The following servers are prohibited from using this script//AkinaRO