瀏覽代碼

Spawn and Free Cell Search Behavior (#8324)

- When searching for a map-wide free cell, the tiles 15 cells from the edge are no longer considered
  * Added a configuration to change the edge size to any value between 1 and 40
- When searching for a free cell, the tiles 4-5 cells from the edge are now considered invalid and trigger a retry
  * If you make the edge size smaller than this, it will use edge size instead
- Searching for a free cell now defaults to 50 tries, but if the "no spawn on player" option is active, those failed attempts are not counted towards the limit anymore
- When a monster spawns in a defined area there will now be 8 attempts to spawn it on a valid cell within the area and then one attempt on the center cell; if all 9 attempts fail, there will now be 50 tries to spawn it map-wide before it gives up
- When a monster has fixed spawn coordinates, but those coordinates are a wall, it will now spawn in a random location map-wide instead
  * This also applies to icewall blocking the cell unless the boss_monster command was used
- Each monster in an area spawn will now receive its own spawn center within the spawn area on server start
  * This results in the spawn area being larger but having a bias towards the center
  * Added a configuration to disable this behavior
- Fixed slave monsters always being active and constantly calling the "search freecell" function even though neither them nor their master have been spotted yet
- Fixed map server crash when setting no_spawn_on_player to 100 (follow-up to 33b2b02)
- Updated prontera field spawns to official episode 18+
- Updated all champion mob respawn times to 3 minutes and sorted them by map name
- Fixes #8300
Playtester 1 年之前
父節點
當前提交
5d232db89e
共有 13 個文件被更改,包括 473 次插入397 次删除
  1. 7 0
      conf/battle/misc.conf
  2. 9 0
      conf/battle/monster.conf
  3. 21 4
      doc/script_commands.txt
  4. 323 318
      npc/re/mobs/championmobs.txt
  5. 23 31
      npc/re/mobs/fields/prontera.txt
  6. 2 0
      src/map/battle.cpp
  7. 2 0
      src/map/battle.hpp
  8. 19 16
      src/map/map.cpp
  9. 1 1
      src/map/map.hpp
  10. 37 14
      src/map/mob.cpp
  11. 1 0
      src/map/mob.hpp
  12. 24 10
      src/map/npc.cpp
  13. 4 3
      src/map/pc.cpp

+ 7 - 0
conf/battle/misc.conf

@@ -183,3 +183,10 @@ mail_delay: 1000
 
 
 // Hides items from the player's favorite tab from being sold to a NPC. (Note 1)
 // Hides items from the player's favorite tab from being sold to a NPC. (Note 1)
 hide_fav_sell: no
 hide_fav_sell: no
+
+// When searching for a random position on the map, how much of the border of the map shall not be considered?
+// Officially the 15 tiles from the edge of the map on each side are not considered as target cells.
+// On some maps like in Pyramids this causes there to be very few monsters in the outer areas. This also
+// affects teleportation. Set this to 1 if you want it to be closer to the old emulator behavior.
+// Valid values: 1-40
+map_edge_size: 15

+ 9 - 0
conf/battle/monster.conf

@@ -163,6 +163,15 @@ no_spawn_on_player: 0
 // map regardless of what the mob-spawn file says.
 // map regardless of what the mob-spawn file says.
 force_random_spawn: no
 force_random_spawn: no
 
 
+// Should each monster's center cell be randomized? (Note 1)
+// Officially, at server start, each monster's center cell is set to a random cell in the spawn area.
+// Each time the monster spawns it will spawn in an area around its center cell rather than the
+// original center of the spawn definition. This results in a much larger total spawn area and a
+// different experience each server start.
+// Set this to "no" if you want all monsters of a spawn to spawn around the original center of the
+// spawn definition, making the total spawn area much smaller (old eAthena behavior).
+randomize_center_cell: yes
+
 // Do summon slaves inherit the passive/aggressive traits of their master?
 // Do summon slaves inherit the passive/aggressive traits of their master?
 // 0: No, retain original mode.
 // 0: No, retain original mode.
 // 1: Slaves are always aggressive.
 // 1: Slaves are always aggressive.

+ 21 - 4
doc/script_commands.txt

@@ -1,4 +1,4 @@
-//===== rAthena Documentation================================
+//===== rAthena Documentation================================
 //= rAthena Script Commands
 //= rAthena Script Commands
 //===== By:==================================================
 //===== By:==================================================
 //= rAthena Dev Team
 //= rAthena Dev Team
@@ -135,11 +135,26 @@ and 'doc/mapflags.txt'.
 <map name>{,<x>{,<y>{,<xs>{,<ys>}}}}%TAB%monster%TAB%<monster name>{,<monster level>}%TAB%<mob id>,<amount>{,<delay1>{,<delay2>{,<event>{,<mob size>{,<mob ai>}}}}}
 <map name>{,<x>{,<y>{,<xs>{,<ys>}}}}%TAB%monster%TAB%<monster name>{,<monster level>}%TAB%<mob id>,<amount>{,<delay1>{,<delay2>{,<event>{,<mob size>{,<mob ai>}}}}}
 
 
 Map name is the name of the map the monsters will spawn on. x,y are the
 Map name is the name of the map the monsters will spawn on. x,y are the
-coordinates where the mob should spawn. If xs and ys are non-zero, they
-specify the 'radius' of a spawn-rectangle area centered at x,y.
-Putting zeros instead of these coordinates will spawn the monsters randomly.
+coordinates where the mob should spawn. Putting zeros instead of these
+coordinates will spawn the monsters randomly.
+
+If the coordinates are non-zero and xs and ys are above 1, each monster will
+spawn in a radius around x,y. At server start, each monster will get assigned
+its own center cell adding or substracting up to (xs-1),(ys-1) from the given
+x,y coordinates. Each time a monster respawns, it will spawn in a radius around
+its personal center cell by adding or substracting up to (xs-1),(ys-1) again.
+This results in a total possible spawn area over all monsters of the spawn line
+of (xs,ys)*4-3, but with a strong bias towards the center of that area:
+2,2 - 5x5
+3,3 - 9x9
+4,4 - 13x13
+5,5 - 17x17
+etc.
+
 Note this is only the initial spawn zone, as mobs random-walk, they are free
 Note this is only the initial spawn zone, as mobs random-walk, they are free
 to move away from their specified spawn region.
 to move away from their specified spawn region.
+You can disable the picking of a random center cell for each monster in the
+battle config. (See /conf/battle/monster.conf::randomize_center_cell.)
 
 
 Monster name is the name the monsters will have on screen, and has no relation
 Monster name is the name the monsters will have on screen, and has no relation
 whatsoever to their names anywhere else. It's the mob id that counts, which
 whatsoever to their names anywhere else. It's the mob id that counts, which
@@ -188,6 +203,8 @@ Natural enemies for AI monsters are normal monsters.
 
 
 Alternately, a monster spawned using 'boss_monster' instead of 'monster' is able
 Alternately, a monster spawned using 'boss_monster' instead of 'monster' is able
 to be detected on the map with the SC_BOSSMAPINFO status (used by Convex Mirror).
 to be detected on the map with the SC_BOSSMAPINFO status (used by Convex Mirror).
+A boss monster spawn with fixed coordinates will always spawn at the given 
+coordinates, even if they are blocked (e.g. by Icewall).
 
 
 ** NPC names
 ** NPC names
 
 

+ 323 - 318
npc/re/mobs/championmobs.txt

@@ -3,329 +3,334 @@
 //===== By: ==================================================
 //===== By: ==================================================
 //= nanakiwurtz
 //= nanakiwurtz
 //===== Current Version: =====================================
 //===== Current Version: =====================================
-//= 1.1
+//= 1.2
 //===== Compatible With: =====================================
 //===== Compatible With: =====================================
 //= rAthena Project
 //= rAthena Project
 //===== Additional Comments: =================================
 //===== Additional Comments: =================================
 //= 1.0 First version
 //= 1.0 First version
 //= 1.1 Correct Spawn by Navigation's mob data. [attackjom]
 //= 1.1 Correct Spawn by Navigation's mob data. [attackjom]
+//= 1.2 Correct respawn times and prontera field spawns [Playtester]
 //============================================================
 //============================================================
 
 
-abbey02,0,0	monster	Swift Zombie Slaughter	2603,3,300000
-gl_prison,0,0	monster	Solid Zombie Prisoner	2604,1,300000
-gld_dun04,0,0	monster	Zombie Master Ringleader	2605,2,300000
-pay_dun00,0,0	monster	Furious Zombie	2606,2,300000
-schg_dun01,0,0	monster	Elusive Zakudam	2607,2,300000
-prt_fild03,0,0	monster	Swift Yoyo	2608,2,300000
-ayo_fild02,0,0	monster	Solid Yoyo	2609,1,300000
-pay_fild06,0,0	monster	Wormtail Ringleader	2610,3,300000
-um_fild02,0,0	monster	Furious Wootan Fighter	2611,1,300000
-mosk_dun01,0,0	monster	Elusive Wood Goblin	2612,2,300000
-moc_fild03,0,0	monster	Swift Wolf	2613,2,300000
-gl_step,0,0	monster	Solid Wind Ghost	2614,2,300000
-gef_dun03,0,0	monster	Solid Wind Ghost	2614,1,300000
-pay_fild01,0,0	monster	Willow Ringleader	2615,2,300000
-um_fild04,0,0	monster	Furious Wild Rose	2616,1,300000
-gon_dun03,0,0	monster	Elusive Evil Nymph	2617,2,300000
-gl_sew01,0,0	monster	Solid Whisper	2618,1,300000
-treasure_n2,0,0	monster	Weak Skeleton Ringleader	2619,2,300000
-gl_cas02,0,0	monster	Furious Wanderer	2620,2,300000
-gefenia04,0,0	monster	Elusive Violy	2621,2,300000
-gefenia03,0,0	monster	Swift Violy	2622,2,300000
-gefenia02,0,0	monster	Solid Violy	2623,2,300000
-ein_fild04,0,0	monster	Venomous Ringleader	2624,2,300000
-juperos_01,0,0	monster	Furious Venatu	2625,3,300000
-mosk_dun03,0,0	monster	Elusive Vavayaga	2626,2,300000
-ra_san01,0,0	monster	Swift Vanberk	2627,2,300000
-iz_dun01,0,0	monster	Solid Vadon	2628,2,300000
-ein_fild02,0,0	monster	Ungoliant Ringleader	2629,2,300000
-bra_fild01,0,0	monster	Furious Toucan	2630,3,300000
-ma_fild01,0,0	monster	Elusive Tiyanak	2631,2,300000
-prt_sewb4,0,0	monster	Solid Thief Bug	2632,2,300000
-prt_sewb3,0,0	monster	Thief Bug Ringleader	2633,3,300000
-prt_sewb2,0,0	monster	Furious Thief Bug	2634,2,300000
-beach_dun3,0,0	monster	Elusive Thara Frog	2635,2,300000
-ein_fild03,0,0	monster	Swift Teddy Bear	2636,2,300000
-man_fild03,0,0	monster	Solid Tatacho	2637,1,300000
-mjo_dun01,0,0	monster	Tarou Ringleader	2638,2,300000
-ayo_dun02,0,0	monster	Furious Tamruan	2639,2,300000
-gl_sew03,0,0	monster	Elusive Sting	2640,2,300000
-lhz_fild02,0,0	monster	Swift Stem Worm	2641,2,300000
-moc_fild13,0,0	monster	Solid Steel Chonchon	2642,3,300000
-ve_fild07,0,0	monster	Stapo Ringleader	2643,2,300000
-beach_dun2,0,0	monster	Furious Stalactic Golem	2644,2,300000
-prt_fild02,0,0	monster	Elusive Stainer	2645,3,300000
-treasure_n1,0,0	monster	Swift Spore	2646,2,300000
-tur_dun02,0,0	monster	Solid Solider	2647,2,300000
-pay_dun02,0,0	monster	Soldier Skeleton Ringleader	2648,3,300000
-pay_dun01,0,0	monster	Furious Soldier Skeleton	2649,2,300000
-tha_t09,0,0	monster	Elusive Lady Solace	2650,2,300000	//--Remove after Thanatos Ravamped Patch
-pay_dun03,0,0	monster	Swift Sohee	2651,2,300000
-ice_dun02,0,0	monster	Solid Snowier	2652,2,300000
-pay_fild02,0,0	monster	Boa Ringleader	2653,3,300000
-ayo_fild01,0,0	monster	Furious Smokie	2654,2,300000
-yuno_fild06,0,0	monster	Elusive Sleeper	2655,1,300000
-yuno_fild02,0,0	monster	Swift Sleeper	2656,2,300000
-odin_tem02,0,0	monster	Solid Skogul	2657,1,300000
-gld2_pay,0,0	monster	Skeleton General Ringleader	2658,2,300000
-gld_dun01_2,0,0	monster	Furious Skeleton General	2659,2,300000
-mjo_dun03,0,0	monster	Elusive Skeleton Worker	2660,2,300000
-ice_dun01,0,0	monster	Swift Siroma	2661,1,300000
-mosk_fild02,0,0	monster	Solid Side Winder	2662,1,300000
-mjolnir_03,0,0	monster	Side Winder Ringleader	2663,2,300000
-ama_dun03,0,0	monster	Furious Shinobi	2664,2,300000
-tha_t11,0,0	monster	Elusive Mistress of Shelter	2665,2,300000	//--Remove after Thanatos Ravamped Patch
-hu_fild06,0,0	monster	Swift Shellfish	2666,1,300000
-lhz_dun03,0,0	monster	Solid Cecil Damon	2667,3,300000
-cmd_fild04,0,0	monster	Sea Otter Ringleader	2668,2,300000
-iz_dun05,0,0	monster	Furious Lamp Rey	2669,2,300000
-moc_fild18,0,0	monster	Elusive Scorpion	2670,3,300000
-mjolnir_09,0,0	monster	Swift Savage Babe	2671,2,300000
-prt_maze01,0,0	monster	Solid Savage	2672,2,300000
-mjolnir_07,0,0	monster	Savage Ringleader	2673,3,300000
-moc_fild16,0,0	monster	Furious Sandman	2674,2,300000
-thor_v03,0,0	monster	Elusive Salamander	2675,2,300000
-treasure02,0,0	monster	Swift Sailor Skeleton	2676,1,300000
-ra_fild12,0,0	monster	Solid Roween	2677,2,300000
-prt_fild00,0,0	monster	Roda Frog Ringleader	2678,2,300000
-gef_fild01,0,0	monster	Furious Roda Frog	2679,2,300000
-prt_fild07,0,0	monster	Elusive Rocker	2680,2,300000
-tha_t01,0,0	monster	Swift Rideword	2681,2,300000
-//tha_t01,0,0	monster	Swift Rideword	2681,1,300000	//--Applied after Thanatos Revamped Patch.
-c_tower1,0,0	monster	Solid Rideword	2682,2,300000
-gon_fild01,0,0	monster	Dumpling Child Ringleader	2683,2,300000
-tha_t10,0,0	monster	Furious Baroness of Retribution	2684,2,300000	//--Remove after Thanatos Ravamped Patch
-tha_t08,0,0	monster	Elusive Baroness of Retribution	2685,2,300000
-//tha_t08,0,0	monster	Elusive Baroness of Retribution	2685,1,300000	//--Applied after Thanatos Revamped Patch.
-tha_t07,0,0	monster	Swift Baroness of Retribution	2686,2,300000
-//tha_t07,0,0	monster	Swift Baroness of Retribution	2686,1,300000	//--Applied after Thanatos Revamped Patch.
-in_sphinx2,0,0	monster	Solid Requiem	2687,2,300000
-lhz_dun01,0,0	monster	Remover Ringleader	2688,3,300000
-mal_dun01,0,0	monster	Elusive Red Eruma	2689,2,300000
-gl_knt02,0,0	monster	Swift Raydric	2690,2,300000
-gl_knt01,0,0	monster	Solid Raydric	2691,2,300000
-lhz_dun02,0,0	monster	Laurell Weinder Ringleader	2692,3,300000
-dic_dun03,0,0	monster	Furious Rake Scaraba	2693,2,300000
-cmd_fild07,0,0	monster	Elusive Raggler	2694,2,300000
-lhz_fild01,0,0	monster	Swift Rafflesia	2695,3,300000
-lhz_fild01,0,0	monster	Poring Ringleader	2696,2,300000
-lhz_fild01,0,0	monster	Furious Poring	2697,2,300000
-lhz_fild01,0,0	monster	Elusive Poring	2698,2,300000
-gef_fild07,0,0	monster	Swift Poring	2699,2,300000
-ein_fild09,0,0	monster	Solid Porcellio	2700,2,300000
-prt_maze03,0,0	monster	Poporing Ringleader	2701,2,300000
-prt_maze02,0,0	monster	Furious Poporing	2702,2,300000
-pay_fild04,0,0	monster	Elusive Poporing	2703,2,300000
-ama_dun02,0,0	monster	Swift Poison Toad	2704,1,300000
-mjolnir_06,0,0	monster	Solid Poison Spore	2705,3,300000
-odin_tem03,0,0	monster	Plasma Ringleader	2706,2,300000
-iz_dun00,0,0	monster	Furious Plankton	2707,2,300000
-ein_dun01,0,0	monster	Elusive Pitman	2708,2,300000
-bra_dun01,0,0	monster	Swift Piranha	2709,2,300000
-spl_fild01,0,0	monster	Solid Dark Pinguicula	2710,2,300000
-spl_fild02,0,0	monster	Pinguicula Ringleader	2711,2,300000
-moc_fild12,0,0	monster	Furious Picky	2712,2,300000
-iz_dun03,0,0	monster	Elusive Phen	2713,2,300000
-gef_fild08,0,0	monster	Swift Petite	2714,2,300000
-gef_fild06,0,0	monster	Solid Petite	2715,2,300000
-treasure02,0,0	monster	Penomena Ringleader	2716,2,300000
-alde_dun03,0,0	monster	Furious Penomena	2717,2,300000
-moc_fild02,0,0	monster	Elusive Peco Peco	2718,2,300000
-in_sphinx5,0,0	monster	Swift Pasana	2719,2,300000
-um_fild03,0,0	monster	Solid Parasite	2720,1,300000
-tha_t05,0,0	monster	Owl Duke Ringleader	2721,2,300000
-//tha_t05,0,0	monster	Owl Duke Ringleader	2721,3,300000	//--Applied after Thanatos Revamped Patch.
-gef_fild10,0,0	monster	Furious Orc Warrior	2722,2,300000
-orcsdun01,0,0	monster	Elusive Orc Zombie	2723,2,300000
-orcsdun02,0,0	monster	Swift Orc Skeleton	2724,2,300000
-gef_fild03,0,0	monster	Solid Orc Lady	2725,3,300000
-tha_t12,0,0	monster	Dame of Sentinel Ringleader	2726,2,300000	//--Remove after Thanatos Ravamped Patch
-ein_fild05,0,0	monster	Furious Noxious	2727,2,300000
-hu_fild05,0,0	monster	Elusive Novus	2728,2,300000
-hu_fild04,0,0	monster	Swift Novus	2729,2,300000
-hu_fild02,0,0	monster	Solid Novus	2730,2,300000
-hu_fild01,0,0	monster	Novus Ringleader	2731,2,300000
-mag_dun02,0,0	monster	Furious Nightmare Terror	2732,2,300000
-gl_chyard_,0,0	monster	Elusive Wraith Dead (Nightmare)	2733,2,180000,0
+abbey01,0,0	monster	Swift Banshee	2887,3,180000
+abbey02,0,0	monster	Swift Zombie Slaughter	2603,3,180000
+abbey03,0,0	monster	Necromancer Ringleader	2736,2,180000
+abyss_01,0,0	monster	Furious Ferus	2832,2,180000
+abyss_02,0,0	monster	Acidus Ringleader	2913,2,180000
+abyss_03,0,0	monster	Solid Acidus	2912,2,180000
+alde_dun01,0,0	monster	Arclouze Ringleader	2894,1,180000
+alde_dun02,0,0	monster	Solid High Orc	2805,2,180000
+alde_dun03,0,0	monster	Furious Penomena	2717,2,180000
+alde_dun04,0,0	monster	Furious Bathory	2885,1,180000
+ama_dun01,0,0	monster	Miyabi Doll Ringleader	2746,2,180000
+ama_dun02,0,0	monster	Swift Poison Toad	2704,1,180000
+ama_dun03,0,0	monster	Furious Shinobi	2664,2,180000
+ama_fild01,0,0	monster	Swift Karakasa	2789,2,180000
+anthell01,0,0	monster	Elusive Deniro	2857,3,180000
+anthell02,0,0	monster	Solid Andre	2902,2,180000
+arug_dun01,0,0	monster	Elusive Banshee Master	2886,2,180000
+ayo_dun01,0,0	monster	Leaf Cat Ringleader	2781,2,180000
+ayo_dun02,0,0	monster	Furious Tamruan	2639,2,180000
+ayo_fild01,0,0	monster	Furious Smokie	2654,2,180000
+ayo_fild02,0,0	monster	Solid Yoyo	2609,1,180000
+beach_dun,0,0	monster	Swift Medusa	2759,2,180000
+beach_dun2,0,0	monster	Furious Stalactic Golem	2644,2,180000
+beach_dun3,0,0	monster	Elusive Thara Frog	2635,2,180000
+bif_fild01,0,0	monster	Miming Ringleader	2751,2,180000
+bif_fild02,0,0	monster	Furious Little Fatum	2777,2,180000
+bra_dun01,0,0	monster	Swift Piranha	2709,2,180000
+bra_dun02,0,0	monster	Solid Iara	2795,3,180000
+bra_fild01,0,0	monster	Furious Toucan	2630,3,180000
+c_tower1,0,0	monster	Solid Rideword	2682,2,180000
+c_tower2,0,0	monster	Furious Clock	2871,1,180000
+c_tower3,0,0	monster	Elusive Alarm	2910,1,180000
+c_tower4,0,0	monster	Clock Ringleader	2870,2,180000
+cmd_fild01,0,0	monster	Elusive Grove	2808,2,180000
+cmd_fild02,0,0	monster	Swift Seal	2829,3,180000
+cmd_fild03,0,0	monster	Solid Alligator	2907,3,180000
+cmd_fild04,0,0	monster	Sea Otter Ringleader	2668,2,180000
+cmd_fild06,0,0	monster	Furious Golem	2812,2,180000
+cmd_fild07,0,0	monster	Elusive Raggler	2694,2,180000
+cmd_fild08,0,0	monster	Elusive Deniro	2857,2,180000
+cmd_fild09,0,0	monster	Swift Metaller	2754,2,180000
+dew_dun01,0,0	monster	Elusive Comodo	2867,2,180000
+dew_dun02,0,0	monster	Solid Banaspaty	2888,2,180000
+dew_fild01,0,0	monster	Swift Rafflesia Arnoldi	2906,2,180000
+dic_dun01,0,0	monster	Swift Uni-horn Scaraba	2799,2,180000
+dic_dun02,0,0	monster	Elusive Antler Scaraba	2896,2,180000
+dic_dun03,0,0	monster	Furious Rake Scaraba	2693,2,180000
+dic_fild01,0,0	monster	Swift Centipede	2873,2,180000
+dic_fild02,0,0	monster	Dolomedes Ringleader	2850,2,180000
+ecl_fild01,0,0	monster	Elusive Menblatt	2758,1,180000
+ecl_tdun01,0,0	monster	Solid Cenere	2874,1,180000
+ecl_tdun02,0,0	monster	Solid Antique Book	2898,1,180000
+ecl_tdun03,0,0	monster	Swift Antique Book	2897,1,180000
+ein_dun01,0,0	monster	Elusive Pitman	2708,2,180000
+ein_dun02,0,0	monster	Solid Mineral	2750,2,180000
+ein_fild02,0,0	monster	Ungoliant Ringleader	2629,2,180000
+ein_fild03,0,0	monster	Swift Teddy Bear	2636,2,180000
+ein_fild04,0,0	monster	Venomous Ringleader	2624,2,180000
+ein_fild05,0,0	monster	Furious Noxious	2727,2,180000
+ein_fild06,0,0	monster	Solid Holden	2745,2,180000
+ein_fild07,0,0	monster	Metaling Ringleader	2756,2,180000
+ein_fild08,0,0	monster	Solid Metaling	2755,2,180000
+ein_fild09,0,0	monster	Solid Porcellio	2700,2,180000
+gef_dun00,0,0	monster	Furious Hunter Fly	2797,1,180000
+gef_dun01,0,0	monster	Elusive Ghoul	2823,2,180000
+gef_dun02,0,0	monster	Solid Deviruchi	2854,2,180000
+gef_dun03,0,0	monster	Solid Wind Ghost	2614,1,180000
+gef_fild00,0,0	monster	Elusive Chonchon	2872,2,180000
+gef_fild01,0,0	monster	Furious Roda Frog	2679,2,180000
+gef_fild02,0,0	monster	Solid Coco	2869,3,180000
+gef_fild03,0,0	monster	Solid Orc Lady	2725,3,180000
+gef_fild04,0,0	monster	Solid Mandragora	2765,2,180000
+gef_fild05,0,0	monster	Swift Creamy	2863,2,180000
+gef_fild06,0,0	monster	Solid Petite	2715,2,180000
+gef_fild07,0,0	monster	Swift Poring	2699,2,180000
+gef_fild08,0,0	monster	Swift Petite	2714,2,180000
+gef_fild09,0,0	monster	Swift Coco	2868,2,180000
+gef_fild10,0,0	monster	Furious Orc Warrior	2722,2,180000
+gef_fild11,0,0	monster	Swift Goblin	2814,3,180000
+gefenia01,0,0	monster	Swift False Angel	2834,2,180000
+gefenia02,0,0	monster	Solid Violy	2623,2,180000
+gefenia03,0,0	monster	Swift Violy	2622,2,180000
+gefenia04,0,0	monster	Elusive Violy	2621,2,180000
+gl_cas01,0,0	monster	Elusive Carat	2877,2,180000
 gl_cas02_,0,0	monster	Furious Wanderer (Nightmare)	2734,2,180000,0
 gl_cas02_,0,0	monster	Furious Wanderer (Nightmare)	2734,2,180000,0
-man_fild01,0,0	monster	Solid Nephentes	2735,2,300000
-abbey03,0,0	monster	Necromancer Ringleader	2736,2,300000
-xmas_dun02,0,0	monster	Furious Myst Case	2737,2,300000
-ve_fild04,0,0	monster	Elusive Muscipular	2738,2,300000
-moc_pryd03,0,0	monster	Swift Mummy	2739,2,300000
-moc_pryd02,0,0	monster	Solid Mummy	2740,2,300000
-moc_fild01,0,0	monster	Muka Ringleader	2741,3,300000
-moc_fild22,0,0	monster	Furious Incarnation of Morocc	2742,3,300000
-moc_fild21,0,0	monster	Elusive Incarnation of Morocc	2743,2,300000
-moc_fild20,0,0	monster	Swift Incarnation of Morocc	2744,1,300000
-ein_fild06,0,0	monster	Solid Holden	2745,2,300000
-ama_dun01,0,0	monster	Miyabi Doll Ringleader	2746,2,300000
-moc_prydn1,0,0	monster	Furious Minorous	2747,2,300000
-moc_pryd05,0,0	monster	Elusive Minorous	2748,2,300000
-in_sphinx4,0,0	monster	Swift Minorous	2749,1,300000
-ein_dun02,0,0	monster	Solid Mineral	2750,2,300000
-bif_fild01,0,0	monster	Miming Ringleader	2751,2,300000
-moc_prydn2,0,0	monster	Furious Mimic	2752,2,300000
-moc_pryd06,0,0	monster	Elusive Mimic	2753,2,300000
-cmd_fild09,0,0	monster	Swift Metaller	2754,2,300000
-ein_fild08,0,0	monster	Solid Metaling	2755,2,300000
-ein_fild07,0,0	monster	Metaling Ringleader	2756,2,300000
-iz_dun04,0,0	monster	Furious Merman	2757,2,300000
-ecl_fild01,0,0	monster	Elusive Menblatt	2758,1,300000
-beach_dun,0,0	monster	Swift Medusa	2759,2,300000
-mjo_dun02,0,0	monster	Solid Martin	2760,2,300000
-gl_in01,0,0	monster	Marionette Ringleader	2761,1,300000
-xmas_fild01,0,0	monster	Furious Marin	2762,1,300000
-in_sphinx3,0,0	monster	Elusive Marduk	2763,1,300000
-prt_maze03,0,0	monster	Swift Mantis	2764,2,300000
-gef_fild04,0,0	monster	Solid Mandragora	2765,2,300000
-ma_dun01,0,0	monster	Manananggal Ringleader	2766,2,300000
-gl_dun02,0,0	monster	Furious Majoruros	2767,1,300000
-prt_fild09,0,0	monster	Elusive Magnolia	2768,2,300000
-ve_fild03,0,0	monster	Swift Magmaring	2769,2,300000
-prt_fild08,0,0	monster	Solid Lunatic	2770,1,300000
-prt_fild01,0,0	monster	Lunatic Ringleader	2771,2,300000
-niflheim,0,0	monster	Furious Lude	2772,1,300000
-spl_fild03,0,0	monster	Elusive Luciola Vespa	2773,1,300000
-nif_fild02,0,0	monster	Swift Loli Ruri	2774,1,300000
-gon_dun02,0,0	monster	Solid Enchanted Peach Tree	2775,1,300000
-new_1-3,0,0	monster	Baby Poring Ringleader	2776,2,300000
-bif_fild02,0,0	monster	Furious Little Fatum	2777,2,300000
-lou_dun01,0,0	monster	Elusive Jing Guai	2778,2,300000
-mosk_dun02,0,0	monster	Swift Les	2779,1,300000
-gld_dun01,0,0	monster	Solid Leib Olmai	2780,2,300000
-ayo_dun01,0,0	monster	Leaf Cat Ringleader	2781,2,300000
-teg_dun02,0,0	monster	Furious Wickebine Tres	2782,2,300000,0
-teg_dun01,0,0	monster	Elusive Eremes	2783,2,300000,0
-ra_fild06,0,0	monster	Swift Kobold Archer	2784,3,300000
-ra_fild05,0,0	monster	Solid Kobold	2785,3,300000
-thor_v02,0,0	monster	Knocker Ringleader	2786,1,300000
-mjolnir_08,0,0	monster	Furious Beetle King	2787,2,300000
-thor_v01,0,0	monster	Elusive Kasa	2788,2,300000
-ama_fild01,0,0	monster	Swift Karakasa	2789,2,300000
-moc_pryd04,0,0	monster	Solid Isis	2790,2,300000
-ra_san02,0,0	monster	Isilla Ringleader	2791,2,300000
-gl_prison1,0,0	monster	Furious Injustice	2792,2,300000
-lou_fild01,0,0	monster	Elusive Mi Gao	2793,1,300000
-ice_dun03,0,0	monster	Swift Ice Titan	2794,2,300000
-bra_dun02,0,0	monster	Solid Iara	2795,3,300000
-lou_dun02,0,0	monster	Yao Jun Ringleader	2796,1,300000
-gef_dun00,0,0	monster	Furious Hunter Fly	2797,1,300000
-prt_fild05,0,0	monster	Elusive Hornet	2798,2,300000
-dic_dun01,0,0	monster	Swift Uni-horn Scaraba	2799,2,300000
-pay_fild09,0,0	monster	Solid Horn	2800,2,300000
-ra_san03,0,0	monster	Hodremlin Ringleader	2801,2,300000
-moc_fild17,0,0	monster	Furious Hode	2802,2,300000
-ra_fild04,0,0	monster	Elusive Hill Wind	2803,3,300000
-ra_fild03,0,0	monster	Swift Hill Wind	2804,3,300000
-alde_dun02,0,0	monster	Solid High Orc	2805,2,300000
-yuno_fild04,0,0	monster	Harpy Ringleader	2806,3,300000
-yuno_fild03,0,0	monster	Furious Harpy	2807,3,300000
-cmd_fild01,0,0	monster	Elusive Grove	2808,2,300000
-pay_fild10,0,0	monster	Swift Greatest General	2809,2,300000
-yuno_fild09,0,0	monster	Solid Grand Peco	2810,2,300000
-yuno_fild08,0,0	monster	Grand Peco Ringleader	2811,2,300000
-cmd_fild06,0,0	monster	Furious Golem	2812,2,300000
-prt_fild11,0,0	monster	Elusive Goblin	2813,3,300000
-gef_fild11,0,0	monster	Swift Goblin	2814,3,300000
-yuno_fild11,0,0	monster	Solid Goat	2815,2,300000
-yuno_fild07,0,0	monster	Goat Ringleader	2816,2,300000
-gld2_prt,0,0	monster	Furious Dark Hammer Kobold	2817,2,300000
-gld_dun03_2,0,0	monster	Elusive Dark Hammer Kobold	2818,2,300000
-gld2_gef,0,0	monster	Swift Dark Shadow	2819,2,300000
-gld_dun04_2,0,0	monster	Solid Dark Shadow	2820,2,300000
-gld_dun02,0,0	monster	Giant Hornet Ringleader	2821,2,300000
-nameless_n,0,0	monster	Furious Ghoul	2822,1,300000
-gef_dun01,0,0	monster	Elusive Ghoul	2823,2,300000
-yuno_fild12,0,0	monster	Swift Geographer	2824,1,300000
-yuno_fild01,0,0	monster	Solid Geographer	2825,2,300000
-glast_01,0,0	monster	Gargoyle Ringleader	2826,1,300000
-gl_sew02,0,0	monster	Furious Gargoyle	2827,1,300000
-ve_fild01,0,0	monster	Elusive Galion	2828,1,300000
-cmd_fild02,0,0	monster	Swift Seal	2829,3,300000
-tur_dun05,0,0	monster	Solid Freezer	2830,1,300000
-tur_dun03,0,0	monster	Freezer Ringleader	2831,1,300000
-abyss_01,0,0	monster	Furious Ferus	2832,2,300000
-prt_sewb1,0,0	monster	Elusive Familiar	2833,1,300000
-gefenia01,0,0	monster	Swift False Angel	2834,2,300000
-prt_fild06,0,0	monster	Solid Fabre	2835,2,300000
-pay_fild03,0,0	monster	Fabre Ringleader	2836,3,300000
-mag_dun01,0,0	monster	Furious Explosion	2837,1,300000
-gl_church,0,0	monster	Elusive Evil Druid	2838,2,300000
-prt_fild10,0,0	monster	Swift Elder Willow	2839,3,300000
-mjolnir_02,0,0	monster	Solid Elder Willow	2840,3,300000
-ra_san04,0,0	monster	Echio Ringleader	2841,1,300000
-mjolnir_12,0,0	monster	Furious Dustiness	2842,2,300000
-um_fild01,0,0	monster	Swift Dryad	2843,2,300000
-ve_fild02,0,0	monster	Solid Drosera	2844,2,300000
-moc_fild07,0,0	monster	Drops Ringleader	2845,3,300000
-mjolnir_04,0,0	monster	Furious Driller	2846,3,300000
-in_sphinx1,0,0	monster	Elusive Drainliar	2847,1,300000
-tur_dun01,0,0	monster	Swift Dragon Tail	2848,1,300000
-nyd_dun01,0,0	monster	Solid Draco	2849,2,300000
-dic_fild02,0,0	monster	Dolomedes Ringleader	2850,2,300000
-pay_dun04,0,0	monster	Furious Dokebi	2851,2,300000
-nif_fild01,0,0	monster	Elusive Disguise	2852,2,300000
-jupe_core,0,0	monster	Swift Dimik	2853,3,300000
-gef_dun02,0,0	monster	Solid Deviruchi	2854,2,300000
-ra_fild01,0,0	monster	Baby Desert Wolf Ringleader	2855,2,300000
-moc_fild11,0,0	monster	Furious Baby Desert Wolf	2856,3,300000
-cmd_fild08,0,0	monster	Elusive Deniro	2857,2,300000
-anthell01,0,0	monster	Elusive Deniro	2857,3,300000
-tha_t06,0,0	monster	Swift Death Word	2858,2,300000
-//tha_t06,0,0	monster	Swift Death Word	2858,3,300000	//--Applied after Thanatos Revamped Patch.
-tha_t04,0,0	monster	Solid Death Word	2859,2,300000
-tha_t03,0,0	monster	Death Word Ringleader	2860,2,300000
-gl_chyard,0,0	monster	Furious Dark Priest	2861,2,300000
-lou_dun03,0,0	monster	Elusive Zhu Po Long	2862,1,300000
-gef_fild05,0,0	monster	Swift Creamy	2863,2,300000
-iz_dun02,0,0	monster	Solid Cornutus	2864,2,300000
-xmas_dun01,0,0	monster	Cookie Ringleader	2865,2,300000
-kh_kiehl01,0,0	monster	Furious Constant	2866,2,300000
-dew_dun01,0,0	monster	Elusive Comodo	2867,2,300000
-gef_fild09,0,0	monster	Swift Coco	2868,2,300000
-gef_fild02,0,0	monster	Solid Coco	2869,3,300000
-c_tower4,0,0	monster	Clock Ringleader	2870,2,300000
-c_tower2,0,0	monster	Furious Clock	2871,1,300000
-gef_fild00,0,0	monster	Elusive Chonchon	2872,2,300000
-dic_fild01,0,0	monster	Swift Centipede	2873,2,300000
-ecl_tdun01,0,0	monster	Solid Cenere	2874,1,300000
-lhz_dun04,0,0	monster	Celia Ringleader	2875,3,300000
-gld_dun03,0,0	monster	Furious Caterpillar	2876,2,300000
-gl_cas01,0,0	monster	Elusive Carat	2877,2,300000
-mjolnir_01,0,0	monster	Swift Caramel	2878,2,300000
-ma_fild02,0,0	monster	Solid Bungisngis	2879,2,300000
-odin_tem01,0,0	monster	Breeze Ringleader	2880,1,300000
-lhz_fild03,0,0	monster	Furious Breeze	2881,3,300000
-man_fild02,0,0	monster	Elusive Bradium Golem	2882,2,300000
-gon_dun01,0,0	monster	Swift Bloody Butterfly	2883,2,300000
-pay_fild07,0,0	monster	Bigfoot Ringleader	2884,2,300000
-alde_dun04,0,0	monster	Furious Bathory	2885,1,300000
-arug_dun01,0,0	monster	Elusive Banshee Master	2886,2,300000
-abbey01,0,0	monster	Swift Banshee	2887,3,300000
-dew_dun02,0,0	monster	Solid Banaspaty	2888,2,300000
-tur_dun04,0,0	monster	Assaulter Ringleader	2889,1,300000
-mjolnir_10,0,0	monster	Furious Argos	2890,2,300000
-mjolnir_11,0,0	monster	Elusive Argiope	2891,2,300000
-mjolnir_05,0,0	monster	Swift Argiope	2892,2,300000
-gl_dun01,0,0	monster	Solid Arclouze	2893,1,300000
-alde_dun01,0,0	monster	Arclouze Ringleader	2894,1,300000
-juperos_02,0,0	monster	Furious Apocalypse	2895,3,300000
-dic_dun02,0,0	monster	Elusive Antler Scaraba	2896,2,300000
-ecl_tdun03,0,0	monster	Swift Antique Book	2897,1,300000
-ecl_tdun02,0,0	monster	Solid Antique Book	2898,1,300000
-gl_sew04,0,0	monster	Furious Anolian	2899,2,300000
-gld2_ald,0,0	monster	Elusive Angra Mantis	2900,2,300000
-gld_dun02_2,0,0	monster	Swift Angra Mantis	2901,2,300000
-anthell02,0,0	monster	Solid Andre	2902,2,300000
-tha_t02,0,0	monster	Ancient Mimic Ringleader	2903,2,300000
-ra_fild08,0,0	monster	Furious Anacondaq	2904,2,300000
-prt_fild04,0,0	monster	Elusive Ambernite	2905,2,300000
-dew_fild01,0,0	monster	Swift Rafflesia Arnoldi	2906,2,300000
-cmd_fild03,0,0	monster	Solid Alligator	2907,3,300000
-kh_dun01,0,0	monster	Aliza Ringleader	2908,1,300000
-kh_dun02,0,0	monster	Furious Alicel	2909,1,300000
-c_tower3,0,0	monster	Elusive Alarm	2910,1,300000
-ra_san05,0,0	monster	Swift Agav	2911,2,300000
-abyss_03,0,0	monster	Solid Acidus	2912,2,300000
-abyss_02,0,0	monster	Acidus Ringleader	2913,2,300000
+gl_cas02,0,0	monster	Furious Wanderer	2620,2,180000
+gl_church,0,0	monster	Elusive Evil Druid	2838,2,180000
+gl_chyard_,0,0	monster	Elusive Wraith Dead (Nightmare)	2733,2,180000,0
+gl_chyard,0,0	monster	Furious Dark Priest	2861,2,180000
+gl_dun01,0,0	monster	Solid Arclouze	2893,1,180000
+gl_dun02,0,0	monster	Furious Majoruros	2767,1,180000
+gl_in01,0,0	monster	Marionette Ringleader	2761,1,180000
+gl_knt01,0,0	monster	Solid Raydric	2691,2,180000
+gl_knt02,0,0	monster	Swift Raydric	2690,2,180000
+gl_prison,0,0	monster	Solid Zombie Prisoner	2604,1,180000
+gl_prison1,0,0	monster	Furious Injustice	2792,2,180000
+gl_sew01,0,0	monster	Solid Whisper	2618,1,180000
+gl_sew02,0,0	monster	Furious Gargoyle	2827,1,180000
+gl_sew03,0,0	monster	Elusive Sting	2640,2,180000
+gl_sew04,0,0	monster	Furious Anolian	2899,2,180000
+gl_step,0,0	monster	Solid Wind Ghost	2614,2,180000
+glast_01,0,0	monster	Gargoyle Ringleader	2826,1,180000
+gld_dun01_2,0,0	monster	Furious Skeleton General	2659,2,180000
+gld_dun01,0,0	monster	Solid Leib Olmai	2780,2,180000
+gld_dun02_2,0,0	monster	Swift Angra Mantis	2901,2,180000
+gld_dun02,0,0	monster	Giant Hornet Ringleader	2821,2,180000
+gld_dun03_2,0,0	monster	Elusive Dark Hammer Kobold	2818,2,180000
+gld_dun03,0,0	monster	Furious Caterpillar	2876,2,180000
+gld_dun04_2,0,0	monster	Solid Dark Shadow	2820,2,180000
+gld_dun04,0,0	monster	Zombie Master Ringleader	2605,2,180000
+gld2_ald,0,0	monster	Elusive Angra Mantis	2900,2,180000
+gld2_gef,0,0	monster	Swift Dark Shadow	2819,2,180000
+gld2_pay,0,0	monster	Skeleton General Ringleader	2658,2,180000
+gld2_prt,0,0	monster	Furious Dark Hammer Kobold	2817,2,180000
+gon_dun01,0,0	monster	Swift Bloody Butterfly	2883,2,180000
+gon_dun02,0,0	monster	Solid Enchanted Peach Tree	2775,1,180000
+gon_dun03,0,0	monster	Elusive Evil Nymph	2617,2,180000
+gon_fild01,0,0	monster	Dumpling Child Ringleader	2683,2,180000
+hu_fild01,0,0	monster	Novus Ringleader	2731,2,180000
+hu_fild02,0,0	monster	Solid Novus	2730,2,180000
+hu_fild04,0,0	monster	Swift Novus	2729,2,180000
+hu_fild05,0,0	monster	Elusive Novus	2728,2,180000
+hu_fild06,0,0	monster	Swift Shellfish	2666,1,180000
+ice_dun01,0,0	monster	Swift Siroma	2661,1,180000
+ice_dun02,0,0	monster	Solid Snowier	2652,2,180000
+ice_dun03,0,0	monster	Swift Ice Titan	2794,2,180000
+in_sphinx1,0,0	monster	Elusive Drainliar	2847,1,180000
+in_sphinx2,0,0	monster	Solid Requiem	2687,2,180000
+in_sphinx3,0,0	monster	Elusive Marduk	2763,1,180000
+in_sphinx4,0,0	monster	Swift Minorous	2749,1,180000
+in_sphinx5,0,0	monster	Swift Pasana	2719,2,180000
+iz_dun00,0,0	monster	Furious Plankton	2707,2,180000
+iz_dun01,0,0	monster	Solid Vadon	2628,2,180000
+iz_dun02,0,0	monster	Solid Cornutus	2864,2,180000
+iz_dun03,0,0	monster	Elusive Phen	2713,2,180000
+iz_dun04,0,0	monster	Furious Merman	2757,2,180000
+iz_dun05,0,0	monster	Furious Lamp Rey	2669,2,180000
+jupe_core,0,0	monster	Swift Dimik	2853,3,180000
+juperos_01,0,0	monster	Furious Venatu	2625,3,180000
+juperos_02,0,0	monster	Furious Apocalypse	2895,3,180000
+kh_dun01,0,0	monster	Aliza Ringleader	2908,1,180000
+kh_dun02,0,0	monster	Furious Alicel	2909,1,180000
+kh_kiehl01,0,0	monster	Furious Constant	2866,2,180000
+lhz_dun01,0,0	monster	Remover Ringleader	2688,3,180000
+lhz_dun02,0,0	monster	Laurell Weinder Ringleader	2692,3,180000
+lhz_dun03,0,0	monster	Solid Cecil Damon	2667,3,180000
+lhz_dun04,0,0	monster	Celia Ringleader	2875,3,180000
+lhz_fild01,0,0	monster	Swift Rafflesia	2695,3,180000
+lhz_fild01,0,0	monster	Poring Ringleader	2696,2,180000
+lhz_fild01,0,0	monster	Furious Poring	2697,2,180000
+lhz_fild01,0,0	monster	Elusive Poring	2698,2,180000
+lhz_fild02,0,0	monster	Swift Stem Worm	2641,2,180000
+lhz_fild03,0,0	monster	Furious Breeze	2881,3,180000
+lou_dun01,0,0	monster	Elusive Jing Guai	2778,2,180000
+lou_dun02,0,0	monster	Yao Jun Ringleader	2796,1,180000
+lou_dun03,0,0	monster	Elusive Zhu Po Long	2862,1,180000
+lou_fild01,0,0	monster	Elusive Mi Gao	2793,1,180000
+ma_dun01,0,0	monster	Manananggal Ringleader	2766,2,180000
+ma_fild01,0,0	monster	Elusive Tiyanak	2631,2,180000
+ma_fild02,0,0	monster	Solid Bungisngis	2879,2,180000
+mag_dun01,0,0	monster	Furious Explosion	2837,1,180000
+mag_dun02,0,0	monster	Furious Nightmare Terror	2732,2,180000
+mal_dun01,0,0	monster	Elusive Red Eruma	2689,2,180000
+man_fild01,0,0	monster	Solid Nephentes	2735,2,180000
+man_fild02,0,0	monster	Elusive Bradium Golem	2882,2,180000
+man_fild03,0,0	monster	Solid Tatacho	2637,1,180000
+mjo_dun01,0,0	monster	Tarou Ringleader	2638,2,180000
+mjo_dun02,0,0	monster	Solid Martin	2760,2,180000
+mjo_dun03,0,0	monster	Elusive Skeleton Worker	2660,2,180000
+mjolnir_01,0,0	monster	Swift Caramel	2878,2,180000
+mjolnir_02,0,0	monster	Solid Elder Willow	2840,3,180000
+mjolnir_03,0,0	monster	Side Winder Ringleader	2663,2,180000
+mjolnir_04,0,0	monster	Furious Driller	2846,3,180000
+mjolnir_05,0,0	monster	Swift Argiope	2892,2,180000
+mjolnir_06,0,0	monster	Solid Poison Spore	2705,3,180000
+mjolnir_07,0,0	monster	Savage Ringleader	2673,3,180000
+mjolnir_08,0,0	monster	Furious Beetle King	2787,2,180000
+mjolnir_09,0,0	monster	Swift Savage Babe	2671,2,180000
+mjolnir_10,0,0	monster	Furious Argos	2890,2,180000
+mjolnir_11,0,0	monster	Elusive Argiope	2891,2,180000
+mjolnir_12,0,0	monster	Furious Dustiness	2842,2,180000
+moc_fild01,0,0	monster	Muka Ringleader	2741,3,180000
+moc_fild02,0,0	monster	Elusive Peco Peco	2718,2,180000
+moc_fild03,0,0	monster	Swift Wolf	2613,2,180000
+moc_fild07,0,0	monster	Drops Ringleader	2845,3,180000
+moc_fild11,0,0	monster	Furious Baby Desert Wolf	2856,3,180000
+moc_fild12,0,0	monster	Furious Picky	2712,2,180000
+moc_fild13,0,0	monster	Solid Steel Chonchon	2642,3,180000
+moc_fild16,0,0	monster	Furious Sandman	2674,2,180000
+moc_fild17,0,0	monster	Furious Hode	2802,2,180000
+moc_fild18,0,0	monster	Elusive Scorpion	2670,3,180000
+moc_fild20,0,0	monster	Swift Incarnation of Morocc	2744,1,180000
+moc_fild21,0,0	monster	Elusive Incarnation of Morocc	2743,2,180000
+moc_fild22,0,0	monster	Furious Incarnation of Morocc	2742,3,180000
+moc_pryd02,0,0	monster	Solid Mummy	2740,2,180000
+moc_pryd03,0,0	monster	Swift Mummy	2739,2,180000
+moc_pryd04,0,0	monster	Solid Isis	2790,2,180000
+moc_pryd05,0,0	monster	Elusive Minorous	2748,2,180000
+moc_pryd06,0,0	monster	Elusive Mimic	2753,2,180000
+moc_prydn1,0,0	monster	Furious Minorous	2747,2,180000
+moc_prydn2,0,0	monster	Furious Mimic	2752,2,180000
+mosk_dun01,0,0	monster	Elusive Wood Goblin	2612,2,180000
+mosk_dun02,0,0	monster	Swift Les	2779,1,180000
+mosk_dun03,0,0	monster	Elusive Vavayaga	2626,2,180000
+mosk_fild02,0,0	monster	Solid Side Winder	2662,1,180000
+nameless_n,0,0	monster	Furious Ghoul	2822,1,180000
+new_1-3,0,0	monster	Baby Poring Ringleader	2776,2,180000
+nif_fild01,0,0	monster	Elusive Disguise	2852,2,180000
+nif_fild02,0,0	monster	Swift Loli Ruri	2774,1,180000
+niflheim,0,0	monster	Furious Lude	2772,1,180000
+nyd_dun01,0,0	monster	Solid Draco	2849,2,180000
+odin_tem01,0,0	monster	Breeze Ringleader	2880,1,180000
+odin_tem02,0,0	monster	Solid Skogul	2657,1,180000
+odin_tem03,0,0	monster	Plasma Ringleader	2706,2,180000
+orcsdun01,0,0	monster	Elusive Orc Zombie	2723,2,180000
+orcsdun02,0,0	monster	Swift Orc Skeleton	2724,2,180000
+pay_dun00,0,0	monster	Furious Zombie	2606,2,180000
+pay_dun01,0,0	monster	Furious Soldier Skeleton	2649,2,180000
+pay_dun02,0,0	monster	Soldier Skeleton Ringleader	2648,3,180000
+pay_dun03,0,0	monster	Swift Sohee	2651,2,180000
+pay_dun04,0,0	monster	Furious Dokebi	2851,2,180000
+pay_fild01,0,0	monster	Willow Ringleader	2615,2,180000
+pay_fild02,0,0	monster	Boa Ringleader	2653,3,180000
+pay_fild03,0,0	monster	Fabre Ringleader	2836,3,180000
+pay_fild04,0,0	monster	Elusive Poporing	2703,2,180000
+pay_fild06,0,0	monster	Wormtail Ringleader	2610,3,180000
+pay_fild07,0,0	monster	Bigfoot Ringleader	2884,2,180000
+pay_fild09,0,0	monster	Solid Horn	2800,2,180000
+pay_fild10,0,0	monster	Swift Greatest General	2809,2,180000
+prt_fild00,0,0	monster	Roda Frog Ringleader	2678,2,180000
+prt_fild01,0,0	monster	Lunatic Ringleader	2771,2,180000
+prt_fild02,0,0	monster	Elusive Stainer	2645,3,180000
+prt_fild03,0,0	monster	Swift Yoyo	2608,2,180000
+prt_fild04,0,0	monster	Elusive Ambernite	2905,2,180000
+prt_fild05,0,0	monster	Elusive Hornet	2798,2,180000
+prt_fild06,0,0	monster	Solid Fabre	2835,2,180000
+prt_fild07,0,0	monster	Elusive Rocker	2680,3,180000
+prt_fild08,0,0	monster	Solid Lunatic	2770,1,180000
+prt_fild08,0,0	monster	Poring Ringleader	2696,1,180000
+prt_fild08,0,0	monster	Furious Poring	2697,1,180000
+prt_fild08,0,0	monster	Elusive Poring	2698,1,180000
+prt_fild08,0,0	monster	Swift Poring	2699,1,180000
+prt_fild09,0,0	monster	Elusive Magnolia	2768,2,180000
+prt_fild10,0,0	monster	Swift Elder Willow	2839,3,180000
+prt_fild11,0,0	monster	Elusive Goblin	2813,3,180000
+prt_maze01,0,0	monster	Solid Savage	2672,2,180000
+prt_maze02,0,0	monster	Furious Poporing	2702,2,180000
+prt_maze03,0,0	monster	Poporing Ringleader	2701,2,180000
+prt_maze03,0,0	monster	Swift Mantis	2764,2,180000
+prt_sewb1,0,0	monster	Elusive Familiar	2833,1,180000
+prt_sewb2,0,0	monster	Furious Thief Bug	2634,2,180000
+prt_sewb3,0,0	monster	Thief Bug Ringleader	2633,3,180000
+prt_sewb4,0,0	monster	Solid Thief Bug	2632,2,180000
+ra_fild01,0,0	monster	Baby Desert Wolf Ringleader	2855,2,180000
+ra_fild03,0,0	monster	Swift Hill Wind	2804,3,180000
+ra_fild04,0,0	monster	Elusive Hill Wind	2803,3,180000
+ra_fild05,0,0	monster	Solid Kobold	2785,3,180000
+ra_fild06,0,0	monster	Swift Kobold Archer	2784,3,180000
+ra_fild08,0,0	monster	Furious Anacondaq	2904,2,180000
+ra_fild12,0,0	monster	Solid Roween	2677,2,180000
+ra_san01,0,0	monster	Swift Vanberk	2627,2,180000
+ra_san02,0,0	monster	Isilla Ringleader	2791,2,180000
+ra_san03,0,0	monster	Hodremlin Ringleader	2801,2,180000
+ra_san04,0,0	monster	Echio Ringleader	2841,1,180000
+ra_san05,0,0	monster	Swift Agav	2911,2,180000
+schg_dun01,0,0	monster	Elusive Zakudam	2607,2,180000
+spl_fild01,0,0	monster	Solid Dark Pinguicula	2710,2,180000
+spl_fild02,0,0	monster	Pinguicula Ringleader	2711,2,180000
+spl_fild03,0,0	monster	Elusive Luciola Vespa	2773,1,180000
+teg_dun01,0,0	monster	Elusive Eremes	2783,2,180000,0
+teg_dun02,0,0	monster	Furious Wickebine Tres	2782,2,180000,0
+tha_t01,0,0	monster	Swift Rideword	2681,2,180000
+//tha_t01,0,0	monster	Swift Rideword	2681,1,180000	//--Applied after Thanatos Revamped Patch.
+tha_t02,0,0	monster	Ancient Mimic Ringleader	2903,2,180000
+tha_t03,0,0	monster	Death Word Ringleader	2860,2,180000
+tha_t04,0,0	monster	Solid Death Word	2859,2,180000
+tha_t05,0,0	monster	Owl Duke Ringleader	2721,2,180000
+//tha_t05,0,0	monster	Owl Duke Ringleader	2721,3,180000	//--Applied after Thanatos Revamped Patch.
+tha_t06,0,0	monster	Swift Death Word	2858,2,180000
+//tha_t06,0,0	monster	Swift Death Word	2858,3,180000	//--Applied after Thanatos Revamped Patch.
+tha_t07,0,0	monster	Swift Baroness of Retribution	2686,2,180000
+//tha_t07,0,0	monster	Swift Baroness of Retribution	2686,1,180000	//--Applied after Thanatos Revamped Patch.
+tha_t08,0,0	monster	Elusive Baroness of Retribution	2685,2,180000
+//tha_t08,0,0	monster	Elusive Baroness of Retribution	2685,1,180000	//--Applied after Thanatos Revamped Patch.
+tha_t09,0,0	monster	Elusive Lady Solace	2650,2,180000	//--Remove after Thanatos Ravamped Patch
+tha_t10,0,0	monster	Furious Baroness of Retribution	2684,2,180000	//--Remove after Thanatos Ravamped Patch
+tha_t11,0,0	monster	Elusive Mistress of Shelter	2665,2,180000	//--Remove after Thanatos Ravamped Patch
+tha_t12,0,0	monster	Dame of Sentinel Ringleader	2726,2,180000	//--Remove after Thanatos Ravamped Patch
+thor_v01,0,0	monster	Elusive Kasa	2788,2,180000
+thor_v02,0,0	monster	Knocker Ringleader	2786,1,180000
+thor_v03,0,0	monster	Elusive Salamander	2675,2,180000
+treasure_n1,0,0	monster	Swift Spore	2646,2,180000
+treasure_n2,0,0	monster	Weak Skeleton Ringleader	2619,2,180000
+treasure02,0,0	monster	Swift Sailor Skeleton	2676,1,180000
+treasure02,0,0	monster	Penomena Ringleader	2716,2,180000
+tur_dun01,0,0	monster	Swift Dragon Tail	2848,1,180000
+tur_dun02,0,0	monster	Solid Solider	2647,2,180000
+tur_dun03,0,0	monster	Freezer Ringleader	2831,1,180000
+tur_dun04,0,0	monster	Assaulter Ringleader	2889,1,180000
+tur_dun05,0,0	monster	Solid Freezer	2830,1,180000
+um_fild01,0,0	monster	Swift Dryad	2843,2,180000
+um_fild02,0,0	monster	Furious Wootan Fighter	2611,1,180000
+um_fild03,0,0	monster	Solid Parasite	2720,1,180000
+um_fild04,0,0	monster	Furious Wild Rose	2616,1,180000
+ve_fild01,0,0	monster	Elusive Galion	2828,1,180000
+ve_fild02,0,0	monster	Solid Drosera	2844,2,180000
+ve_fild03,0,0	monster	Swift Magmaring	2769,2,180000
+ve_fild04,0,0	monster	Elusive Muscipular	2738,2,180000
+ve_fild07,0,0	monster	Stapo Ringleader	2643,2,180000
+xmas_dun01,0,0	monster	Cookie Ringleader	2865,2,180000
+xmas_dun02,0,0	monster	Furious Myst Case	2737,2,180000
+xmas_fild01,0,0	monster	Furious Marin	2762,1,180000
+yuno_fild01,0,0	monster	Solid Geographer	2825,2,180000
+yuno_fild02,0,0	monster	Swift Sleeper	2656,2,180000
+yuno_fild03,0,0	monster	Furious Harpy	2807,3,180000
+yuno_fild04,0,0	monster	Harpy Ringleader	2806,3,180000
+yuno_fild06,0,0	monster	Elusive Sleeper	2655,1,180000
+yuno_fild07,0,0	monster	Goat Ringleader	2816,2,180000
+yuno_fild08,0,0	monster	Grand Peco Ringleader	2811,2,180000
+yuno_fild09,0,0	monster	Solid Grand Peco	2810,2,180000
+yuno_fild11,0,0	monster	Solid Goat	2815,2,180000
+yuno_fild12,0,0	monster	Swift Geographer	2824,1,180000

+ 23 - 31
npc/re/mobs/fields/prontera.txt

@@ -3,7 +3,7 @@
 //===== By: ==================================================
 //===== By: ==================================================
 //= Athena (1.0)
 //= Athena (1.0)
 //===== Current Version: =====================================
 //===== Current Version: =====================================
-//= 1.7
+//= 1.8
 //===== Additional Comments: =================================
 //===== Additional Comments: =================================
 //= 1.2 fixed some map name typos [Lupus]
 //= 1.2 fixed some map name typos [Lupus]
 //= 1.3 Official kRO 10.1 spawns [Playtester]
 //= 1.3 Official kRO 10.1 spawns [Playtester]
@@ -11,6 +11,7 @@
 //= 1.5 Updated to Renewal spawns.
 //= 1.5 Updated to Renewal spawns.
 //= 1.6 Added Prontera Field 8 duplicates. [Euphy]
 //= 1.6 Added Prontera Field 8 duplicates. [Euphy]
 //= 1.7 Correct Spawn by Navigation's mob data. [attackjom]
 //= 1.7 Correct Spawn by Navigation's mob data. [attackjom]
+//= 1.8 Official 18.1 Field 8 spawns, duplicates removed [Playtester]
 //============================================================
 //============================================================
 
 
 //==================================================
 //==================================================
@@ -90,36 +91,27 @@ prt_fild07,225,110,5,5	monster	Black Mushroom	1084,3,360000,180000
 //==================================================
 //==================================================
 // prt_fild08 - Prontera Field
 // prt_fild08 - Prontera Field
 //==================================================
 //==================================================
-prt_fild08,0,0	monster	Poring	1002,110,5000
-prt_fild08,0,0	monster	Lunatic	1063,110,5000
-prt_fild08,0,0	monster	Fabre	1007,88,5000
-prt_fild08,0,0	monster	Little Poring	2398,33,50000
-prt_fild08,0,0	monster	Pupa	1008,66,5000
-
-//==================================================
-// prt_fild08 - Duplicates
-//==================================================
-prt_fild08a,0,0	monster	Poring	1002,110,5000
-prt_fild08a,0,0	monster	Lunatic	1063,110,5000
-prt_fild08a,0,0	monster	Fabre	1007,88,5000
-prt_fild08a,0,0	monster	Little Poring	2398,33,50000
-prt_fild08a,0,0	monster	Pupa	1008,66,5000
-prt_fild08b,0,0	monster	Poring	1002,110,5000
-prt_fild08b,0,0	monster	Lunatic	1063,110,5000
-prt_fild08b,0,0	monster	Fabre	1007,88,5000
-prt_fild08b,0,0	monster	Little Poring	2398,33,50000
-prt_fild08b,0,0	monster	Pupa	1008,66,5000
-prt_fild08c,0,0	monster	Poring	1002,110,5000
-prt_fild08c,0,0	monster	Lunatic	1063,110,5000
-prt_fild08c,0,0	monster	Fabre	1007,88,5000
-prt_fild08c,0,0	monster	Little Poring	2398,33,50000
-prt_fild08c,0,0	monster	Pupa	1008,66,5000
-prt_fild08d,0,0	monster	Poring	1002,110,5000
-prt_fild08d,0,0	monster	Lunatic	1063,110,5000
-prt_fild08d,0,0	monster	Fabre	1007,88,5000
-prt_fild08d,0,0	monster	Little Poring	2398,33,50000
-prt_fild08d,0,0	monster	Pupa	1008,66,5000
-
+prt_fild08,0,0	monster	Poring	1002,20,5000
+prt_fild08,0,0	monster	Lunatic	1063,20,5000
+prt_fild08,0,0	monster	Fabre	1007,10,5000
+prt_fild08,305,233,10,10	monster	Poring	1002,2,15000
+prt_fild08,305,233,10,10	monster	Lunatic	1063,2,15000
+prt_fild08,305,233,10,10	monster	Fabre	1007,2,15000
+prt_fild08,271,249,20,20	monster	Poring	1002,5,15000
+prt_fild08,271,249,20,20	monster	Lunatic	1063,5,15000
+prt_fild08,271,249,20,20	monster	Fabre	1007,5,15000
+prt_fild08,94,335,50,50	monster	Poring	1002,20,10000
+prt_fild08,166,334,50,50	monster	Poring	1002,20,10000
+prt_fild08,253,337,50,50	monster	Poring	1002,20,10000
+prt_fild08,228,230,30,30	monster	Lunatic	1063,10,10000
+prt_fild08,246,263,50,50	monster	Lunatic	1063,10,10000
+prt_fild08,190,237,50,50	monster	Lunatic	1063,10,10000
+prt_fild08,100,256,50,50	monster	Lunatic	1063,10,10000
+prt_fild08,70,164,70,70	monster	Fabre	1007,20,10000
+prt_fild08,144,147,70,70	monster	Fabre	1007,20,10000
+prt_fild08,263,79,90,90	monster	Fabre	1007,20,10000
+prt_fild08,336,113,40,40	monster	Pupa	1008,20,10000
+prt_fild08,330,269,40,40	monster	Little Poring	2398,20,10000
 
 
 //==================================================
 //==================================================
 // prt_fild09 - Prontera Field
 // prt_fild09 - Prontera Field

+ 2 - 0
src/map/battle.cpp

@@ -11497,6 +11497,8 @@ static const struct _battle_data {
 
 
 	{ "mob_respawn_time",                   &battle_config.mob_respawn_time,                1000,   1000,   INT_MAX,        },
 	{ "mob_respawn_time",                   &battle_config.mob_respawn_time,                1000,   1000,   INT_MAX,        },
 	{ "mob_unlock_time",                    &battle_config.mob_unlock_time,                 2000,   0,      INT_MAX,        },
 	{ "mob_unlock_time",                    &battle_config.mob_unlock_time,                 2000,   0,      INT_MAX,        },
+	{ "map_edge_size",                      &battle_config.map_edge_size,                   15,     1,      40,             },
+	{ "randomize_center_cell",              &battle_config.randomize_center_cell,           1,      0,      1,              },
 
 
 	{ "feature.stylist",                    &battle_config.feature_stylist,                 1,      0,      1,              },
 	{ "feature.stylist",                    &battle_config.feature_stylist,                 1,      0,      1,              },
 	{ "feature.banking_state_enforce",      &battle_config.feature_banking_state_enforce,   0,      0,      1,              },
 	{ "feature.banking_state_enforce",      &battle_config.feature_banking_state_enforce,   0,      0,      1,              },

+ 2 - 0
src/map/battle.hpp

@@ -749,6 +749,8 @@ struct Battle_Config
 
 
 	int mob_respawn_time;
 	int mob_respawn_time;
 	int mob_unlock_time;
 	int mob_unlock_time;
+	int map_edge_size;
+	int randomize_center_cell;
 
 
 	int feature_stylist;
 	int feature_stylist;
 	int feature_banking_state_enforce;
 	int feature_banking_state_enforce;

+ 19 - 16
src/map/map.cpp

@@ -1699,9 +1699,9 @@ static int map_count_sub(struct block_list *bl,va_list ap)
  * &2 = the target should be able to walk to the target tile.
  * &2 = the target should be able to walk to the target tile.
  * &4 = there shouldn't be any players around the target tile (use the no_spawn_on_player setting)
  * &4 = there shouldn't be any players around the target tile (use the no_spawn_on_player setting)
  *------------------------------------------*/
  *------------------------------------------*/
-int map_search_freecell(struct block_list *src, int16 m, int16 *x,int16 *y, int16 rx, int16 ry, int flag)
+int map_search_freecell(struct block_list *src, int16 m, int16 *x, int16 *y, int16 rx, int16 ry, int flag, int32 tries)
 {
 {
-	int tries, spawn=0;
+	int spawn=0;
 	int bx, by;
 	int bx, by;
 
 
 	if( !src && (!(flag&1) || flag&2) )
 	if( !src && (!(flag&1) || flag&2) )
@@ -1731,21 +1731,23 @@ int map_search_freecell(struct block_list *src, int16 m, int16 *x,int16 *y, int1
 		return 0;
 		return 0;
 	}
 	}
 
 
-	if (rx >= 0 && ry >= 0) {
-		tries = (rx * 2 + 1) * (ry * 2 + 1);
-		if (tries > 100) tries = 100;
-	} else {
-		tries = mapdata->xs*mapdata->ys;
-		if (tries > 500) tries = 500;
-	}
-
+	int16 edge = battle_config.map_edge_size;
+	int16 edge_valid = std::min(edge, (int16)5);
+	// In most situations there are 50 tries officially (default value)
 	while(tries--) {
 	while(tries--) {
-		*x = (rx >= 0) ? rnd_value(bx - rx, bx + rx) : rnd_value<int16>(1, mapdata->xs - 1);
-		*y = (ry >= 0) ? rnd_value(by - ry, by + ry) : rnd_value<int16>(1, mapdata->ys - 1);
+		// For map-wide search, the configured tiles from the edge are not considered (default: 15)
+		*x = (rx >= 0) ? rnd_value(bx - rx, bx + rx) : rnd_value<int16>(edge, mapdata->xs - edge - 1);
+		*y = (ry >= 0) ? rnd_value(by - ry, by + ry) : rnd_value<int16>(edge, mapdata->ys - edge - 1);
 
 
 		if (*x == bx && *y == by)
 		if (*x == bx && *y == by)
 			continue; //Avoid picking the same target tile.
 			continue; //Avoid picking the same target tile.
 
 
+		// Cells outside the map or within 4-5 cells of the map edge are considered invalid officially
+		// Note that unlike the other edge, this isn't symmetric (NE - 4 cells, SW - 5 cells)
+		// If for some reason edge size was set to below 5 cells, we consider them as valid
+		if (*x < edge_valid || *x > mapdata->xs - edge_valid || *y < edge_valid || *y > mapdata->ys - edge_valid)
+			continue;
+
 		if (map_getcell(m,*x,*y,CELL_CHKREACH))
 		if (map_getcell(m,*x,*y,CELL_CHKREACH))
 		{
 		{
 			if(flag&2 && !unit_can_reach_pos(src, *x, *y, 1))
 			if(flag&2 && !unit_can_reach_pos(src, *x, *y, 1))
@@ -1754,10 +1756,11 @@ int map_search_freecell(struct block_list *src, int16 m, int16 *x,int16 *y, int1
 				if (spawn >= 100) return 0; //Limit of retries reached.
 				if (spawn >= 100) return 0; //Limit of retries reached.
 				if (spawn++ < battle_config.no_spawn_on_player &&
 				if (spawn++ < battle_config.no_spawn_on_player &&
 					map_foreachinallarea(map_count_sub, m,
 					map_foreachinallarea(map_count_sub, m,
-						*x-AREA_SIZE, *y-AREA_SIZE,
-					  	*x+AREA_SIZE, *y+AREA_SIZE, BL_PC)
-				)
-				continue;
+						*x - AREA_SIZE, *y - AREA_SIZE,
+						*x + AREA_SIZE, *y + AREA_SIZE, BL_PC)) {
+					tries++; // This failure should not affect the number of official tries
+					continue;
+				}
 			}
 			}
 			return 1;
 			return 1;
 		}
 		}

+ 1 - 1
src/map/map.hpp

@@ -1124,7 +1124,7 @@ int map_count_oncell(int16 m,int16 x,int16 y,int type,int flag);
 struct skill_unit *map_find_skill_unit_oncell(struct block_list *,int16 x,int16 y,uint16 skill_id,struct skill_unit *, int flag);
 struct skill_unit *map_find_skill_unit_oncell(struct block_list *,int16 x,int16 y,uint16 skill_id,struct skill_unit *, int flag);
 // search and creation
 // search and creation
 int map_get_new_object_id(void);
 int map_get_new_object_id(void);
-int map_search_freecell(struct block_list *src, int16 m, int16 *x, int16 *y, int16 rx, int16 ry, int flag);
+int map_search_freecell(struct block_list *src, int16 m, int16 *x, int16 *y, int16 rx, int16 ry, int flag, int32 tries = 50);
 bool map_closest_freecell(int16 m, int16 *x, int16 *y, int type, int flag);
 bool map_closest_freecell(int16 m, int16 *x, int16 *y, int type, int flag);
 //
 //
 int map_quit(map_session_data *);
 int map_quit(map_session_data *);

+ 37 - 14
src/map/mob.cpp

@@ -474,6 +474,8 @@ struct mob_data* mob_spawn_dataset(struct spawn_data *data)
 	md->spawn_timer = INVALID_TIMER;
 	md->spawn_timer = INVALID_TIMER;
 	md->deletetimer = INVALID_TIMER;
 	md->deletetimer = INVALID_TIMER;
 	md->skill_idx = -1;
 	md->skill_idx = -1;
+	md->centerX = data->x;
+	md->centerY = data->y;
 	status_set_viewdata(&md->bl, md->mob_id);
 	status_set_viewdata(&md->bl, md->mob_id);
 	status_change_init(&md->bl);
 	status_change_init(&md->bl);
 	unit_dataset(&md->bl);
 	unit_dataset(&md->bl);
@@ -1084,11 +1086,12 @@ int mob_setdelayspawn(struct mob_data *md)
 int mob_count_sub(struct block_list *bl, va_list ap) {
 int mob_count_sub(struct block_list *bl, va_list ap) {
     int mobid[10], i;
     int mobid[10], i;
     ARR_FIND(0, 10, i, (mobid[i] = va_arg(ap, int)) == 0); //fetch till 0
     ARR_FIND(0, 10, i, (mobid[i] = va_arg(ap, int)) == 0); //fetch till 0
-    if (mobid[0]) { //if there one let's check it otherwise go backward
-        TBL_MOB *md = BL_CAST(BL_MOB, bl);
+	mob_data* md = BL_CAST(BL_MOB, bl);
+	if (md && mobid[0]) { //if there one let's check it otherwise go backward
         ARR_FIND(0, 10, i, md->mob_id == mobid[i]);
         ARR_FIND(0, 10, i, md->mob_id == mobid[i]);
         return (i < 10) ? 1 : 0;
         return (i < 10) ? 1 : 0;
     }
     }
+	// If not counting monsters, count all
     return 1; //backward compatibility
     return 1; //backward compatibility
 }
 }
 
 
@@ -1116,20 +1119,33 @@ int mob_spawn (struct mob_data *md)
 
 
 	if (md->spawn) { //Respawn data
 	if (md->spawn) { //Respawn data
 		md->bl.m = md->spawn->m;
 		md->bl.m = md->spawn->m;
-		md->bl.x = md->spawn->x;
-		md->bl.y = md->spawn->y;
-
-		if( (md->bl.x == 0 && md->bl.y == 0) || md->spawn->xs || md->spawn->ys )
-		{	//Monster can be spawned on an area.
-			if( !map_search_freecell(&md->bl, -1, &md->bl.x, &md->bl.y, md->spawn->xs, md->spawn->ys, battle_config.no_spawn_on_player?4:0) )
-			{ // retry again later
-				if( md->spawn_timer != INVALID_TIMER )
-					delete_timer(md->spawn_timer, mob_delayspawn);
-				md->spawn_timer = add_timer(tick + battle_config.mob_respawn_time,mob_delayspawn,md->bl.id,0);
-				return 1;
+		md->bl.x = md->centerX;
+		md->bl.y = md->centerY;
+
+		// Search can be skipped for boss monster spawns if spawn location is fixed
+		// We can't skip normal monsters as they should pick a random location if the cell is blocked (e.g. Icewall)
+		// The center cell has a 1/(xs*ys) chance to be picked if free
+		if ((!md->spawn->state.boss || (md->bl.x == 0 && md->bl.y == 0) || md->spawn->xs != 1 || md->spawn->ys != 1)
+			&& (md->spawn->xs + md->spawn->ys < 1 || !rnd_chance(1, md->spawn->xs * md->spawn->ys) || !map_getcell(md->bl.m, md->bl.x, md->bl.y, CELL_CHKREACH)))
+		{
+			// Officially the area is split into 4 squares, 4 lines and 1 dot and for each of those there is one attempt
+			// We simplify this to trying 8 times in the whole area and then at the center cell even though that's not fully accurate
+
+			// Try to spawn monster in defined area (8 tries)
+			if (!map_search_freecell(&md->bl, -1, &md->bl.x, &md->bl.y, md->spawn->xs-1, md->spawn->ys-1, battle_config.no_spawn_on_player?4:0, 8))
+			{
+				// If area search failed and center cell not reachable, try to spawn the monster anywhere on the map (50 tries)
+				if (!map_getcell(md->bl.m, md->bl.x, md->bl.y, CELL_CHKREACH) && !map_search_freecell(&md->bl, -1, &md->bl.x, &md->bl.y, -1, -1, battle_config.no_spawn_on_player?4:0))
+				{
+					// Retry again later
+					if (md->spawn_timer != INVALID_TIMER)
+						delete_timer(md->spawn_timer, mob_delayspawn);
+					md->spawn_timer = add_timer(tick + battle_config.mob_respawn_time, mob_delayspawn, md->bl.id, 0);
+					return 1;
+				}
 			}
 			}
 		}
 		}
-		else if( battle_config.no_spawn_on_player > 99 && map_foreachinallrange(mob_count_sub, &md->bl, AREA_SIZE, BL_PC) )
+		if( battle_config.no_spawn_on_player > 99 && map_foreachinallrange(mob_count_sub, &md->bl, AREA_SIZE, BL_PC) )
 		{ // retry again later (players on sight)
 		{ // retry again later (players on sight)
 			if( md->spawn_timer != INVALID_TIMER )
 			if( md->spawn_timer != INVALID_TIMER )
 				delete_timer(md->spawn_timer, mob_delayspawn);
 				delete_timer(md->spawn_timer, mob_delayspawn);
@@ -2091,6 +2107,13 @@ static int mob_ai_sub_lazy(struct mob_data *md, va_list args)
 	md->last_thinktime=tick;
 	md->last_thinktime=tick;
 
 
 	if (md->master_id) {
 	if (md->master_id) {
+		if (!mob_is_spotted(md)) {
+			// Get mob data of master
+			mob_data* mmd = map_id2md(md->master_id);
+			// If neither master nor slave have been spotted we don't have to execute the slave AI
+			if (mmd && !mob_is_spotted(mmd))
+				return 0;
+		}
 		mob_ai_sub_hard_slavemob (md,tick);
 		mob_ai_sub_hard_slavemob (md,tick);
 		return 0;
 		return 0;
 	}
 	}

+ 1 - 0
src/map/mob.hpp

@@ -354,6 +354,7 @@ struct mob_data {
 	uint32 spotted_log[DAMAGELOG_SIZE];
 	uint32 spotted_log[DAMAGELOG_SIZE];
 	struct spawn_data *spawn; //Spawn data.
 	struct spawn_data *spawn; //Spawn data.
 	int spawn_timer; //Required for Convex Mirror
 	int spawn_timer; //Required for Convex Mirror
+	int16 centerX, centerY; // Spawn center of this individual monster
 	struct s_mob_lootitem *lootitems;
 	struct s_mob_lootitem *lootitems;
 	short mob_id;
 	short mob_id;
 	unsigned int tdmg; //Stores total damage given to the mob, for exp calculations. [Skotlex]
 	unsigned int tdmg; //Stores total damage given to the mob, for exp calculations. [Skotlex]

+ 24 - 10
src/map/npc.cpp

@@ -5180,6 +5180,13 @@ void npc_parse_mob2(struct spawn_data* mob)
 	{
 	{
 		struct mob_data* md = mob_spawn_dataset(mob);
 		struct mob_data* md = mob_spawn_dataset(mob);
 		md->spawn = mob;
 		md->spawn = mob;
+		// Determine center cell for each mob in the spawn line
+		if (battle_config.randomize_center_cell) {
+			if (mob->xs > 1)
+				md->centerX = rnd_value(mob->x - mob->xs + 1, mob->x + mob->xs - 1);
+			if (mob->ys > 1)
+				md->centerY = rnd_value(mob->y - mob->ys + 1, mob->y + mob->ys - 1);
+		}
 		md->spawn->active++;
 		md->spawn->active++;
 		mob_spawn(md);
 		mob_spawn(md);
 	}
 	}
@@ -5188,7 +5195,7 @@ void npc_parse_mob2(struct spawn_data* mob)
 static const char* npc_parse_mob(char* w1, char* w2, char* w3, char* w4, const char* start, const char* buffer, const char* filepath)
 static const char* npc_parse_mob(char* w1, char* w2, char* w3, char* w4, const char* start, const char* buffer, const char* filepath)
 {
 {
 	int num, mob_id, mob_lv = -1, delay = 5000, size = -1, w1count, w4count;
 	int num, mob_id, mob_lv = -1, delay = 5000, size = -1, w1count, w4count;
-	short m, x = 0, y = 0, xs = -1, ys = -1;
+	short m, x = 0, y = 0, xs = 0, ys = 0;
 	char mapname[MAP_NAME_LENGTH_EXT], mobname[NAME_LENGTH], sprite[NAME_LENGTH];
 	char mapname[MAP_NAME_LENGTH_EXT], mobname[NAME_LENGTH], sprite[NAME_LENGTH];
 	struct spawn_data mob, *data;
 	struct spawn_data mob, *data;
 	int ai = AI_NONE; // mob_ai
 	int ai = AI_NONE; // mob_ai
@@ -5197,7 +5204,7 @@ static const char* npc_parse_mob(char* w1, char* w2, char* w3, char* w4, const c
 
 
 	mob.state.boss = !strcmpi(w2,"boss_monster");
 	mob.state.boss = !strcmpi(w2,"boss_monster");
 
 
-	// w1=<map name>{,<x>,<y>,<xs>{,<ys>}}
+	// w1=<map name>{,<x>,<y>{,<xs>,<ys>}}
 	// w3=<mob name>{,<mob level>}
 	// w3=<mob name>{,<mob level>}
 	// w4=<mob id>,<amount>{,<delay1>{,<delay2>{,<event>{,<mob size>{,<mob ai>}}}}}
 	// w4=<mob id>,<amount>{,<delay1>{,<delay2>{,<event>{,<mob size>{,<mob ai>}}}}}
 	if( ( w1count = sscanf(w1, "%15[^,],%6hd,%6hd,%6hd,%6hd", mapname, &x, &y, &xs, &ys) ) < 1
 	if( ( w1count = sscanf(w1, "%15[^,],%6hd,%6hd,%6hd,%6hd", mapname, &x, &y, &xs, &ys) ) < 1
@@ -5289,28 +5296,35 @@ static const char* npc_parse_mob(char* w1, char* w2, char* w3, char* w4, const c
 		mob.state.ai = static_cast<enum mob_ai>(ai);
 		mob.state.ai = static_cast<enum mob_ai>(ai);
 
 
 	if (mob.xs < 0) {
 	if (mob.xs < 0) {
-		if (w1count > 3) {
-			ShowWarning("npc_parse_mob: Negative x-span %hd for mob ID %d (file '%s', line '%d').\n", mob.xs, mob_id, filepath, strline(buffer, start - buffer));
-		}
+		ShowWarning("npc_parse_mob: Negative x-span %hd for mob ID %d (file '%s', line '%d'). Defaulting to map-wide.\n", mob.xs, mob_id, filepath, strline(buffer, start - buffer));
 		mob.xs = 0;
 		mob.xs = 0;
 	}
 	}
+	else if (mob.xs == 0 && mob.x > 0) {
+		// Fixed X coordinate
+		// Need to set this to 1 as we reduce it by 1 when calling the search function
+		mob.xs = 1;
+	}
 
 
 	if (mob.ys < 0) {
 	if (mob.ys < 0) {
-		if (w1count > 4) {
-			ShowWarning("npc_parse_mob: Negative y-span %hd for mob ID %d (file '%s', line '%d').\n", mob.ys, mob_id, filepath, strline(buffer, start - buffer));
-		}
+		ShowWarning("npc_parse_mob: Negative y-span %hd for mob ID %d (file '%s', line '%d'). Defaulting to map-wide.\n", mob.ys, mob_id, filepath, strline(buffer, start - buffer));
 		mob.ys = 0;
 		mob.ys = 0;
 	}
 	}
+	else if (mob.ys == 0 && mob.y > 0) {
+		// Fixed Y coordinate
+		// Need to set this to 1 as we reduce it by 1 when calling the search function
+		mob.ys = 1;
+	}
 
 
 	if (mob.num > 1 && battle_config.mob_count_rate != 100) {
 	if (mob.num > 1 && battle_config.mob_count_rate != 100) {
 		if ((mob.num = mob.num * battle_config.mob_count_rate / 100) < 1)
 		if ((mob.num = mob.num * battle_config.mob_count_rate / 100) < 1)
 			mob.num = 1;
 			mob.num = 1;
 	}
 	}
 
 
-	if (battle_config.force_random_spawn || (mob.x == 0 && mob.y == 0))
+	if (battle_config.force_random_spawn || (mob.x == 0 && mob.y == 0)
+		|| (mob.xs == 1 && mob.ys == 1 && !map_getcell(mob.m, mob.x, mob.y, CELL_CHKREACH)))
 	{	//Force a random spawn anywhere on the map.
 	{	//Force a random spawn anywhere on the map.
 		mob.x = mob.y = 0;
 		mob.x = mob.y = 0;
-		mob.xs = mob.ys = -1;
+		mob.xs = mob.ys = 0;
 	}
 	}
 
 
 	// Check if monsters should have variance applied to their respawn time
 	// Check if monsters should have variance applied to their respawn time

+ 4 - 3
src/map/pc.cpp

@@ -7037,7 +7037,7 @@ enum e_setpos pc_setpos_savepoint( map_session_data& sd, clr_type clrtype ){
  *------------------------------------------*/
  *------------------------------------------*/
 char pc_randomwarp(map_session_data *sd, clr_type type, bool ignore_mapflag)
 char pc_randomwarp(map_session_data *sd, clr_type type, bool ignore_mapflag)
 {
 {
-	int x,y,i=0;
+	int16 x,y,i=0;
 
 
 	nullpo_ret(sd);
 	nullpo_ret(sd);
 
 
@@ -7046,9 +7046,10 @@ char pc_randomwarp(map_session_data *sd, clr_type type, bool ignore_mapflag)
 	if (mapdata->getMapFlag(MF_NOTELEPORT) && !ignore_mapflag) //Teleport forbidden
 	if (mapdata->getMapFlag(MF_NOTELEPORT) && !ignore_mapflag) //Teleport forbidden
 		return 3;
 		return 3;
 
 
+	int edge = battle_config.map_edge_size;
 	do {
 	do {
-		x = rnd()%(mapdata->xs-2)+1;
-		y = rnd()%(mapdata->ys-2)+1;
+		x = rnd_value<int16>(edge, mapdata->xs - edge - 1);
+		y = rnd_value<int16>(edge, mapdata->ys - edge - 1);
 	} while((map_getcell(sd->bl.m,x,y,CELL_CHKNOPASS) || (!battle_config.teleport_on_portal && npc_check_areanpc(1,sd->bl.m,x,y,1))) && (i++) < 1000);
 	} while((map_getcell(sd->bl.m,x,y,CELL_CHKNOPASS) || (!battle_config.teleport_on_portal && npc_check_areanpc(1,sd->bl.m,x,y,1))) && (i++) < 1000);
 
 
 	if (i < 1000)
 	if (i < 1000)