From 5d232db89e8b6050fbd00cab7b5d0e4477b3d56e Mon Sep 17 00:00:00 2001 From: Playtester <3785983+Playtester@users.noreply.github.com> Date: Sun, 19 May 2024 17:12:44 +0200 Subject: [PATCH] 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 --- conf/battle/misc.conf | 7 + conf/battle/monster.conf | 9 + doc/script_commands.txt | 25 +- npc/re/mobs/championmobs.txt | 641 ++++++++++++++++---------------- npc/re/mobs/fields/prontera.txt | 54 ++- src/map/battle.cpp | 2 + src/map/battle.hpp | 2 + src/map/map.cpp | 35 +- src/map/map.hpp | 2 +- src/map/mob.cpp | 49 ++- src/map/mob.hpp | 1 + src/map/npc.cpp | 34 +- src/map/pc.cpp | 7 +- 13 files changed, 472 insertions(+), 396 deletions(-) diff --git a/conf/battle/misc.conf b/conf/battle/misc.conf index 5850705ef9..a16a496f5a 100644 --- a/conf/battle/misc.conf +++ b/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) 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 diff --git a/conf/battle/monster.conf b/conf/battle/monster.conf index 64fcc69118..142793de96 100644 --- a/conf/battle/monster.conf +++ b/conf/battle/monster.conf @@ -163,6 +163,15 @@ no_spawn_on_player: 0 // map regardless of what the mob-spawn file says. 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? // 0: No, retain original mode. // 1: Slaves are always aggressive. diff --git a/doc/script_commands.txt b/doc/script_commands.txt index 1b0a1c9602..95973a8971 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -1,4 +1,4 @@ -//===== rAthena Documentation================================ +//===== rAthena Documentation================================ //= rAthena Script Commands //===== By:================================================== //= rAthena Dev Team @@ -135,11 +135,26 @@ and 'doc/mapflags.txt'. {,{,{,{,}}}}%TAB%monster%TAB%{,}%TAB%,{,{,{,{,{,}}}}} 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 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 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 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 diff --git a/npc/re/mobs/championmobs.txt b/npc/re/mobs/championmobs.txt index 9ac9ab4391..8c7398f5bb 100644 --- a/npc/re/mobs/championmobs.txt +++ b/npc/re/mobs/championmobs.txt @@ -3,329 +3,334 @@ //===== By: ================================================== //= nanakiwurtz //===== Current Version: ===================================== -//= 1.1 +//= 1.2 //===== Compatible With: ===================================== //= rAthena Project //===== Additional Comments: ================================= //= 1.0 First version //= 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 -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 diff --git a/npc/re/mobs/fields/prontera.txt b/npc/re/mobs/fields/prontera.txt index 30edb70bfa..51744d8f0d 100644 --- a/npc/re/mobs/fields/prontera.txt +++ b/npc/re/mobs/fields/prontera.txt @@ -3,7 +3,7 @@ //===== By: ================================================== //= Athena (1.0) //===== Current Version: ===================================== -//= 1.7 +//= 1.8 //===== Additional Comments: ================================= //= 1.2 fixed some map name typos [Lupus] //= 1.3 Official kRO 10.1 spawns [Playtester] @@ -11,6 +11,7 @@ //= 1.5 Updated to Renewal spawns. //= 1.6 Added Prontera Field 8 duplicates. [Euphy] //= 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,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 diff --git a/src/map/battle.cpp b/src/map/battle.cpp index fd2ec1378d..ce5c6810ba 100644 --- a/src/map/battle.cpp +++ b/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_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.banking_state_enforce", &battle_config.feature_banking_state_enforce, 0, 0, 1, }, diff --git a/src/map/battle.hpp b/src/map/battle.hpp index dabf9264be..f6e2612a1b 100644 --- a/src/map/battle.hpp +++ b/src/map/battle.hpp @@ -749,6 +749,8 @@ struct Battle_Config int mob_respawn_time; int mob_unlock_time; + int map_edge_size; + int randomize_center_cell; int feature_stylist; int feature_banking_state_enforce; diff --git a/src/map/map.cpp b/src/map/map.cpp index 1779555674..2735df8ae2 100644 --- a/src/map/map.cpp +++ b/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. * &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; 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; } - 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--) { - *x = (rx >= 0) ? rnd_value(bx - rx, bx + rx) : rnd_value(1, mapdata->xs - 1); - *y = (ry >= 0) ? rnd_value(by - ry, by + ry) : rnd_value(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(edge, mapdata->xs - edge - 1); + *y = (ry >= 0) ? rnd_value(by - ry, by + ry) : rnd_value(edge, mapdata->ys - edge - 1); if (*x == bx && *y == by) 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(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++ < battle_config.no_spawn_on_player && 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; } diff --git a/src/map/map.hpp b/src/map/map.hpp index ba39d91c27..8f972e3146 100644 --- a/src/map/map.hpp +++ b/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); // search and creation 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); // int map_quit(map_session_data *); diff --git a/src/map/mob.cpp b/src/map/mob.cpp index 8ce56568fe..8d10688bb5 100644 --- a/src/map/mob.cpp +++ b/src/map/mob.cpp @@ -474,6 +474,8 @@ struct mob_data* mob_spawn_dataset(struct spawn_data *data) md->spawn_timer = INVALID_TIMER; md->deletetimer = INVALID_TIMER; md->skill_idx = -1; + md->centerX = data->x; + md->centerY = data->y; status_set_viewdata(&md->bl, md->mob_id); status_change_init(&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 mobid[10], i; 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]); return (i < 10) ? 1 : 0; } + // If not counting monsters, count all return 1; //backward compatibility } @@ -1116,20 +1119,33 @@ int mob_spawn (struct mob_data *md) if (md->spawn) { //Respawn data md->bl.m = md->spawn->m; - md->bl.x = md->spawn->x; - md->bl.y = md->spawn->y; + md->bl.x = md->centerX; + md->bl.y = md->centerY; - 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; + // 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) if( md->spawn_timer != INVALID_TIMER ) 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; 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); return 0; } diff --git a/src/map/mob.hpp b/src/map/mob.hpp index 0f2150edd8..93923a775b 100644 --- a/src/map/mob.hpp +++ b/src/map/mob.hpp @@ -354,6 +354,7 @@ struct mob_data { uint32 spotted_log[DAMAGELOG_SIZE]; struct spawn_data *spawn; //Spawn data. int spawn_timer; //Required for Convex Mirror + int16 centerX, centerY; // Spawn center of this individual monster struct s_mob_lootitem *lootitems; short mob_id; unsigned int tdmg; //Stores total damage given to the mob, for exp calculations. [Skotlex] diff --git a/src/map/npc.cpp b/src/map/npc.cpp index 7e2d824864..2c1c885da0 100644 --- a/src/map/npc.cpp +++ b/src/map/npc.cpp @@ -5180,6 +5180,13 @@ void npc_parse_mob2(struct spawn_data* mob) { struct mob_data* md = mob_spawn_dataset(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++; 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) { 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]; struct spawn_data mob, *data; 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"); - // w1={,,,{,}} + // w1={,,{,,}} // w3={,} // w4=,{,{,{,{,{,}}}}} 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(ai); 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; } + 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 (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; } + 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 = mob.num * battle_config.mob_count_rate / 100) < 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. 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 diff --git a/src/map/pc.cpp b/src/map/pc.cpp index d6cd38b1f9..b72ae30276 100755 --- a/src/map/pc.cpp +++ b/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) { - int x,y,i=0; + int16 x,y,i=0; 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 return 3; + int edge = battle_config.map_edge_size; do { - x = rnd()%(mapdata->xs-2)+1; - y = rnd()%(mapdata->ys-2)+1; + x = rnd_value(edge, mapdata->xs - edge - 1); + y = rnd_value(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); if (i < 1000)