existence_dev92

Untitled

Oct 9th, 2018
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 58.34 KB | None | 0 0
  1. //===== rAthena Script =======================================
  2. //= World Boss Event
  3. //===== By: ==================================================
  4. //= Musika6988, Sehrentos
  5. //===== Current Version: =====================================
  6. //= 2.9b
  7. //===== Compatible With: =====================================
  8. //= rAthena Project
  9. //===== Description: =========================================
  10. //= Summon random World Boss and when defeated get treasure.
  11. //= Leader will have option to distribute or dispose loots.
  12. //= GM panel: info/start/stop/skip/lootMode/modify.
  13. //= Boss HP will increase or decrease by 1.500.000 per each
  14. //= player nearby and is updated every 10 seconds.
  15. //= When boss is defeated it will trigger increased exp and
  16. //= drop rates to whole server for 1 hour(IF enabled).
  17. //===== Additional Comments: =================================
  18. //= 1.x Initial script by Musika6988.
  19. //= 2.0 Sehrentos added reward arrays. Randomly select a reward.
  20. //= 2.1 Sehrentos changed single random reward into random all rewards.
  21. //= 2.2 Sehrentos minor optimizations.
  22. //= 2.3 Sehrentos added more loot options.
  23. //= 2.4 Sehrentos added GM panel, Default mob attributes(.MOB_),
  24. //= Same party check(reward stealing)
  25. //= 2.5 Sehrentos added NPC WorldBossRadar to monitor players nearby,
  26. //= Removed Flee and Perfect Dodge from Treasure Chest,
  27. //= Added timeout to stop the event. Minor text changes.
  28. //= 2.6 Sehrentos added loot mode 1 give one reward to one random party member.
  29. //= Added loot modes 4-5 give all/one rewards to all nearby players and their party members.
  30. //= Added loot modes 6-7 give all/one rewards to all nearby players.
  31. //= 2.7 Sehrentos removed Treasure Chest monster.
  32. //= Added Treasure Chest NPCs.
  33. //= Added multiple events at once, but not in same map.
  34. //= Added loot modes 8-9 give all/one rewards to all players in same map.
  35. //= Added double server rates for 1 hour after boss is killed event.
  36. //= 2.8 Sehrentos added jump_zero optimizations.
  37. //= Fixed WorldBossRates::OnInit first run on the server.
  38. //= Added $@WB_ACCESS_EXPIRE timer. Clean the access array when it expires.
  39. //= 2.9 Sehrentos WorldBossRadar enable/disable option.
  40. //= Added loot modes 10 give all rewards to selected party member.
  41. //= Added loot modes 11 give one random reward to selected party member.
  42. //= 2.9b Sehrentos Fixes and additions.
  43. //= Added option to turn off mapflags.
  44. //= Added more default .MOB_ status points.
  45. //= Fix random reward will be selected only once, to avoid abuse ($@WB_REWARD_INDEX).
  46. //= Renamed some values. easier to understand.
  47. //= !TODO: Loot mode 12 give each reward to selected party member one by one.
  48. //= !TODO: When player is not attached on kill event, reset mapflags, update event arrays.
  49. //============================================================
  50. - script WorldBoss -1,{
  51. end;
  52.  
  53. OnInit:
  54. // Settings
  55. .npc_name$ = strnpcinfo(0); // Name of this NPC
  56. .event_sleep = 60000; // Event sleep time in milliseconds(60000 = 1 minute)
  57. .event_timeout = 7200000; // Event timeout time in milliseconds before Boss is disabled(60000 = 1 minute)
  58. .event_access_expire = 900000; // Event access expire time in milliseconds(60000 = 1 minute)
  59.  
  60. // Reward distribution
  61. .loot_mode = 4; // Event loot distribution mode. Look npc_loot_mode_desc for descriptions
  62. .loop_max = 100; // Maximum number of loops (When selecting a random party member)
  63. .duplicate_npc_count = 9; // Number of duplicate Treasure Chest NPC's (Important! 0 counts as well)
  64.  
  65. // Experience increases during event
  66. .base_exp_multiplier = 3; // Event base exp rating multiplier
  67. .job_exp_multiplier = 3; // Event job exp rating multiplier
  68. .use_floating_rates = 0; // Increase servers exp and drop rates for 1 hour after boss kill(0=Disable, 1=Enable)
  69.  
  70. // Monsters default attributes
  71. .MOB_MAXHP = 100000000; // How much HP can monster have at maximum
  72. .MOB_HP = 5000000; // How much HP monster has on spawn
  73. .MOB_SPEED = 130; // Speed
  74. .MOB_CRIT = 450; // Crit rate (1000=100%)
  75. .MOB_HIT = 300; // Hit rate
  76. .MOB_ATKMIN = 1000; // Base Attack Minimum
  77. .MOB_ATKMAX = 4000; // Base Attack Maximum
  78. .MOB_MATKMIN = 1000; // Magic Attack Minimum
  79. .MOB_MATKMAX = 4000; // Magic Attack Maximum
  80. .MOB_DEF = 35; // Defence
  81. .MOB_MDEF = 35; // Magic Defence
  82. .MOB_FLEE = 200; // Flee rate
  83. .MOB_PDODGE = 60; // Perfect Dodge
  84. .MOB_STR = 150; // Stat strength
  85. .MOB_AGI = 150; // Stat agility
  86. .MOB_VIT = 150; // Stat vitality
  87. .MOB_INT = 150; // Stat intellect
  88. .MOB_DEX = 150; // Stat dexterity
  89. .MOB_LUK = 150; // Stat luck
  90.  
  91. // Floating monster HP
  92. // When player is detected near the mob, update it's HP.
  93. .use_radar = 1; // 0=Disable, 1=Enable
  94.  
  95. // Mapflags fog, effects, monster status, party lock, etc.
  96. .use_mapflags = 1; // 0=Disable, 1=Enable
  97.  
  98. // Event monster ID's
  99. setarray .event_mobs[0],
  100. 1093, // Eclipse
  101. 1096, // Angeling
  102. 1120, // Ghostring
  103. 1388, // Archangeling
  104. 1582, // Deviling
  105. 1795; // Bloody Knight
  106.  
  107. // Event reward ID's (One random array is selected)
  108. setarray .loots_0, 501, 502, 503, 504, 505, 506;
  109. setarray .loots_1, 507, 508, 509, 510, 511, 512;
  110. setarray .loots_2, 513, 514, 515, 516, 517, 518;
  111. setarray .loots_3, 519, 520, 521, 522, 523, 525;
  112.  
  113. // Event reward ID's array size (Important!)
  114. // If you add more loots_<Number> arrays. You must change this accordingly.
  115. // Index start from 0
  116. .loots_count = 3;
  117.  
  118. // Event map names
  119. setarray .event_maps$[0],
  120. "prontera", "morocc", "geffen", "payon",
  121. "alberta", "aldebaran", "xmas", "comodo",
  122. "yuno", "amatsu", "gonryun", "umbala",
  123. "louyang", "ayothaya", "einbroch", "hugel",
  124. "rachel", "veins", "moscovia";
  125.  
  126. // Event loot distribution mode description
  127. setarray .loot_mode_desc$[0],
  128. "Give all rewards to all party members", // .loot_mode = 0
  129. "Give one reward to one random party member", // .loot_mode = 1
  130. "Give all rewards to one random party member", // .loot_mode = 2
  131. "Give rewards randomly between all party members", // .loot_mode = 3
  132. "Give all rewards to all nearby players and their party members", // .loot_mode = 4 (Skip UI)
  133. "Give one reward to all nearby players and their party members", // .loot_mode = 5 (Skip UI)
  134. "Give all rewards to all nearby players", // .loot_mode = 6 (Skip UI)
  135. "Give one reward to all nearby players", // .loot_mode = 7 (Skip UI)
  136. "Give all rewards to all players in the same map", // .loot_mode = 8 (Skip UI)
  137. "Give one reward to all players in the same map", // .loot_mode = 9 (Skip UI)
  138. "Give all rewards to selected party member", // .loot_mode = 10
  139. "Give one random reward to selected party member"; // .loot_mode = 11
  140.  
  141. // Log console information
  142. // This will report incorrect monster ID's on script load
  143. /*for( .@i = 0; .@i < getarraysize(.event_mobs); .@i++ ) {
  144. if( getmonsterinfo(.event_mobs[.@i], 0) == "null" ) {
  145. debugmes .npc_name$ + ":OnInit Monster ID:" + .event_mobs[.@i] + " DOES NOT EXIST!";
  146. }
  147. }*/
  148.  
  149. // Start event on script load (For testing purposes)
  150. donpcevent .npc_name$ + "::OnEnable";
  151. end;
  152.  
  153. OnEnable:
  154. OnClock0402:
  155. OnClock2359:
  156. // Announce event will start soon
  157. announce "[World Boss] A rift on time and space is about to be opened! A World Boss will appear in " + (.event_sleep / 60000) + " minute! Prepare your Hunting Party!", bc_all, 0xFF0000;
  158.  
  159. // Sleep until X time have passed and then continue script
  160. sleep .event_sleep;
  161.  
  162. // Select random mob and map
  163. .@rand_mob = rand( getarraysize( .event_mobs ) ); // Random mob index number
  164. .@monster_id = .event_mobs[ .@rand_mob ]; // Select event mob by random mob index
  165.  
  166. SelectRandomMap:
  167. // Check if all maps are in use
  168. if ( getarraysize($@WB_MAP$) >= getarraysize(.event_maps$) ) {
  169. debugmes .npc_name$+"::OnEnable all event maps are active!";
  170. end;
  171. }
  172. .@rand_map = rand( getarraysize( .event_maps$ ) ); // Random map index number
  173. .@map_name$ = .event_maps$[ .@rand_map ]; // Select event map by random map index
  174. .@map_exists = 0;
  175. // Search if same map exists
  176. for ( .@i = 0; .@i < getarraysize($@WB_MAP$); .@i++ ) {
  177. // Jump to SelectRandomMap if selected map exists in the array
  178. jump_zero ($@WB_MAP$[.@i] != .event_maps$[ .@rand_map ]), SelectRandomMap;
  179. }
  180.  
  181. // Get last event index
  182. .@index = getarraysize($@WB_MOB_GID);
  183.  
  184. // Set mapflags if enabled
  185. if ( .use_mapflags ) {
  186. // Save event maps original mapflags
  187. setarray $@WB_MF_PARTYLOCK[.@index], getmapflag(.@map_name$, MF_PARTYLOCK);
  188. setarray $@WB_MF_NOMOBLOOT[.@index], getmapflag(.@map_name$, MF_NOMOBLOOT);
  189. setarray $@WB_MF_NOMVPLOOT[.@index], getmapflag(.@map_name$, MF_NOMVPLOOT);
  190. setarray $@WB_MF_NOPENALTY[.@index], getmapflag(.@map_name$, MF_NOPENALTY);
  191. setarray $@WB_MF_NOMOBTELE[.@index], getmapflag(.@map_name$, MF_MONSTER_NOTELEPORT);
  192. setarray $@WB_MF_BASEEXP[.@index], getmapflag(.@map_name$, MF_BEXP);
  193. setarray $@WB_MF_JOBEXP[.@index], getmapflag(.@map_name$, MF_JEXP);
  194. setarray $@WB_MF_FOG[.@index], getmapflag(.@map_name$, MF_FOG);
  195.  
  196. // Set new mapflags
  197. setmapflag .@map_name$, MF_PARTYLOCK; // Disable changing party(Inviting new players in event map)
  198. setmapflag .@map_name$, MF_NOMOBLOOT; // Disable Normal monster loot drops
  199. setmapflag .@map_name$, MF_NOMVPLOOT; // Disable Boss monster loot drops
  200. setmapflag .@map_name$, MF_NOPENALTY; // Disable Exp and Zeny penalty
  201. setmapflag .@map_name$, MF_MONSTER_NOTELEPORT; // Disable monster teleport
  202. setmapflag .@map_name$, MF_BEXP, ($@WB_MF_BASEEXP[.@index] * .base_exp_multiplier); // Set Base Exp rating
  203. setmapflag .@map_name$, MF_JEXP, ($@WB_MF_JOBEXP[.@index] * .job_exp_multiplier); // Set Job Exp rating
  204. setmapflag .@map_name$, MF_FOG; // Enable FOG effect
  205. }
  206.  
  207. // Summon event monster unit
  208. monster .@map_name$, 0, 0, "World Boss", .@monster_id, 1, .npc_name$+"::OnMonsterDeath", Size_Large, AI_NONE;
  209. // How about indexing event label "::OnMonster_0_Death" and event would call function with index variable?
  210.  
  211. // Get monster's Game ID
  212. .@gid = $@mobid[0];
  213.  
  214. // Change unit data to defaults
  215. setunitdata .@gid, UMOB_MAXHP, .MOB_MAXHP;
  216. setunitdata .@gid, UMOB_HP, .MOB_HP;
  217. setunitdata .@gid, UMOB_SPEED, .MOB_SPEED;
  218. setunitdata .@gid, UMOB_CRIT, .MOB_CRIT;
  219. setunitdata .@gid, UMOB_HIT, .MOB_HIT;
  220. setunitdata .@gid, UMOB_ATKMIN, .MOB_ATKMIN;
  221. setunitdata .@gid, UMOB_ATKMAX, .MOB_ATKMAX;
  222. setunitdata .@gid, UMOB_MATKMIN, .MOB_MATKMIN;
  223. setunitdata .@gid, UMOB_MATKMAX, .MOB_MATKMAX;
  224. setunitdata .@gid, UMOB_DEF, .MOB_DEF;
  225. setunitdata .@gid, UMOB_MDEF, .MOB_MDEF;
  226. setunitdata .@gid, UMOB_FLEE, .MOB_FLEE;
  227. setunitdata .@gid, UMOB_PDODGE, .MOB_PDODGE;
  228. setunitdata .@gid, UMOB_STR, .MOB_STR;
  229. setunitdata .@gid, UMOB_AGI, .MOB_AGI;
  230. setunitdata .@gid, UMOB_VIT, .MOB_VIT;
  231. setunitdata .@gid, UMOB_INT, .MOB_INT;
  232. setunitdata .@gid, UMOB_DEX, .MOB_DEX;
  233. setunitdata .@gid, UMOB_LUK, .MOB_LUK;
  234.  
  235. // Get units updated data
  236. getunitdata(.@gid, .@unit);
  237.  
  238. // Save event arrays
  239. setarray $@WB_MOB_ID[.@index], .@monster_id;
  240. setarray $@WB_MOB_GID[.@index], .@gid;
  241. setarray $@WB_TIMEOUT[.@index], gettimetick(0);
  242. setarray $@WB_RADAR_NEAR[.@index], 0;
  243. setarray $@WB_MAP$[.@index], .@map_name$;
  244. setarray $@WB_X[.@index], .@unit[UMOB_X];
  245. setarray $@WB_Y[.@index], .@unit[UMOB_Y];
  246.  
  247. // Unit talk
  248. unittalk .@gid, "Tremble before me mortals!", bc_area;
  249.  
  250. // Announce event started
  251. announce "[World Boss] A World Boss "+ getmonsterinfo(.@monster_id, 0) +" appeared in "+ .@map_name$ +" to wreck havoc!! Form a Hunting Party and stop it!!", bc_all, 0xFF0000;
  252.  
  253. // Start unit radar
  254. if ( .use_radar && getarraysize($@WB_MOB_GID) ) {
  255. donpcevent "WorldBossRadar::OnEnable";
  256. }
  257.  
  258. // Start timeout timer
  259. if ( !getnpctimer(1, "WorldBossTimeout") ) {
  260. donpcevent "WorldBossTimeout::OnEnable";
  261. }
  262. end;
  263.  
  264. // Disable event
  265. OnDisable:
  266. // Stop timeout timer
  267. donpcevent "WorldBossTimeout::OnDisable";
  268.  
  269. // Stop unit radar
  270. if ( .use_radar ) {
  271. donpcevent "WorldBossRadar::OnDisable";
  272. }
  273.  
  274. // Reset server exp and drop rates
  275. if ( .use_floating_rates ) {
  276. donpcevent "WorldBossRates::OnDisable";
  277. }
  278.  
  279. // Loop all events
  280. for ( .@i = 0; .@i < getarraysize($@WB_MOB_GID); .@i++ ) {
  281. // Kill all units
  282. if ( unitexists($@WB_MOB_GID[.@i]) ) {
  283. unitkill($@WB_MOB_GID[.@i]);
  284. }
  285.  
  286. // Reset all mapflags to original values
  287. if ( .use_mapflags ) {
  288. callfunc("WB_ResetMapflags", $@WB_MAP$[.@i], .@i);
  289. }
  290. }
  291. // Kill all script or gm summoned monsters
  292. //killmonster .event_map$, "All";
  293.  
  294. // Reset all event arrays
  295. callfunc("WB_ResetAllGlobals");
  296. end;
  297.  
  298. // Event when monster has been killed
  299. OnMonsterDeath:
  300. // Stop unit radar and timeout if no unit is alive
  301. if ( !getarraysize($@WB_MOB_GID) ) {
  302. if ( .use_radar ) donpcevent "WorldBossRadar::OnDisable";
  303. donpcevent "WorldBossTimeout::OnDisable";
  304. }
  305.  
  306. // Check attached RID
  307. if ( !playerattached() ) {
  308. // !TODO When player is not attached, clean stuff?
  309. //debugmes .npc_name$+"::OnMonsterDeath no player attached!";
  310. end;
  311. }
  312.  
  313. // Get party ID
  314. .@party_id = getcharid(1);
  315.  
  316. // Get map coordinates (Treasure Chest NPC will need these)
  317. getmapxy(.event_map$, .event_x, .event_y, UNITTYPE_PC);
  318.  
  319. // Announce
  320. announce "[World Boss] The World Boss have been killed! Congratulations!", bc_all, 0xFF0000;
  321.  
  322. // Increase server exp and drop rates for limited time
  323. if ( .use_floating_rates ) {
  324. donpcevent "WorldBossRates::OnEnable";
  325. }
  326.  
  327. // Get index if map name are same
  328. .@index = -1;
  329. for ( .@i = 0; .@i < getarraysize($@WB_MAP$); .@i++ ) {
  330. if ( $@WB_MAP$[.@i] == .event_map$ ) {
  331. .@index = .@i;
  332. break;
  333. }
  334. }
  335.  
  336. // Check if index was found and stop if not
  337. if ( .@index == -1 ) {
  338. debugmes .npc_name$+"::OnMonsterDeath event index was not found!";
  339. end;
  340. }
  341.  
  342. // Reset mapflags to original values
  343. if ( .use_mapflags ) {
  344. callfunc("WB_ResetMapflags", $@WB_MAP$[.@index], .@index);
  345. }
  346.  
  347. // Save event arrays
  348. setarray $@WB_MAP$[.@index], .event_map$;
  349. setarray $@WB_X[.@index], .event_x;
  350. setarray $@WB_Y[.@index], .event_y;
  351. setarray $@WB_PARTY_ID[.@index], .@party_id;
  352. // Select random reward/loots array
  353. setarray $@WB_REWARD_INDEX[.@index], rand(0, .loots_count);
  354.  
  355. // Enable first available Treasure Chest NPC
  356. // Set .event_map$, .event_x, .event_y before enabling ( Important! )
  357. for ( .@i = 0; .@i <= .duplicate_npc_count; .@i++ ) {
  358. .@npc$ = "Treasure Chest#wb_" + .@i; // Name of the NPC
  359. if ( getnpcid(0, .@npc$) ) { // If NPC exists
  360. if ( !getnpctimer( 1, .@npc$ ) ) { // If has active timer=1
  361. setarray $@WB_NPC_NAME$[.@index], .@npc$;
  362. donpcevent .@npc$ +"::OnEnable";
  363. break;
  364. }
  365. }
  366. }
  367.  
  368. // Switch by loot mode and save character IDs for access
  369. switch( .loot_mode ) {
  370. case 0:
  371. case 1:
  372. case 2:
  373. case 3: // In same party or single player
  374. case 10: // All to selected party member
  375. case 11: // One random to selected party member
  376. // Attach all available party members
  377. if ( getcharid(1) ) {
  378. addrid(2, 0, getcharid(1));
  379. }
  380. break;
  381.  
  382. case 4:
  383. case 5: // In range and party
  384. // Attach all available players in 20 cells from the killer RID
  385. addrid(4, 0, (.event_x - 20),(.event_y - 20), (.event_x + 20),(.event_y + 20));
  386.  
  387. // Attach all available party members
  388. if ( getcharid(1) ) {
  389. addrid(2, 0, getcharid(1));
  390. }
  391. break;
  392.  
  393. case 6:
  394. case 7: // In range
  395. // Attach all available players in 20 cells from the killer RID
  396. addrid(4, 0, (.event_x - 20),(.event_y - 20), (.event_x + 20),(.event_y + 20));
  397. break;
  398.  
  399. case 8:
  400. case 9: // In the same map
  401. addrid(1, 0, getcharid(1));
  402. break;
  403. }
  404.  
  405. // Find matching character IDs from the access array
  406. .@char_exists = 0;
  407. for ( .@i = 0; .@i < getarraysize($@WB_ACCESS); .@i++ ) {
  408. if ( $@WB_ACCESS[.@i] == getcharid(0) ) {
  409. .@char_exists++;
  410. }
  411. }
  412.  
  413. // Leave script if character ID exists
  414. if ( .@char_exists ) {
  415. end; // Already has access
  416. }
  417.  
  418. // Save character ID into access array
  419. setarray $@WB_ACCESS[getarraysize($@WB_ACCESS)], getcharid(0);
  420. setarray $@WB_ACCESS_EXPIRE[getarraysize($@WB_ACCESS_EXPIRE)], gettimetick(0);
  421.  
  422. // Start access expire timer if not already running
  423. if ( !getnpctimer(1, "WorldBossAccessExpire") ) {
  424. donpcevent "WorldBossAccessExpire::OnEnable";
  425. }
  426. end;
  427.  
  428. // Event when player opens Treasure Chest NPC
  429. OnTreasureOpen:
  430. // Get map coordinates of the player
  431. getmapxy(.@event_map$, .@x, .@y, UNITTYPE_PC);
  432.  
  433. // Search for character ID from the access array
  434. .@access_index = -1;
  435. for ( .@i = 0; .@i < getarraysize($@WB_ACCESS); .@i++ ) {
  436. if ( $@WB_ACCESS[.@i] == getcharid(0) ) {
  437. .@access_index = .@i;
  438. break;
  439. }
  440. }
  441.  
  442. // User has no access!
  443. if ( .@access_index == -1 ) {
  444. message strcharinfo(0), "Treasure Chest is empty.";
  445. end;
  446. }
  447.  
  448. // Get event index from the map name array
  449. .@event_index = -1;
  450. for ( .@i = 0; .@i < getarraysize($@WB_MAP$); .@i++ ) {
  451. if ( $@WB_MAP$[.@i] == .@event_map$ ) {
  452. .@event_index = .@i;
  453. break;
  454. }
  455. }
  456.  
  457. // Check if event index was found
  458. if ( .@event_index == -1 ) {
  459. debugmes .@name$+"::OnTreasureOpen event map name ( "+ .@event_map$ +" ) not found!";
  460. message strcharinfo(0), "Treasure Chest is empty.";
  461. end;
  462. }
  463.  
  464. // Select reward array
  465. .@rand_reward = $@WB_REWARD_INDEX[.@event_index];
  466. .@reward_size = getarraysize( getd(".loots_" + .@rand_reward) );
  467. copyarray .@rewards[0], getd(".loots_" + .@rand_reward + "[0]"), .@reward_size;
  468.  
  469. switch( .loot_mode ) {
  470. case 0: // All to all members
  471. case 2: // All to random member
  472. case 3: // Randomly to all members
  473. case 10: // All to selected party member
  474. case 11: // One random to selected party member
  475. if ( getcharid(1) ) {
  476. goto OnPartyLeader;
  477. } else {
  478. // Has no party
  479. for( .@i = 0; .@i < .@reward_size; .@i++ ) {
  480. getitem .@rewards[.@i], 1;
  481. }
  482. }
  483. break;
  484.  
  485. case 1: // One to random member
  486. if ( getcharid(1) ) {
  487. // Party Leader will distribute loots
  488. goto OnPartyLeader;
  489. } else {
  490. // Has no party
  491. getitem .@rewards[rand(.@reward_size)], 1;
  492. }
  493. break;
  494.  
  495. case 4: // All in range and party
  496. case 6: // All in range
  497. case 8: // All in same map
  498. default:
  499. // No UI
  500. for( .@i = 0; .@i < .@reward_size; .@i++ ) {
  501. getitem .@rewards[.@i], 1;
  502. }
  503. break;
  504.  
  505. case 5: // One in range and party
  506. case 7: // One in range
  507. case 9: // One in same map
  508. // No UI
  509. getitem .@rewards[rand(.@reward_size)], 1;
  510. break;
  511. }
  512.  
  513. // Remove character ID from the access array (Access is now used)
  514. deletearray $@WB_ACCESS[.@access_index], 1;
  515. deletearray $@WB_ACCESS_EXPIRE[.@access_index], 1;
  516.  
  517. // Announce player
  518. message strcharinfo(0), "Congratulations! You have been rewarded for killing the World Boss.";
  519.  
  520. // Disable current NPC Treasure Chest
  521. if ( !getarraysize($@WB_ACCESS) ) {
  522. // Disable current NPC Treasure Chest
  523. callfunc("WB_ResetBox", .@event_index);
  524. // Stop access expire timer
  525. donpcevent "WorldBossAccessExpire::OnDisable";
  526. }
  527. end;
  528.  
  529. OnPartyLeader:
  530. // Get party ID
  531. .@party_id = getcharid(1);
  532.  
  533. // Check if player is party leader
  534. if ( getcharid(0) != getpartyleader( .@party_id, 2 ) ) {
  535. message strcharinfo(0), "You're not Party Leader.";
  536. end;
  537. }
  538.  
  539. // Get event index from the party ID array
  540. .@event_index = -1;
  541. for ( .@i = 0; .@i < getarraysize($@WB_PARTY_ID); .@i++ ) {
  542. if ( $@WB_PARTY_ID[.@i] == .@party_id ) {
  543. .@event_index = .@i;
  544. break;
  545. }
  546. }
  547.  
  548. // Check if party id has access!
  549. if ( .@event_index == -1 ) {
  550. message strcharinfo(0), "Treasure Chest is empty.";
  551. end;
  552. }
  553.  
  554. // Select random reward array
  555. .@rand_reward = $@WB_REWARD_INDEX[.@event_index];
  556. .@reward_size = getarraysize(getd(".loots_" + .@rand_reward));
  557. copyarray .@rewards[0], getd(".loots_" + .@rand_reward + "[0]"), .@reward_size;
  558.  
  559. // Show loot distribution window
  560. mes "[ Loot Distributor ]";
  561. mes "Please ensure you distribute the Rewards. If you cancelled this, your party might not able to receive any rewards.";
  562. mes "^777777Loot mode : ^000000" + .loot_mode_desc$[.loot_mode]; // Loot mode description
  563. next;
  564. mes "[ Loot Distributor ]";
  565. for( .@i = 0; .@i < .@reward_size; .@i++ ) {
  566. mes "^777777 ~ " + getitemname( .@rewards[.@i] ) + "^000000";
  567. }
  568. next;
  569. if( select( "Distribute Loots", "Dispose Loots" ) == 1 ) {
  570. // Get party data
  571. getpartymember .@party_id, 0; // Name
  572. getpartymember .@party_id, 1; // Character IDs
  573. getpartymember .@party_id, 2; // Account IDs
  574.  
  575. // Copy the temporary party data
  576. .@party_size = $@partymembercount;
  577. copyarray .@party_cid[0], $@partymembercid[0], .@party_size;
  578. copyarray .@party_aid[0], $@partymemberaid[0], .@party_size;
  579. copyarray .@party_name$[0], $@partymembername$[0], .@party_size;
  580.  
  581. // LOOT MODE 0: Give all rewards to all party members
  582. if( .loot_mode == 0 ) {
  583. mes "[ Loot Distributor ]";
  584. // Loop through each party member
  585. for( .@idx = 0; .@idx < .@party_size; .@idx++ ) {
  586. // Online check
  587. if( isloggedin(.@party_aid[.@idx], .@party_cid[.@idx]) ) {
  588. mes " ~ " + strcharinfo(0, .@party_cid[.@idx]) + " was rewarded!";
  589. // Loop through each reward
  590. for( .@i = 0; .@i < .@reward_size; .@i++ ) {
  591. getitem .@rewards[.@i], 1, .@party_aid[.@idx];
  592. }
  593. }
  594. }
  595. }
  596.  
  597. // LOOT MODE 1: Give one reward to one random party member
  598. else if( .loot_mode == 1 ) {
  599. // Select random party member X times.
  600. SelectRandom1:
  601. .@attempts = 0; // Counter for random player select
  602. .@rand_party = rand(.@party_size);
  603. while( !isloggedin(.@party_aid[.@rand_party], .@party_cid[.@rand_party]) ) {
  604. if( .@attempts >= .loop_max ) break;
  605. .@rand_party = rand(.@party_size);
  606. .@attempts++;
  607. }
  608. // Max attempts reached
  609. if( .@attempts >= .loop_max ) {
  610. mes "[ Player not found ]";
  611. mes "Tried to select random player " + .@attempts + " times!";
  612. mes "Do you want to try again?";
  613. next;
  614. if( select("Yes:No") == 1 ) {
  615. goto SelectRandom1;
  616. } else {
  617. goto OnClose;
  618. }
  619. }
  620. // Backup online check (next; will pause script and players can disconnect)
  621. if( !isloggedin(.@party_aid[.@rand_party], .@party_cid[.@rand_party]) ) {
  622. mes "[ Player not online ]";
  623. mes "Member is ^777777offline^000000";
  624. mes "Do you want to try again?";
  625. next;
  626. if( select("Yes:No") == 1 ) {
  627. goto SelectRandom1;
  628. } else {
  629. goto OnClose;
  630. }
  631. }
  632. // Give random reward
  633. .@rand_item = rand(.@reward_size);
  634. .@name$ = strcharinfo(0, .@party_cid[.@rand_party]);
  635. mes "[ Loot Distributor ]";
  636. mes .@name$ + "^777777 ~ " + getitemname( .@rewards[.@rand_item] ) + "^000000";
  637. message .@name$, "Gained " + getitemname( .@rewards[.@rand_item] ) + " ( Distributed Randomly )";
  638. getitem .@rewards[.@rand_item], 1, .@party_aid[.@rand_party];
  639. }
  640.  
  641. // LOOT MODE 2: Give all rewards to one random party member
  642. else if( .loot_mode == 2 ) {
  643. // Select random party member X times.
  644. SelectRandom2:
  645. .@attempts = 0; // Counter for random player select
  646. .@rand_party = rand(.@party_size);
  647. while( !isloggedin(.@party_aid[.@rand_party], .@party_cid[.@rand_party]) ) {
  648. if( .@attempts >= .loop_max ) break;
  649. .@rand_party = rand(.@party_size);
  650. .@attempts++;
  651. }
  652. // Max attempts reached
  653. if( .@attempts >= .loop_max ) {
  654. mes "[ Player not found ]";
  655. mes "Tried to select random player " + .@attempts + " times!";
  656. mes "Do you want to try again?";
  657. next;
  658. if( select("Yes:No") == 1 ) {
  659. goto SelectRandom2;
  660. } else {
  661. goto OnClose;
  662. }
  663. }
  664. // Backup online check (next; will pause script and players can disconnect)
  665. if( !isloggedin(.@party_aid[.@rand_party], .@party_cid[.@rand_party]) ) {
  666. mes "[ Player not online ]";
  667. mes "Member is ^777777offline^000000";
  668. mes "Do you want to try again?";
  669. next;
  670. if( select("Yes:No") == 1 ) {
  671. goto SelectRandom2;
  672. } else {
  673. goto OnClose;
  674. }
  675. }
  676. // Give rewards
  677. .@name$ = strcharinfo(0, .@party_cid[.@rand_party]);
  678. mes "[ Loot Distributor ]";
  679. // Loop through each reward
  680. for( .@i = 0; .@i < .@reward_size; .@i++ ) {
  681. mes .@name$ + "^777777 ~ " + getitemname( .@rewards[.@i] ) + "^000000";
  682. message .@name$, "Gained " + getitemname( .@rewards[.@i] ) + " ( Distributed Randomly )";
  683. getitem .@rewards[.@i], 1, .@party_aid[.@rand_party];
  684. }
  685. }
  686.  
  687. // LOOT MODE 3: Give rewards randomly between all party members
  688. else if( .loot_mode == 3 ) {
  689. mes "[ Loot Distributor ]";
  690. // Loop through each reward
  691. for( .@i = 0; .@i < .@reward_size; .@i++ ) {
  692. // Select random party member X times.
  693. SelectRandom3:
  694. .@attempts = 0; // Counter for random player select
  695. .@rand_party = rand(.@party_size);
  696. while( !isloggedin(.@party_aid[.@rand_party], .@party_cid[.@rand_party]) ) {
  697. if( .@attempts >= .loop_max ) break;
  698. .@rand_party = rand(.@party_size);
  699. .@attempts++;
  700. }
  701. // Max attempts reached
  702. if( .@attempts >= .loop_max ) {
  703. mes "[ Player not found ]";
  704. mes "Tried to select random player " + .@attempts + " times!";
  705. mes "Do you want to try again?";
  706. next;
  707. if( select("Yes:No") == 1 ) {
  708. goto SelectRandom3;
  709. } else {
  710. goto OnClose;
  711. }
  712. }
  713. // Backup online check (next; will pause script and players can disconnect)
  714. if( !isloggedin(.@party_aid[.@rand_party], .@party_cid[.@rand_party]) ) {
  715. mes "[ Player not online ]";
  716. mes "Member is ^777777offline^000000";
  717. mes "Do you want to try again?";
  718. next;
  719. if( select("Yes:No") == 1 ) {
  720. goto SelectRandom3;
  721. } else {
  722. goto OnClose;
  723. }
  724. }
  725. // Give single reward
  726. .@name$ = strcharinfo(0, .@party_cid[.@rand_party]);
  727. mes .@name$ + "^777777 ~ " + getitemname( .@rewards[.@i] ) + "^000000";
  728. message .@name$, "Gained " + getitemname( .@rewards[.@i] ) + " ( Distributed Randomly )";
  729. getitem .@rewards[.@i], 1, .@party_aid[.@rand_party];
  730. }
  731. }
  732.  
  733. // LOOT MODE 10: Give all rewards to selected party member
  734. // LOOT MODE 11: Give one reward to selected party member
  735. else if( .loot_mode >= 10 && .loot_mode <= 11 ) {
  736. SelectMember:
  737. // Open Party Select Menu
  738. .@select = callfunc("WB_PartySelect", 1, 1);
  739.  
  740. // Refresh selected
  741. while ( .@select == -1 ) {
  742. message strcharinfo(0), "Refresh menu!";
  743. .@select = callfunc("WB_PartySelect", 1, 1);
  744. }
  745.  
  746. // Not in a party (Leaved before select or removed)
  747. if ( .@select == -2 ) {
  748. message strcharinfo(0), "You don't have a party.";
  749. end;
  750. }
  751.  
  752. // Is selected member online
  753. if ( !isloggedin(.@party_aid[.@select], .@party_cid[.@select]) ) {
  754. mes "[ Loot Distributor ]";
  755. mes "Selected party member is not online.";
  756. mes "Please select again.";
  757. next;
  758. goto SelectMember;
  759. }
  760.  
  761. // Get more party data
  762. .@party_name$ = getpartyname(.@party_id); // Party Name
  763. .@party_leader_cid = getpartyleader(.@party_id, 2); // Party Leader Character ID
  764. // Party Leader Name
  765. .@party_leader_name$ = "[Offline]";
  766. if ( .@party_leader_cid != -1 ) {
  767. // strcharinfo(0,.@party_leader_cid); will fail if leader is offline!
  768. for (.@i = 0; .@i < .@party_size; .@i++ ) {
  769. // Match leader cid with party member cid
  770. if ( .@party_leader_cid == .@party_member_cid[.@i] ) {
  771. .@party_leader_name$ = .@party_member_name$[.@i];
  772. }
  773. }
  774. }
  775.  
  776. // Double check
  777. // Check for party changes, because players can leave anytime.
  778. .@party_id2 = getcharid(1);
  779. .@check_failed = false;
  780.  
  781. // Not in a party anymore (Leaved after select or removed)
  782. if ( !.@party_id2 ) {
  783. message strcharinfo(0), "You don't have a party.";
  784. mes "[ Loot Distributor ]";
  785. mes "Your party has made changes during selection.";
  786. mes "Please select again.";
  787. close;
  788. }
  789.  
  790. // Check if party ID has changed
  791. if (.@party_id != .@party_id2) {
  792. message strcharinfo(0), "Failed: Party ID has changed!";
  793. mes "[ Loot Distributor ]";
  794. mes "Your party has made changes during selection.";
  795. mes "Please select again.";
  796. close;
  797. }
  798.  
  799. // Get new party data
  800. getpartymember .@party_id2, 0; // names
  801. .@new_party_size = $@partymembercount;
  802. copyarray .@partymembername$[0], $@partymembername$[0], .@new_party_size;
  803.  
  804. // Check if party size has changed during select.
  805. if (.@new_party_size != .@party_size) {
  806. message strcharinfo(0), "Failed: Party size has changed!";
  807. mes "[ Loot Distributor ]";
  808. mes "Your party has made changes during selection.";
  809. mes "Please select again.";
  810. close;
  811. }
  812.  
  813. // Check if party member names has changed during select.
  814. for (.@i = 0; .@i < .@party_size; .@i++ ) {
  815. // Match new and old name
  816. if ( .@partymembername$[.@i] != .@party_member_name$[.@i] ) {
  817. .@check_failed = true;
  818. message strcharinfo(0), "Failed: Party member name has changed!";
  819. break;
  820. }
  821. }
  822.  
  823. // Has any checks failed
  824. if ( .@i >= .@party_size && .@check_failed ) {
  825. mes "[ Loot Distributor ]";
  826. mes "Your party has made changes during selection.";
  827. mes "Please select again.";
  828. close;
  829. }
  830.  
  831. // Success; Give rewards
  832. if (.loot_mode == 10) {
  833. // All rewards to selected member
  834. .@name$ = strcharinfo(0, .@party_cid[.@select]);
  835. mes "[ Loot Distributor ]";
  836. // Loop through each reward
  837. for( .@i = 0; .@i < .@reward_size; .@i++ ) {
  838. mes .@name$ + "^777777 ~ " + getitemname( .@rewards[.@i] ) + "^000000";
  839. message .@name$, "Gained " + getitemname( .@rewards[.@i] ) + " ( Distributed Randomly )";
  840. getitem .@rewards[.@i], 1, .@party_aid[.@select];
  841. }
  842. }
  843. else if (.loot_mode == 11) {
  844. // Give one random reward to selected member
  845. .@rand_item = rand(.@reward_size);
  846. .@name$ = strcharinfo(0, .@party_cid[.@select]);
  847. mes "[ Loot Distributor ]";
  848. mes .@name$ + "^777777 ~ " + getitemname( .@rewards[.@rand_item] ) + "^000000";
  849. message .@name$, "Gained " + getitemname( .@rewards[.@rand_item] ) + " ( Distributed Randomly )";
  850. getitem .@rewards[.@rand_item], 1, .@party_aid[.@select];
  851. }
  852. }
  853. } else {
  854. // Disposed loots
  855. mes "[ Loot Distributor ]";
  856. }
  857. mes "Congratulations!";
  858. // Remove all party members access
  859. callfunc("WB_ResetPartyAccess", .@party_id);
  860. close2;
  861. // Disable current NPC Treasure Chest
  862. callfunc("WB_ResetBox", .@event_index);
  863. end;
  864.  
  865. OnClose:
  866. // Close reward window
  867. mes "[ Loot Distributor ]";
  868. mes "Good bye.";
  869. close;
  870. }
  871.  
  872. // Function: Reset all party members access IDs
  873. // callfunc("WB_ResetPartyAccess", <party id>)
  874. function script WB_ResetPartyAccess {
  875. .@party_id = getarg(0);
  876. getpartymember .@party_id, 1; // Character IDs
  877. .@party_size = $@partymembercount;
  878. copyarray .@party_cid[0], $@partymembercid[0], .@party_size;
  879. for ( .@i = 0; .@i < .@party_size; .@i++ ) {
  880. for ( .@index = 0; .@index < getarraysize($@WB_ACCESS); .@index++ ) {
  881. if ( $@WB_ACCESS[.@index] == .@party_cid[.@i] ) {
  882. deletearray $@WB_ACCESS[.@index], 1;
  883. deletearray $@WB_ACCESS_EXPIRE[.@index], 1;
  884. }
  885. }
  886. }
  887. // Remove party id
  888. /*for ( .@i = 0; .@i < getarraysize($@WB_PARTY_ID); .@i++ ) {
  889. if ( $@WB_PARTY_ID[.@i] == .@party_id ) {
  890. deletearray $@WB_PARTY_ID[.@i], 1;
  891. }
  892. }*/
  893. return;
  894. }
  895.  
  896. // Function: Reset specific WorldBoss event global arrays
  897. // callfunc("WB_ResetEventGlobals", <index>)
  898. function script WB_ResetEventGlobals {
  899. .@index = getarg(0, 0); // Event index Default=0
  900. deletearray $@WB_MOB_ID[.@index], 1; // Rename from $@WB_ID
  901. deletearray $@WB_MOB_GID[.@index], 1; // Rename from $@WB_GID
  902. deletearray $@WB_TIMEOUT[.@index], 1;
  903. deletearray $@WB_RADAR_NEAR[.@index], 1; // Rename from $@WB_NEAR
  904. deletearray $@WB_MAP$[.@index], 1;
  905. deletearray $@WB_X[.@index], 1;
  906. deletearray $@WB_Y[.@index], 1;
  907. deletearray $@WB_REWARD_INDEX[.@index], 1; // Rename from $@WB_REWARD
  908. deletearray $@WB_PARTY_ID[.@index], 1; // Rename from $@WB_PARTY
  909. deletearray $@WB_NPC_NAME$[.@index], 1; // Rename from $@WB_BOX
  910. //deletearray $@WB_ACCESS[.@index], 1;
  911. //deletearray $@WB_ACCESS_EXPIRE[.@index], 1;
  912. deletearray $@WB_MF_PARTYLOCK[.@index], 1;
  913. deletearray $@WB_MF_NOMOBLOOT[.@index], 1;
  914. deletearray $@WB_MF_NOMVPLOOT[.@index], 1;
  915. deletearray $@WB_MF_NOPENALTY[.@index], 1;
  916. deletearray $@WB_MF_NOMOBTELE[.@index], 1;
  917. deletearray $@WB_MF_BASEEXP[.@index], 1;
  918. deletearray $@WB_MF_JOBEXP[.@index], 1;
  919. deletearray $@WB_MF_FOG[.@index], 1;
  920. return;
  921. }
  922.  
  923. // Function: Reset all WorldBoss event global arrays
  924. // callfunc("WB_ResetAllGlobals")
  925. function script WB_ResetAllGlobals {
  926. deletearray $@WB_MOB_ID[0], getarraysize($@WB_MOB_ID);
  927. deletearray $@WB_MOB_GID[0], getarraysize($@WB_MOB_GID);
  928. deletearray $@WB_TIMEOUT[0], getarraysize($@WB_TIMEOUT);
  929. deletearray $@WB_RADAR_NEAR[0], getarraysize($@WB_RADAR_NEAR);
  930. deletearray $@WB_MAP$[0], getarraysize($@WB_MAP$);
  931. deletearray $@WB_X[0], getarraysize($@WB_X);
  932. deletearray $@WB_Y[0], getarraysize($@WB_Y);
  933. deletearray $@WB_REWARD_INDEX[0], getarraysize($@WB_REWARD_INDEX);
  934. deletearray $@WB_PARTY_ID[0], getarraysize($@WB_PARTY_ID);
  935. deletearray $@WB_NPC_NAME$[0], getarraysize($@WB_NPC_NAME$);
  936. deletearray $@WB_ACCESS[0], getarraysize($@WB_ACCESS);
  937. deletearray $@WB_ACCESS_EXPIRE[0], getarraysize($@WB_ACCESS_EXPIRE);
  938. deletearray $@WB_MF_PARTYLOCK[0], getarraysize($@WB_MF_PARTYLOCK);
  939. deletearray $@WB_MF_NOMOBLOOT[0], getarraysize($@WB_MF_NOMOBLOOT);
  940. deletearray $@WB_MF_NOMVPLOOT[0], getarraysize($@WB_MF_NOMVPLOOT);
  941. deletearray $@WB_MF_NOPENALTY[0], getarraysize($@WB_MF_NOPENALTY);
  942. deletearray $@WB_MF_NOMOBTELE[0], getarraysize($@WB_MF_NOMOBTELE);
  943. deletearray $@WB_MF_BASEEXP[0], getarraysize($@WB_MF_BASEEXP);
  944. deletearray $@WB_MF_JOBEXP[0], getarraysize($@WB_MF_JOBEXP);
  945. deletearray $@WB_MF_FOG[0], getarraysize($@WB_MF_FOG);
  946. return;
  947. }
  948.  
  949. // Function: Reset all mapflags to original values
  950. // callfunc("WB_ResetMapflags", <map name>, <index>)
  951. function script WB_ResetMapflags {
  952. .@map$ = getarg(0, "null"); // Map name Default="null"
  953. .@index = getarg(1, 0); // Event index Default=0
  954. // Map name exists
  955. if (.@map$ == "null")
  956. return;
  957. // Party Lock
  958. if ( $@WB_MF_PARTYLOCK[.@index] )
  959. setmapflag .@map$, MF_PARTYLOCK;
  960. else
  961. removemapflag .@map$, MF_PARTYLOCK;
  962. // No mob loot
  963. if ( $@WB_MF_NOMOBLOOT[.@index] )
  964. setmapflag .@map$, MF_NOMOBLOOT;
  965. else
  966. removemapflag .@map$, MF_NOMOBLOOT;
  967. // No MVP loot
  968. if ( $@WB_MF_NOMVPLOOT[.@index] )
  969. setmapflag .@map$, MF_NOMVPLOOT;
  970. else
  971. removemapflag .@map$, MF_NOMVPLOOT;
  972. // No penalty
  973. if ( $@WB_MF_NOPENALTY[.@index] )
  974. setmapflag .@map$, MF_NOPENALTY;
  975. else
  976. removemapflag .@map$, MF_NOPENALTY;
  977. // No mob teleport
  978. if ( $@WB_MF_NOMOBTELE[.@index] )
  979. setmapflag .@map$, MF_MONSTER_NOTELEPORT;
  980. else
  981. removemapflag .@map$, MF_MONSTER_NOTELEPORT;
  982. // Base Exp
  983. setmapflag .@map$, MF_BEXP, $@WB_MF_BASEEXP[.@index];
  984. // Job Exp
  985. setmapflag .@map$, MF_JEXP, $@WB_MF_JOBEXP[.@index];
  986. // Effect FOG
  987. if ( $@WB_MF_FOG[.@index] )
  988. setmapflag .@map$, MF_FOG;
  989. else
  990. removemapflag .@map$, MF_FOG;
  991. return;
  992. }
  993.  
  994. // Function: Reset specific Treasure Chest NPC
  995. // callfunc("WB_ResetBox", <index>)
  996. function script WB_ResetBox {
  997. .@index = getarg(0, 0); // Event index Default=0
  998. if ( $@WB_NPC_NAME$[.@index] != "" ) {
  999. if ( getnpcid(0, $@WB_NPC_NAME$[.@index]) ) {
  1000. // Do these checks or this will select all NPCs on the server when fail
  1001. donpcevent $@WB_NPC_NAME$[.@index]+"::OnDisable";
  1002. }
  1003. }
  1004. }
  1005.  
  1006. // Function: Reset all Treasure Chest NPC's
  1007. // callfunc("WB_ResetAllBoxes")
  1008. function script WB_ResetAllBoxes {
  1009. for ( .@i = 0; .@i < getarraysize($@WB_NPC_NAME$); .@i++ ) {
  1010. if ( $@WB_NPC_NAME$[.@i] != "" ) {
  1011. if ( getnpcid(0, $@WB_NPC_NAME$[.@i]) ) {
  1012. // Do these checks or this will select all NPCs on the server when fail
  1013. donpcevent $@WB_NPC_NAME$[.@i]+"::OnDisable";
  1014. }
  1015. }
  1016. }
  1017. }
  1018.  
  1019. // Function Party Select
  1020. // callfunc("WB_PartySelect", <INT_show_offline>, <INT_show_refresh>)
  1021. // Return INT=Party index number, -1=Refresh selected, -2=Not in party
  1022. function script WB_PartySelect {
  1023. .@s_offline = getarg(0, 1); // Show offline players in menu? 1=Yes 0=No
  1024. .@s_refresh = getarg(1, 1); // Show refresh menu item? 1=Yes 0=No
  1025. .@party_id = getcharid(1); // Party ID
  1026.  
  1027. // Not in a party
  1028. if ( !.@party_id )
  1029. return -2;
  1030.  
  1031. getpartymember .@party_id, 0; // Names
  1032. getpartymember .@party_id, 1; // Character IDs
  1033. getpartymember .@party_id, 2; // Account IDs
  1034.  
  1035. // Copy the temporary party data
  1036. .@party_size = $@partymembercount;
  1037. copyarray .@party_member_name$[0], $@partymembername$[0], .@party_size;
  1038. copyarray .@party_member_cid[0], $@partymembercid[0], .@party_size;
  1039. copyarray .@party_member_aid[0], $@partymemberaid[0], .@party_size;
  1040.  
  1041. // Create menu
  1042. if ( .@s_refresh )
  1043. .@menu_party$ = "^777777[Refresh]^000000";
  1044. .@menu_party$ = .@menu_party$ + ":";
  1045.  
  1046. // Loop through each party member and add to menu
  1047. for ( .@i = 0; .@i < .@party_size; .@i++ ) {
  1048. if ( isloggedin(.@party_member_aid[.@i], .@party_member_cid[.@i]) ) {
  1049. if (.@s_offline)
  1050. .@menu_party$ = .@menu_party$ + .@party_member_name$[.@i] + " ^00cc36[ON]^000000";
  1051. else
  1052. .@menu_party$ = .@menu_party$ + .@party_member_name$[.@i];
  1053. } else if (.@s_offline)
  1054. .@menu_party$ = .@menu_party$ + .@party_member_name$[.@i] + " ^777777[OFF]^000000";
  1055. .@menu_party$ = .@menu_party$ + ":";
  1056. }
  1057.  
  1058. // Open select menu (-2 select start from 1 and we have [Refresh] at first)
  1059. .@select = select(.@menu_party$) - 2;
  1060. return .@select;
  1061. }
  1062.  
  1063. // Treasure chest NPC
  1064. alberta,0,0,5 script Treasure Chest#wb_0 1324,{
  1065. emotion ET_SURPRISE, getcharid(3); // Emotion on the player
  1066. // Disable current NPC Treasure Chest if empty
  1067. if ( !getarraysize($@WB_ACCESS) ) {
  1068. message strcharinfo(0), "Treasure Chest is empty.";
  1069. donpcevent strnpcinfo(0)+"::OnDisable";
  1070. // Stop access expire timer
  1071. donpcevent "WorldBossAccessExpire::OnDisable";
  1072. end;
  1073. }
  1074. doevent "WorldBoss::OnTreasureOpen";
  1075. end;
  1076.  
  1077. OnInit:
  1078. .@name$ = strnpcinfo(0); //rid2name( .@id );
  1079. .@timer = getnpctimer(1, .@name$);
  1080. getmapxy(.map$, .x, .y, UNITTYPE_NPC);
  1081. disablenpc .@name$;
  1082. //debugmes .@name$+"::OnInit target=" + .map$ + " NPC="+ .@name$ + " timer="+ .@timer;
  1083. end;
  1084.  
  1085. OnEnable:
  1086. // if enabled getnpctimer(1, strnpcinfo(0)) will return 1
  1087. .@id = getnpcid(0);
  1088. .@name$ = strnpcinfo(0); //rid2name( .@id );
  1089. .@timer = getnpctimer(1, .@name$);
  1090.  
  1091. .@npc$ = "WorldBoss";
  1092. .@map$ = getvariableofnpc(.event_map$, .@npc$);
  1093. .@x = getvariableofnpc(.event_x, .@npc$);
  1094. .@y = getvariableofnpc(.event_y, .@npc$);
  1095.  
  1096. enablenpc( .@name$ );
  1097. unitwarp( .@id, .@map$, .@x, .@y ); // Move to new position
  1098. initnpctimer( .@name$ ); // Start timeout timer
  1099.  
  1100. //debugmes .@name$+"::OnEnable target="+ .@map$ +", "+ .@x +", "+ .@y +" NPC="+ .@name$ +" timer="+ .@timer;
  1101. end;
  1102.  
  1103. // Disable Treasure NPC and clean event array
  1104. OnDisable:
  1105. .@id = getnpcid(0);
  1106. .@name$ = strnpcinfo(0); //rid2name( .@id );
  1107. .@timer = getnpctimer(1, .@name$);
  1108. getmapxy(.@event_map$, .@x, .@y, UNITTYPE_NPC);
  1109.  
  1110. stopnpctimer( .@name$ ); // Stop timeout timer
  1111. unitwarp( .@id, .map$, .x, .y ); // Return to default position
  1112. disablenpc( .@name$ );
  1113.  
  1114. // Clean event data
  1115. // Get event index from the map name array
  1116. .@index = -1;
  1117. for ( .@i = 0; .@i < getarraysize($@WB_MAP$); .@i++ ) {
  1118. if ( $@WB_MAP$[.@i] == .@event_map$ ) {
  1119. .@index = .@i;
  1120. break;
  1121. }
  1122. }
  1123.  
  1124. // Check if index was found
  1125. if ( .@index == -1 ) {
  1126. debugmes .@name$+"::OnDisable event map name ( "+ .@event_map$ +" ) not found!";
  1127. end;
  1128. }
  1129.  
  1130. // Remove current event from the arrays
  1131. callfunc("WB_ResetEventGlobals", .@index);
  1132.  
  1133. //debugmes .@name$+"::OnDisable target="+ .@event_map$ +", "+ .@x +", "+ .@y +" NPC="+ .@name$ +" timer="+ .@timer;
  1134. end;
  1135.  
  1136. //OnTimer30000: // 30 seconds
  1137. //OnTimer120000: // 2 minutes
  1138. //OnTimer300000: // 5 minutes
  1139. OnTimer600000: // 10 minutes
  1140. //OnTimer900000: // 15 minutes
  1141. .@name$ = strnpcinfo(0);
  1142. getmapxy(.@map$, .@x, .@y, UNITTYPE_NPC);
  1143. //debugmes .@name$+"::OnTimeout target="+ .@map$ +", "+ .@x +", "+ .@y +" NPC="+ .@name$;
  1144. donpcevent .@name$+"::OnDisable";
  1145. end;
  1146. }
  1147.  
  1148. // Treasure Chest duplicates (Add more if you run out)
  1149. // NPC Name = Treasure Chest#wb_<indexNumber> (Important!)
  1150. alberta,0,0,5 duplicate(Treasure Chest#wb_0) Treasure Chest#wb_1 1324
  1151. alberta,0,0,5 duplicate(Treasure Chest#wb_0) Treasure Chest#wb_2 1324
  1152. alberta,0,0,5 duplicate(Treasure Chest#wb_0) Treasure Chest#wb_3 1324
  1153. alberta,0,0,5 duplicate(Treasure Chest#wb_0) Treasure Chest#wb_4 1324
  1154. alberta,0,0,5 duplicate(Treasure Chest#wb_0) Treasure Chest#wb_5 1324
  1155. alberta,0,0,5 duplicate(Treasure Chest#wb_0) Treasure Chest#wb_6 1324
  1156. alberta,0,0,5 duplicate(Treasure Chest#wb_0) Treasure Chest#wb_7 1324
  1157. alberta,0,0,5 duplicate(Treasure Chest#wb_0) Treasure Chest#wb_8 1324
  1158. alberta,0,0,5 duplicate(Treasure Chest#wb_0) Treasure Chest#wb_9 1324
  1159.  
  1160. // World Boss timeout timer
  1161. - script WorldBossTimeout -1,{
  1162. end;
  1163. OnEnable:
  1164. initnpctimer;
  1165. end;
  1166. OnDisable:
  1167. stopnpctimer;
  1168. end;
  1169. // Update every 1 minutes
  1170. OnTimer60000:
  1171. .@time = gettimetick(0);
  1172. .@timeout = getvariableofnpc(.event_timeout, "WorldBoss");
  1173. .@mapflags = getvariableofnpc(.use_mapflags, "WorldBoss");
  1174. for ( .@i = 0; .@i < getarraysize($@WB_MOB_GID); .@i++ ) {
  1175. // Unit must be alive
  1176. if ( unitexists($@WB_MOB_GID[.@i]) && .@time > ($@WB_TIMEOUT[.@i] + .@timeout) ) {
  1177. announce "[World Boss] World Boss time in "+ $@WB_MAP$[.@i] +" has expired!", bc_all, 0xFF0000;
  1178. unitkill( $@WB_MOB_GID[.@i] );
  1179.  
  1180. // Reset event mapflags
  1181. if ( .@mapflags ) {
  1182. callfunc("WB_ResetMapflags", $@WB_MAP$[.@i], .@i);
  1183. }
  1184.  
  1185. // Remove event global arrays
  1186. callfunc("WB_ResetEventGlobals", .@i);
  1187. }
  1188. }
  1189. initnpctimer;
  1190. end;
  1191. }
  1192.  
  1193. // World Boss Unit's Radar
  1194. // Count users around the world boss and increase it's HP by each Player nearby
  1195. - script WorldBossRadar -1,{
  1196. end;
  1197. OnInit:
  1198. .npc_name$ = strnpcinfo(0);
  1199. .radius = 15; // Cell radius
  1200. .HPLevel = 1500000; // HP increase per player
  1201. .MinHP = .HPLevel * 2; // Minimum HP when to stop decreasing HP
  1202. end;
  1203. OnEnable:
  1204. initnpctimer;
  1205. end;
  1206. OnDisable:
  1207. stopnpctimer;
  1208. end;
  1209. // Every 10 secods update all World Boss unit data
  1210. OnTimer10000:
  1211. for ( .@i = 0; .@i < getarraysize($@WB_MOB_GID); .@i++ ) {
  1212. .@gid = $@WB_MOB_GID[.@i];
  1213. if ( unitexists(.@gid) ) {
  1214. getunitdata(.@gid, .@udata);
  1215. .@hp = .@udata[UMOB_HP];
  1216. .@maxhp = .@udata[UMOB_MAXHP];
  1217. .@x = .@udata[UMOB_X];
  1218. .@y = .@udata[UMOB_Y];
  1219. .@users = getareausers(mapid2name(.@udata[UMOB_MAPID]), (.@x - .radius), (.@y - .radius), (.@x + .radius), (.@y + .radius));
  1220. if ( .@users > $@WB_RADAR_NEAR[.@i] ) {
  1221. // Increase HP per each player nearby
  1222. .@new_hp = .@hp + ( .HPLevel * .@users );
  1223. // Stop increasing HP after maximum has been reached
  1224. if ( .@new_hp < .@maxhp ) {
  1225. setunitdata .@gid, UMOB_HP, .@new_hp;
  1226. unittalk .@gid, rid2name(.@gid) + " : Mortals has entered my sight!", bc_area;
  1227. }
  1228. } else if ( .@users < $@WB_RADAR_NEAR[.@i] ) {
  1229. // Decrease HP per each player nearby
  1230. .@new_hp = .@hp - .HPLevel;
  1231. // Stop decreasing HP after minimum has been reached
  1232. if ( .@new_hp > .MinHP ) {
  1233. setunitdata .@gid, UMOB_HP, .@new_hp;
  1234. unittalk .@gid, rid2name(.@gid) + " : Mortals has left my sight!", bc_area;
  1235. }
  1236. }
  1237. // Update users count
  1238. setarray $@WB_RADAR_NEAR[.@i], .@users;
  1239. }
  1240. }
  1241. initnpctimer;
  1242. end;
  1243. }
  1244.  
  1245. // World Boss access expire timer
  1246. // This will clean event access array from getting too big in time.
  1247. - script WorldBossAccessExpire -1,{
  1248. end;
  1249. OnEnable:
  1250. //debugmes strnpcinfo(0)+"::OnEnable";
  1251. initnpctimer;
  1252. end;
  1253. OnDisable:
  1254. //debugmes strnpcinfo(0)+"::OnDisable";
  1255. stopnpctimer;
  1256. end;
  1257. // Update every 5 minutes
  1258. OnTimer300000:
  1259. //debugmes strnpcinfo(0)+"::OnTimer";
  1260. .@time = gettimetick(0);
  1261. .@expires = getvariableofnpc(.event_access_expire, "WorldBoss");
  1262. for ( .@i = 0; .@i < getarraysize($@WB_ACCESS); .@i++ ) {
  1263. // Check if access has expired
  1264. if ( .@time > ($@WB_ACCESS_EXPIRE[.@i] + .@expires) ) {
  1265. // Current access has expired! Remove access and expire time.
  1266. deletearray $@WB_ACCESS[.@i], 1;
  1267. deletearray $@WB_ACCESS_EXPIRE[.@i], 1;
  1268. }
  1269. }
  1270. // Continue timer if access is not empty
  1271. if ( getarraysize($@WB_ACCESS) ) {
  1272. initnpctimer;
  1273. }
  1274. end;
  1275. }
  1276.  
  1277. // World Boss Floating Rates
  1278. - script WorldBossRates -1,{
  1279. OnInterIfInitOnce:
  1280. // Set once on server start
  1281. $wb_battle_flags = 0;
  1282. // Set servers default battle flags
  1283. $wb_base_exp_rate = getBattleFlag("base_exp_rate");
  1284. $wb_job_exp_rate = getBattleFlag("job_exp_rate");
  1285. $wb_item_rate_common = getBattleFlag("item_rate_common");
  1286. $wb_item_rate_common_boss = getBattleFlag("item_rate_common_boss");
  1287. $wb_item_rate_common_mvp = getBattleFlag("item_rate_common_mvp");
  1288. $wb_item_rate_heal = getBattleFlag("item_rate_heal");
  1289. $wb_item_rate_heal_boss = getBattleFlag("item_rate_heal_boss");
  1290. $wb_item_rate_heal_mvp = getBattleFlag("item_rate_heal_mvp");
  1291. $wb_item_rate_use = getBattleFlag("item_rate_use");
  1292. $wb_item_rate_use_boss = getBattleFlag("item_rate_use_boss");
  1293. $wb_item_rate_use_mvp = getBattleFlag("item_rate_use_mvp");
  1294. $wb_item_rate_equip = getBattleFlag("item_rate_equip");
  1295. $wb_item_rate_equip_boss = getBattleFlag("item_rate_equip_boss");
  1296. $wb_item_rate_equip_mvp = getBattleFlag("item_rate_equip_mvp");
  1297. $wb_item_rate_card = getBattleFlag("item_rate_card");
  1298. $wb_item_rate_card_boss = getBattleFlag("item_rate_card_boss");
  1299. $wb_item_rate_card_mvp = getBattleFlag("item_rate_card_mvp");
  1300. $wb_item_rate_mvp = getBattleFlag("item_rate_mvp");
  1301. $wb_item_rate_adddrop = getBattleFlag("item_rate_adddrop");
  1302. $wb_item_rate_treasure = getBattleFlag("item_rate_treasure");
  1303. end;
  1304. OnInit:
  1305. // Reset rates on script load
  1306. if ( $wb_base_exp_rate && getBattleFlag("base_exp_rate") != $wb_base_exp_rate )
  1307. donpcevent strnpcinfo(0)+"::OnDisable";
  1308. end;
  1309. OnEnable:
  1310. // Check already enabled
  1311. if ( !$wb_battle_flags ) {
  1312. // Double server ratings
  1313. setBattleFlag("base_exp_rate", $wb_base_exp_rate * 2);
  1314. setBattleFlag("job_exp_rate", $wb_job_exp_rate * 2);
  1315. setBattleFlag("item_rate_common", $wb_item_rate_common * 2);
  1316. setBattleFlag("item_rate_common_boss", $wb_item_rate_common_boss * 2);
  1317. setBattleFlag("item_rate_common_mvp", $wb_item_rate_common_mvp * 2);
  1318. setBattleFlag("item_rate_heal", $wb_item_rate_heal * 2);
  1319. setBattleFlag("item_rate_heal_boss", $wb_item_rate_heal_boss * 2);
  1320. setBattleFlag("item_rate_heal_mvp", $wb_item_rate_heal_mvp * 2);
  1321. setBattleFlag("item_rate_use", $wb_item_rate_use * 2);
  1322. setBattleFlag("item_rate_use_boss", $wb_item_rate_use_boss * 2);
  1323. setBattleFlag("item_rate_use_mvp", $wb_item_rate_use_mvp * 2);
  1324. setBattleFlag("item_rate_equip", $wb_item_rate_equip * 2);
  1325. setBattleFlag("item_rate_equip_boss", $wb_item_rate_equip_boss * 2);
  1326. setBattleFlag("item_rate_equip_mvp", $wb_item_rate_equip_mvp * 2);
  1327. setBattleFlag("item_rate_card", $wb_item_rate_card * 2);
  1328. setBattleFlag("item_rate_card_boss", $wb_item_rate_card_boss * 2);
  1329. setBattleFlag("item_rate_card_mvp", $wb_item_rate_card_mvp * 2);
  1330. setBattleFlag("item_rate_mvp", $wb_item_rate_mvp * 2);
  1331. setBattleFlag("item_rate_adddrop", $wb_item_rate_adddrop * 2);
  1332. setBattleFlag("item_rate_treasure", $wb_item_rate_treasure * 2);
  1333. }
  1334. announce "[World Boss] Experience and Drop rates has been doubled for one hour! Enjoy!", bc_all, 0x00FF00;
  1335. $wb_battle_flags = 1;
  1336. initnpctimer;
  1337. end;
  1338. OnDisable:
  1339. // Reset normal rates
  1340. setBattleFlag("base_exp_rate", $wb_base_exp_rate);
  1341. setBattleFlag("job_exp_rate", $wb_job_exp_rate);
  1342. setBattleFlag("item_rate_common", $wb_item_rate_common);
  1343. setBattleFlag("item_rate_common_boss", $wb_item_rate_common_boss);
  1344. setBattleFlag("item_rate_common_mvp", $wb_item_rate_common_mvp);
  1345. setBattleFlag("item_rate_heal", $wb_item_rate_heal);
  1346. setBattleFlag("item_rate_heal_boss", $wb_item_rate_heal_boss);
  1347. setBattleFlag("item_rate_heal_mvp", $wb_item_rate_heal_mvp);
  1348. setBattleFlag("item_rate_use", $wb_item_rate_use);
  1349. setBattleFlag("item_rate_use_boss", $wb_item_rate_use_boss);
  1350. setBattleFlag("item_rate_use_mvp", $wb_item_rate_use_mvp);
  1351. setBattleFlag("item_rate_equip", $wb_item_rate_equip);
  1352. setBattleFlag("item_rate_equip_boss", $wb_item_rate_equip_boss);
  1353. setBattleFlag("item_rate_equip_mvp", $wb_item_rate_equip_mvp);
  1354. setBattleFlag("item_rate_card", $wb_item_rate_card);
  1355. setBattleFlag("item_rate_card_boss", $wb_item_rate_card_boss);
  1356. setBattleFlag("item_rate_card_mvp", $wb_item_rate_card_mvp);
  1357. setBattleFlag("item_rate_mvp", $wb_item_rate_mvp);
  1358. setBattleFlag("item_rate_adddrop", $wb_item_rate_adddrop);
  1359. setBattleFlag("item_rate_treasure", $wb_item_rate_treasure);
  1360. $wb_battle_flags = 0;
  1361. stopnpctimer;
  1362. end;
  1363. OnTimer3600000: // 1 hour
  1364. donpcevent strnpcinfo(0)+"::OnDisable";
  1365. end;
  1366. }
  1367.  
  1368. // NPC World Boss Information
  1369. prontera,147,174,4 script World Boss#info 495,5,5,{
  1370. mes "[ " + strnpcinfo(1) + " ]";
  1371. mes "About the world bosses.";
  1372. if ( getarraysize($@WB_MOB_GID) ) {
  1373. .@time = gettimetick(0);
  1374. .@timeout = getvariableofnpc(.event_timeout, "WorldBoss");
  1375. mes "Status: ^00CC36Active^000000";
  1376. for ( .@i = 0; .@i < getarraysize($@WB_MOB_GID); .@i++ ) {
  1377. .@timeleft = ($@WB_TIMEOUT[.@i] + .@timeout) - .@time;
  1378. mes (.@i + 1) + ". Location : " + $@WB_MAP$[.@i];
  1379. mes " ^777777 Time Left :^000000 " + (.@timeleft / 60000) + " min.";
  1380. }
  1381. mes "Good luck!";
  1382. } else {
  1383. mes "Status: ^CC3300Inactive^000000";
  1384. mes "Event timetable:";
  1385. mes "^777777 ~ 04:02 ^000000";
  1386. mes "^777777 ~ 23:59 ^000000";
  1387. mes "Wait until the event starts.";
  1388. }
  1389. // GM level 60+ has access to menu
  1390. if( getgmlevel() >= 60 ) {
  1391. next;
  1392. switch( select("Information:Start Event:Skip Start Timer:Stop Event:Change Loot Mode:Change Unit Data:Map Flags:Leave") ) {
  1393. case 1: callsub S_Info; break;
  1394. case 2: callsub S_Start; break;
  1395. case 3: callsub S_Skip; break;
  1396. case 4: callsub S_Stop; break;
  1397. case 5: callsub S_Loot; break;
  1398. case 6: callsub S_Unit; break;
  1399. case 7: callsub S_Mapflags; break;
  1400. default: break;
  1401. }
  1402. }
  1403. close;
  1404.  
  1405. S_Info:
  1406. // Set variables
  1407. .@enabled = getarraysize($@WB_MOB_GID);
  1408. .@loot_mode = getvariableofnpc(.loot_mode, .event_npc$);
  1409. .@time = gettimetick(0);
  1410. .@timeout = getvariableofnpc(.event_timeout, "WorldBoss");
  1411. mes "[ " + strnpcinfo(1) + " ]";
  1412. mes "^777777Status: ^000000" + (.@enabled ? "^00CC36Active^000000" : "^CC3300Inactive^000000");
  1413. mes "^777777Loot mode: ^000000" + .event_loot_modes$[.@loot_mode];
  1414. .@menu$ = "Leave:";
  1415. for ( .@i = 0; .@i < getarraysize($@WB_MOB_GID); .@i++ ) {
  1416. if ( $@WB_MOB_GID[.@i] || $@WB_NPC_NAME$[.@i] != "" ) {
  1417. // Monster Unit
  1418. .@timeleft = ($@WB_TIMEOUT[.@i] + .@timeout) - .@time; // ms
  1419. // Get unit data
  1420. if ( unitexists($@WB_MOB_GID[.@i]) ) {
  1421. // Monster unit
  1422. getunitdata($@WB_MOB_GID[.@i], .@udata);
  1423. mes (.@i + 1) +". Monster: " + $@WB_MOB_ID[.@i] +" / "+ getmonsterinfo($@WB_MOB_ID[.@i], 0);
  1424. mes " ^777777 GID: ^000000" + $@WB_MOB_GID[.@i];
  1425. mes " ^777777 Name: ^000000" + rid2name($@WB_MOB_GID[.@i]);
  1426. mes " ^777777 HP: ^000000" + .@udata[UMOB_HP] + " / " + .@udata[UMOB_MAXHP];
  1427. mes " ^777777 Location: ^000000" + mapid2name(.@udata[UMOB_MAPID]) +
  1428. " ^777777 x ^000000" + .@udata[UMOB_X] +
  1429. " ^777777 y ^000000" + .@udata[UMOB_Y];
  1430. mes " ^777777 Time Left :^000000 " + (.@timeleft / 60000) + " min.";
  1431. } else if (unitexists(getnpcid(0, $@WB_NPC_NAME$[.@i]))) {
  1432. // NPC unit
  1433. getunitdata(getnpcid(0, $@WB_NPC_NAME$[.@i]), .@udata);
  1434. mes (.@i + 1) +". Treasure Chest";
  1435. mes " ^777777 GID: ^000000" + getnpcid(0, $@WB_NPC_NAME$[.@i]);
  1436. mes " ^777777 Name: ^000000" + $@WB_NPC_NAME$[.@i];
  1437. mes " ^777777 Location: ^000000" + mapid2name(.@udata[UNPC_MAPID]) +
  1438. " ^777777 x ^000000" + .@udata[UNPC_X] +
  1439. " ^777777 y ^000000" + .@udata[UNPC_Y];
  1440. }
  1441. mes "^777777-------^000000";
  1442. .@menu$ += "Go to "+$@WB_MAP$[.@i];
  1443. }
  1444. .@menu$ += ":";
  1445. }
  1446. .@selected = select(.@menu$) - 2;
  1447. if ( .@selected >= 0 ) {
  1448. if ( unitexists($@WB_MOB_GID[.@selected]) ) {
  1449. // Warp to the monster location
  1450. getunitdata($@WB_MOB_GID[.@selected], .@data);
  1451. warp mapid2name(.@data[UMOB_MAPID]), .@data[UMOB_X], .@data[UMOB_Y];
  1452. } else if ( $@WB_NPC_NAME$[.@selected] != "" ) {
  1453. // Warp to the NPC location
  1454. if (unitexists(getnpcid(0, $@WB_NPC_NAME$[.@selected]))) {
  1455. getunitdata(getnpcid(0, $@WB_NPC_NAME$[.@selected]), .@data);
  1456. warp mapid2name(.@data[UNPC_MAPID]), .@data[UNPC_X], .@data[UNPC_Y];
  1457. }
  1458. }
  1459. end;
  1460. }
  1461. return;
  1462.  
  1463. S_Mapflags:
  1464. mes "[ " + strnpcinfo(1) + " ] Mapflags";
  1465. .@size = getarraysize($@WB_MOB_GID);
  1466. .@mapflags = getvariableofnpc(.use_mapflags, "WorldBoss");
  1467. if ( .@mapflags && .@size ) {
  1468. for ( .@i = 0; .@i < .@size; .@i++ ) {
  1469. .@map$ = $@WB_MAP$[.@i];
  1470. mes .@map$ + " : Original Flags";
  1471. mes " ^777777 PartyLock : " + $@WB_MF_PARTYLOCK[.@i] + "^000000";
  1472. mes " ^777777 NoMobLoot : " + $@WB_MF_NOMOBLOOT[.@i] + "^000000";
  1473. mes " ^777777 NoMVPLoot : " + $@WB_MF_NOMVPLOOT[.@i] + "^000000";
  1474. mes " ^777777 NoPenalty : " + $@WB_MF_NOPENALTY[.@i] + "^000000";
  1475. mes " ^777777 NoMobTele : " + $@WB_MF_NOMOBTELE[.@i] + "^000000";
  1476. mes " ^777777 BaseExp : " + $@WB_MF_BASEEXP[.@i] + "^000000";
  1477. mes " ^777777 JobExp : " + $@WB_MF_JOBEXP[.@i] + "^000000";
  1478. mes " ^777777 Fog : " + $@WB_MF_FOG[.@i] + "^000000";
  1479. mes .@map$ + " : New Flags";
  1480. mes " ^777777 PartyLock : " + getmapflag(.@map$, MF_PARTYLOCK) + "^000000";
  1481. mes " ^777777 NoMobLoot : " + getmapflag(.@map$, MF_NOMOBLOOT) + "^000000";
  1482. mes " ^777777 NoMVPLoot : " + getmapflag(.@map$, MF_NOMVPLOOT) + "^000000";
  1483. mes " ^777777 NoPenalty : " + getmapflag(.@map$, MF_NOPENALTY) + "^000000";
  1484. mes " ^777777 NoMobTele : " + getmapflag(.@map$, MF_MONSTER_NOTELEPORT) + "^000000";
  1485. mes " ^777777 BaseExp : " + getmapflag(.@map$, MF_BEXP) + "^000000";
  1486. mes " ^777777 JobExp : " + getmapflag(.@map$, MF_JEXP) + "^000000";
  1487. mes " ^777777 Fog : " + getmapflag(.@map$, MF_FOG) + "^000000";
  1488. mes "^777777-------^000000";
  1489. }
  1490. } else {
  1491. mes "No mapflags has been set.";
  1492. }
  1493. return;
  1494.  
  1495. S_Start:
  1496. donpcevent .event_npc$ + "::OnEnable";
  1497. message strcharinfo(0), "Event has been started!";
  1498. return;
  1499.  
  1500. S_Skip:
  1501. awake .event_npc$; // Cancels any running sleep timers on the NPC
  1502. message strcharinfo(0), "Event timer has been skipped!";
  1503. return;
  1504.  
  1505. S_Stop:
  1506. awake .event_npc$; // Cancels any running sleep timers on the NPC
  1507. donpcevent .event_npc$ + "::OnDisable";
  1508. // Announce event stopped
  1509. announce "[World Boss] The event has been stopped!", bc_all, 0xFF0000;
  1510. message strcharinfo(0), "Event has been stopped!";
  1511. return;
  1512.  
  1513. S_Loot:
  1514. .@size = getarraysize(.event_loot_modes$);
  1515. for( .@i = 0; .@i < .@size; .@i++ ) {
  1516. message strcharinfo(0), "Loot mode "+ .@i +" : " + .event_loot_modes$[.@i];
  1517. }
  1518. // Change event loot mode option
  1519. input .@input, 0, .@size;
  1520. set getvariableofnpc(.loot_mode, .event_npc$), .@input;
  1521. message strcharinfo(0), "Event loot mode changed: " + .event_loot_modes$[.@input];
  1522. return;
  1523.  
  1524. S_Unit:
  1525. // Create menu
  1526. .@menu$ = "Leave:";
  1527. for ( .@i = 0; .@i < getarraysize($@WB_MOB_GID); .@i++ ) {
  1528. if ( unitexists($@WB_MOB_GID[.@i]) ) {
  1529. .@menu$ += $@WB_MAP$[.@i] +" - "+ getmonsterinfo($@WB_MOB_ID[.@i], 0);
  1530. }
  1531. .@menu$ += ":";
  1532. }
  1533. .@selected = select(.@menu$) - 2;
  1534.  
  1535. // Change unit data (HP,Level,Atk,Etc.)
  1536. if ( .@selected >= 0 ) {
  1537. mes "[ " + strnpcinfo(1) + " ]";
  1538. getunitdata($@WB_MOB_GID[.@selected], .@udata);
  1539. for (.@i = 0; .@i < getarraysize(.@udata); .@i++ ) {
  1540. mes .UMOB$[.@i] + " = " + .@udata[.@i];
  1541. }
  1542. .@select = select(.UMOB_menu$) - 1;
  1543. message strcharinfo(0), "Write a new unit ( " + .UMOB$[.@select] + " ) value.";
  1544. input .@val, 0, 1000000000;
  1545. setunitdata($@WB_MOB_GID[.@selected], .@select, .@val);
  1546. // Confim data has changed
  1547. getunitdata($@WB_MOB_GID[.@selected], .@confirm_udata);
  1548. message strcharinfo(0), "New unit data is: " + .@confirm_udata[.@select];
  1549. }
  1550. return;
  1551.  
  1552. OnInit:
  1553. // Event NPC name
  1554. .event_npc$ = "WorldBoss";
  1555.  
  1556. // Event loot mode descriptions
  1557. setarray .event_loot_modes$[0],
  1558. "Give all rewards to all party members", // .loot_mode = 0
  1559. "Give one reward to one random party member", // .loot_mode = 1
  1560. "Give all rewards to one random party member", // .loot_mode = 2
  1561. "Give rewards randomly between all party members", // .loot_mode = 3
  1562. "Give all rewards to all nearby players and their party members", // .loot_mode = 4 (Skip UI)
  1563. "Give one reward to all nearby players and their party members", // .loot_mode = 5 (Skip UI)
  1564. "Give all rewards to all nearby players", // .loot_mode = 6 (Skip UI)
  1565. "Give one reward to all nearby players", // .loot_mode = 7 (Skip UI)
  1566. "Give all rewards to all players in the same map", // .loot_mode = 8 (Skip UI)
  1567. "Give one reward to all players in the same map", // .loot_mode = 9 (Skip UI)
  1568. "Give all rewards to selected party member", // .loot_mode = 10
  1569. "Give one random reward to selected party member"; // .loot_mode = 11
  1570.  
  1571. // Unit data attibute names
  1572. setarray .UMOB$[0],
  1573. "Size","Level","Hp","Max Hp",
  1574. "Master AID","Map ID","Map X","Map Y",
  1575. "Speed","Mode","Ai","Scoption",
  1576. "Sex","Class","Hair style","Hair color",
  1577. "Head bottom","Head middle","Head top","Cloth color",
  1578. "Shield","Weapon","Look dir","Can move tick",
  1579. "Str","Agi","Vit","Int",
  1580. "Dex","Luk","Slave cpymstrmd","Dmg immune",
  1581. "Atk range","Atk min","Atk max","Matk min",
  1582. "Matk max","Def","Mdef","Hit",
  1583. "Flee","Pdodge","Crit","Race",
  1584. "Ele type","Ele level","A-motion","A-delay",
  1585. "D-motion";
  1586.  
  1587. // Unit data menu string
  1588. .UMOB_menu$ = implode(.UMOB$, ":");
  1589.  
  1590. // Set NPC size if class_id supports
  1591. .@npc_class = rand(495, 498);
  1592. .@npc_size = rand(0, 2); // 0=normal, 1=small, 2=big
  1593. setnpcdisplay(strnpcinfo(0), strnpcinfo(1), .@npc_class, .@npc_size);
  1594. end;
  1595.  
  1596. OnTouch:
  1597. // Player attached
  1598. end;
  1599.  
  1600. OnTouchNPC:
  1601. // Monster attached
  1602. .@UNIT_GID = getattachedrid();
  1603. //.@UNIT_NAME$ = rid2name(.@UNIT_GID);
  1604. //debugmes "Target unit name:" + .@UNIT_NAME$;
  1605. // Get unit data as Array
  1606. getunitdata(.@UNIT_GID, .@data);
  1607. .@MASTER_AID = .@data[UMOB_MASTERAID]; // UMOB_MASTERAID=4
  1608. // Unit has a master
  1609. if ( .@MASTER_AID ) {
  1610. .@MASTER_NAME$ = rid2name(.@MASTER_AID);
  1611. .@online = isloggedin(.@MASTER_AID);
  1612. if ( .@online ) {
  1613. end; // Do not target players unit
  1614. }
  1615. }
  1616. // NPC emotion
  1617. emotion ET_KEK;
  1618. // Warp monsters away from the NPC
  1619. unitwarp 0, "this", -1, -1;
  1620. end;
  1621. }
Add Comment
Please, Sign In to add comment