- Added hom_setting to specify which homunculus 'quirks' are in effect. The default activates all of them, if you set them to 0 then homuncs will not be treated in any special matter, pretty much like standard mobs. if I missed any 'quirky' homunc behaviour from it, report it so it can be added to the list.

- Made flooritem_lifetime a int so you can specify much longer life times (the default of 60k was already very close to the max of 65k)
- Removed monster_ai 0x80 since it's now handled by hom_setting.


git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@9519 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
skotlex 2006-12-18 20:12:59 +00:00
parent 224e07c6cc
commit 12242c1bdc
10 changed files with 54 additions and 16 deletions

View File

@ -4,6 +4,14 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
2006/12/18 2006/12/18
* Added hom_setting to specify which homunculus 'quirks' are in effect. The
default activates all of them, if you set them to 0 then homuncs will not
be treated in any special matter, pretty much like standard mobs. if I
missed any 'quirky' homunc behaviour from it, report it so it can be added
to the list.
* Made flooritem_lifetime a int so you can specify much longer life times
(the default of 60k was already very close to the max of 65k)
* Removed monster_ai 0x80 since it's now handled by hom_setting.
* When walking into a Guild Dungeon your pvp_points will be set to 5 so you * When walking into a Guild Dungeon your pvp_points will be set to 5 so you
have to die twice before being warped out. have to die twice before being warped out.
* If jobchanging while disguised, the disguise will be removed, since it * If jobchanging while disguised, the disguise will be removed, since it

View File

@ -1,5 +1,14 @@
Date Added Date Added
2006/12/18
* Added hom_setting to specify which homunculus 'quirks' are in effect. The
default activates all of them, if you set them to 0 then homuncs will not
be treated in any special matter, pretty much like standard mobs. if I
missed any 'quirky' homunc behaviour from it, report it so it can be added
to the list (This setting was added to pet.conf).
* flooritem_lifetime now accepts a much higher max value (previously it was
65k when the default was 60k)
* Removed monster_ai 0x80 since it's now handled by hom_setting.
2006/12/12 2006/12/12
* Added monster_ai&0x400 to use the previous 'smart' criteria that prevents * Added monster_ai&0x400 to use the previous 'smart' criteria that prevents
mobs from fighting each another, since now they are all natural enemies mobs from fighting each another, since now they are all natural enemies

View File

@ -30,7 +30,7 @@
// If an item is dropped, does it go stright into the users inventory? (Note 1) // If an item is dropped, does it go stright into the users inventory? (Note 1)
item_auto_get: no item_auto_get: no
// How long does it take for an item to disappear from the floor after it is dropped? (in miliseconds) // How long does it take for an item to disappear from the floor after it is dropped? (in miliseconds) [Note 3]
flooritem_lifetime: 60000 flooritem_lifetime: 60000
// Grace time during which only the person who did the most damage to a monster can get the item? (in milliseconds) (Note 3) // Grace time during which only the person who did the most damage to a monster can get the item? (in milliseconds) (Note 3)

View File

@ -19,6 +19,8 @@
//Note 2: All rates are in percents, 100 would mean 100%, 200 //Note 2: All rates are in percents, 100 would mean 100%, 200
// would mean 200%, etc // would mean 200%, etc
//Note 3: Value is not limited to 60K (see below) //Note 3: Value is not limited to 60K (see below)
//Note 4: Use bitmask values to specify who is affected
// (1: Pc, 2: Mob, 4: Pet, 8: Homonculus)
// Other Information: // Other Information:
// All options are limited to a max of 60K (aprox) which is 600% // All options are limited to a max of 60K (aprox) which is 600%
// or 60secs as appropiate. // or 60secs as appropiate.
@ -36,8 +38,7 @@ monster_hp_rate: 100
// The maximum attack speed of a monster // The maximum attack speed of a monster
monster_max_aspd: 199 monster_max_aspd: 199
// Defines various mob AI related settings. The mask bits are // Defines various mob AI related settings. [Note 4]
// (add to include multiple settings):
// 0x001: When enabled mobs will update their target cell every few iterations // 0x001: When enabled mobs will update their target cell every few iterations
// (normally they never update their target cell until they reach it while // (normally they never update their target cell until they reach it while
// chasing) // chasing)
@ -59,9 +60,6 @@ monster_max_aspd: 199
// of players. // of players.
// 0x040: When set, when the mob's target changes map, the mob will walk towards // 0x040: When set, when the mob's target changes map, the mob will walk towards
// any npc-warps in it's sight of view (use with mob_npc_warp below) // any npc-warps in it's sight of view (use with mob_npc_warp below)
// 0x080: When set, aggressive mobs will give the same priority to Homuns and
// players and will go after the closest target instead of always picking
// the homunculus
// 0x100: When set, a mob will pick a random skill from it's list and start from // 0x100: When set, a mob will pick a random skill from it's list and start from
// that instead of checking skills in orders (when unset, if a mob has too // that instead of checking skills in orders (when unset, if a mob has too
// many skills, the ones near the end will rarely get selected) // many skills, the ones near the end will rarely get selected)

View File

@ -19,6 +19,8 @@
//Note 2: All rates are in percents, 100 would mean 100%, 200 //Note 2: All rates are in percents, 100 would mean 100%, 200
// would mean 200%, etc // would mean 200%, etc
//Note 3: Value is not limited to 60K (see below) //Note 3: Value is not limited to 60K (see below)
//Note 4: Use bitmask values to specify who is affected
// (1: Pc, 2: Mob, 4: Pet, 8: Homonculus)
// Other Information: // Other Information:
// All options are limited to a max of 60K (aprox) which is 600% // All options are limited to a max of 60K (aprox) which is 600%
// or 60secs as appropiate. // or 60secs as appropiate.
@ -27,6 +29,19 @@
// features. // features.
//-------------------------------------------------------------- //--------------------------------------------------------------
// Homunculus setting [Note 4]
// (placed here since homuncs are more or less like pet mobs)
// Activates various homunc-related 'quirks' that makes them behave unlike
// normal characters.
// 0x001: They can't be targetted by support skills (except for their master)
// 0x002: They are inmune to land skills.
// 0x004: Mobs will always go after them instead of players until attacked.
// 0x008: They copy their master's speed on spawn/map-change
// 0x010: They display luk/3+1 instead of their actual critical in the
// stat window (by default they don't crit)
// 0x020: Their Min-Matk is always the same as their max
hom_setting: 0xFFFF
// Rate for catching pets (Note 2) // Rate for catching pets (Note 2)
pet_catch_rate: 100 pet_catch_rate: 100

View File

@ -3284,7 +3284,7 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f
return 0; return 0;
//For some mysterious reason ground-skills can't target homun. //For some mysterious reason ground-skills can't target homun.
if (target->type == BL_HOM) if (target->type == BL_HOM && battle_config.hom_setting&0x2)
return 0; return 0;
if (su->group->src_id == target->id) if (su->group->src_id == target->id)
@ -3507,7 +3507,6 @@ static const struct battle_data_short {
{ "clear_skills_on_warp", &battle_config.clear_unit_onwarp }, { "clear_skills_on_warp", &battle_config.clear_unit_onwarp },
{ "random_monster_checklv", &battle_config.random_monster_checklv }, { "random_monster_checklv", &battle_config.random_monster_checklv },
{ "attribute_recover", &battle_config.attr_recover }, { "attribute_recover", &battle_config.attr_recover },
{ "flooritem_lifetime", &battle_config.flooritem_lifetime },
{ "item_auto_get", &battle_config.item_auto_get }, { "item_auto_get", &battle_config.item_auto_get },
{ "drop_rate0item", &battle_config.drop_rate0item }, { "drop_rate0item", &battle_config.drop_rate0item },
{ "pvp_exp", &battle_config.pvp_exp }, { "pvp_exp", &battle_config.pvp_exp },
@ -3761,6 +3760,7 @@ static const struct battle_data_short {
{ "debuff_on_logout", &battle_config.debuff_on_logout}, { "debuff_on_logout", &battle_config.debuff_on_logout},
{ "monster_ai", &battle_config.mob_ai}, { "monster_ai", &battle_config.mob_ai},
{ "monster_ai", &battle_config.hom_setting},
{ "dynamic_mobs", &battle_config.dynamic_mobs}, { "dynamic_mobs", &battle_config.dynamic_mobs},
{ "mob_remove_damaged", &battle_config.mob_remove_damaged}, { "mob_remove_damaged", &battle_config.mob_remove_damaged},
{ "show_hp_sp_drain", &battle_config.show_hp_sp_drain}, // [Skotlex] { "show_hp_sp_drain", &battle_config.show_hp_sp_drain}, // [Skotlex]
@ -3813,6 +3813,7 @@ static const struct battle_data_int {
const char *str; const char *str;
int *val; int *val;
} battle_data_int[] = { //List here battle_athena options which are type int! } battle_data_int[] = { //List here battle_athena options which are type int!
{ "flooritem_lifetime", &battle_config.flooritem_lifetime },
{ "item_first_get_time", &battle_config.item_first_get_time }, { "item_first_get_time", &battle_config.item_first_get_time },
{ "item_second_get_time", &battle_config.item_second_get_time }, { "item_second_get_time", &battle_config.item_second_get_time },
{ "item_third_get_time", &battle_config.item_third_get_time }, { "item_third_get_time", &battle_config.item_third_get_time },
@ -4196,6 +4197,7 @@ void battle_set_defaults() {
battle_config.debuff_on_logout = 1; battle_config.debuff_on_logout = 1;
battle_config.use_statpoint_table = 1; battle_config.use_statpoint_table = 1;
battle_config.mob_ai = 0; battle_config.mob_ai = 0;
battle_config.hom_setting = 0xFFFF;
battle_config.dynamic_mobs = 1; // use Dynamic Mobs [Wizputer] battle_config.dynamic_mobs = 1; // use Dynamic Mobs [Wizputer]
battle_config.mob_remove_damaged = 1; // Dynamic Mobs - Remove mobs even if damaged [Wizputer] battle_config.mob_remove_damaged = 1; // Dynamic Mobs - Remove mobs even if damaged [Wizputer]
battle_config.mob_remove_delay = 60000; battle_config.mob_remove_delay = 60000;

View File

@ -109,8 +109,8 @@ extern struct Battle_Config {
unsigned short clear_unit_onwarp; //[Skotlex] unsigned short clear_unit_onwarp; //[Skotlex]
unsigned short random_monster_checklv; unsigned short random_monster_checklv;
unsigned short attr_recover; unsigned short attr_recover;
unsigned short flooritem_lifetime;
unsigned short item_auto_get; unsigned short item_auto_get;
int flooritem_lifetime;
int item_first_get_time; int item_first_get_time;
int item_second_get_time; int item_second_get_time;
int item_third_get_time; int item_third_get_time;
@ -383,6 +383,7 @@ extern struct Battle_Config {
unsigned short berserk_cancels_buffs; // [Aru] unsigned short berserk_cancels_buffs; // [Aru]
unsigned short debuff_on_logout; // Removes a few "official" negative Scs on logout. [Skotlex] unsigned short debuff_on_logout; // Removes a few "official" negative Scs on logout. [Skotlex]
unsigned short mob_ai; //Configures various mob_ai settings to make them smarter or dumber(official). [Skotlex] unsigned short mob_ai; //Configures various mob_ai settings to make them smarter or dumber(official). [Skotlex]
unsigned short hom_setting; //Configures various homunc settings which make them behave unlike normaly characters.. [Skotlex]
unsigned short dynamic_mobs; // Dynamic Mobs [Wizputer] - battle_athena flag implemented by [random] unsigned short dynamic_mobs; // Dynamic Mobs [Wizputer] - battle_athena flag implemented by [random]
unsigned short mob_remove_damaged; // Dynamic Mobs - Remove mobs even if damaged [Wizputer] unsigned short mob_remove_damaged; // Dynamic Mobs - Remove mobs even if damaged [Wizputer]
int mob_remove_delay; // Dynamic Mobs - delay before removing mobs from a map [Skotlex] int mob_remove_delay; // Dynamic Mobs - delay before removing mobs from a map [Skotlex]

View File

@ -1428,7 +1428,10 @@ int clif_hominfo(struct map_session_data *sd, struct homun_data *hd, int flag)
WBUFW(buf,35)=cap_value(status->rhw.atk2+status->batk, 0, SHRT_MAX); WBUFW(buf,35)=cap_value(status->rhw.atk2+status->batk, 0, SHRT_MAX);
WBUFW(buf,37)=cap_value(status->matk_max, 0, SHRT_MAX); WBUFW(buf,37)=cap_value(status->matk_max, 0, SHRT_MAX);
WBUFW(buf,39)=status->hit; WBUFW(buf,39)=status->hit;
if (battle_config.hom_setting&0x10)
WBUFW(buf,41)=status->luk/3 + 1; //crit is a +1 decimal value! Just display purpose.[Vicious] WBUFW(buf,41)=status->luk/3 + 1; //crit is a +1 decimal value! Just display purpose.[Vicious]
else
WBUFW(buf,41)=status->cri/10;
WBUFW(buf,43)=status->def + status->vit ; WBUFW(buf,43)=status->def + status->vit ;
WBUFW(buf,45)=status->mdef; WBUFW(buf,45)=status->mdef;
WBUFW(buf,47)=status->flee; WBUFW(buf,47)=status->flee;
@ -8336,7 +8339,7 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
clif_send_homdata(sd,0,0); clif_send_homdata(sd,0,0);
clif_homskillinfoblock(sd); clif_homskillinfoblock(sd);
//Homunc mimic their master's speed on each map change. [Skotlex] //Homunc mimic their master's speed on each map change. [Skotlex]
if (battle_config.slaves_inherit_speed&1) if (battle_config.hom_setting&0x8)
status_calc_bl(&sd->hd->bl, SCB_SPEED); status_calc_bl(&sd->hd->bl, SCB_SPEED);
// Since hom is inmune to land effects, unneeded. // Since hom is inmune to land effects, unneeded.
// skill_unit_move(&sd->hd->bl,gettick(),1); // skill_unit_move(&sd->hd->bl,gettick(),1);

View File

@ -798,7 +798,8 @@ static int mob_ai_sub_hard_activesearch(struct block_list *bl,va_list ap)
!(status_get_mode(&md->bl)&MD_BOSS)) !(status_get_mode(&md->bl)&MD_BOSS))
return 0; //Gangster paradise protection. return 0; //Gangster paradise protection.
default: default:
if (!(battle_config.mob_ai&0x80) && (*target) && (*target)->type == BL_HOM && bl->type != BL_HOM) if (battle_config.hom_setting&0x4 &&
(*target) && (*target)->type == BL_HOM && bl->type != BL_HOM)
return 0; //For some reason Homun targets are never overriden. return 0; //For some reason Homun targets are never overriden.
dist = distance_bl(&md->bl, bl); dist = distance_bl(&md->bl, bl);

View File

@ -1101,7 +1101,8 @@ int status_check_skilluse(struct block_list *src, struct block_list *target, int
//Can't use support skills on homun (only master/self can) //Can't use support skills on homun (only master/self can)
//Placed here instead of battle_check_target because support skill //Placed here instead of battle_check_target because support skill
//invocations don't call that function. //invocations don't call that function.
if (skill_num && skill_get_inf(skill_num)&INF_SUPPORT_SKILL && if (skill_num && battle_config.hom_setting&0x1 &&
skill_get_inf(skill_num)&INF_SUPPORT_SKILL &&
battle_get_master(target) != src) battle_get_master(target) != src)
return 0; return 0;
default: default:
@ -2356,7 +2357,7 @@ int status_calc_homunculus(struct homun_data *hd, int first)
status->rhw.range = 1 + status->size; status->rhw.range = 1 + status->size;
status->mode = MD_CANMOVE|MD_CANATTACK; status->mode = MD_CANMOVE|MD_CANATTACK;
status->speed = DEFAULT_WALK_SPEED; status->speed = DEFAULT_WALK_SPEED;
if (battle_config.slaves_inherit_speed&1 && if (battle_config.hom_setting&0x8 &&
hd->master && hd->master->state.auth) //Master needs be authed to have valid speed. hd->master && hd->master->state.auth) //Master needs be authed to have valid speed.
status->speed = status_get_speed(&hd->master->bl); status->speed = status_get_speed(&hd->master->bl);
@ -2839,10 +2840,10 @@ void status_calc_bl_sub_hom(struct homun_data *hd, unsigned long flag) //[orn]
if(flag|SCB_WATK && status->rhw.atk2 < status->rhw.atk) if(flag|SCB_WATK && status->rhw.atk2 < status->rhw.atk)
status->rhw.atk2 = status->rhw.atk; status->rhw.atk2 = status->rhw.atk;
if(flag&SCB_MATK) //Hom Min Matk is always the same as Max Matk if(flag&SCB_MATK && battle_config.hom_setting&0x20) //Hom Min Matk is always the same as Max Matk
status->matk_min = status->matk_max; status->matk_min = status->matk_max;
if(flag&SCB_SPEED && battle_config.slaves_inherit_speed&1 && hd->master) if(flag&SCB_SPEED && battle_config.hom_setting&0x8 && hd->master)
status->speed = status_get_speed(&hd->master->bl); status->speed = status_get_speed(&hd->master->bl);
if(flag&(SCB_ASPD|SCB_AGI|SCB_DEX)) { if(flag&(SCB_ASPD|SCB_AGI|SCB_DEX)) {