Browse Source

- 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

skotlex 18 năm trước cách đây
mục cha
commit
12242c1bdc

+ 8 - 0
Changelog-Trunk.txt

@@ -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.
 
 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
 	  have to die twice before being warped out.
 	* If jobchanging while disguised, the disguise will be removed, since it

+ 9 - 0
conf-tmpl/Changelog.txt

@@ -1,5 +1,14 @@
 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
 	* Added monster_ai&0x400 to use the previous 'smart' criteria that prevents
 	  mobs from fighting each another, since now they are all natural enemies

+ 1 - 1
conf-tmpl/battle/drops.conf

@@ -30,7 +30,7 @@
 // If an item is dropped, does it go stright into the users inventory? (Note 1)
 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
 
 // Grace time during which only the person who did the most damage to a monster can get the item? (in milliseconds) (Note 3)

+ 3 - 5
conf-tmpl/battle/monster.conf

@@ -19,6 +19,8 @@
 //Note 2: All rates are in percents, 100 would mean 100%, 200
 //   would mean 200%, etc
 //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:
 // All options are limited to a max of 60K (aprox) which is 600%
 // or 60secs as appropiate.
@@ -36,8 +38,7 @@ monster_hp_rate: 100
 // The maximum attack speed of a monster
 monster_max_aspd: 199
 
-// Defines various mob AI related settings. The mask bits are 
-// (add to include multiple settings):
+// Defines various mob AI related settings. [Note 4]
 // 0x001: When enabled mobs will update their target cell every few iterations
 //        (normally they never update their target cell until they reach it while
 //        chasing)
@@ -59,9 +60,6 @@ monster_max_aspd: 199
 //        of players.
 // 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)
-// 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
 //        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)

+ 15 - 0
conf-tmpl/battle/pet.conf

@@ -19,6 +19,8 @@
 //Note 2: All rates are in percents, 100 would mean 100%, 200
 //   would mean 200%, etc
 //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:
 // All options are limited to a max of 60K (aprox) which is 600%
 // or 60secs as appropiate.
@@ -27,6 +29,19 @@
 // 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)
 pet_catch_rate: 100
 

+ 4 - 2
src/map/battle.c

@@ -3284,7 +3284,7 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f
 				return 0;
 
 			//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;
 
 			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 },
 	{ "random_monster_checklv",            &battle_config.random_monster_checklv	},
 	{ "attribute_recover",                 &battle_config.attr_recover				},
-	{ "flooritem_lifetime",                &battle_config.flooritem_lifetime		},
 	{ "item_auto_get",                     &battle_config.item_auto_get			},
 	{ "drop_rate0item",                    &battle_config.drop_rate0item			},
 	{ "pvp_exp",                           &battle_config.pvp_exp		},
@@ -3761,6 +3760,7 @@ static const struct battle_data_short {
 
 	{ "debuff_on_logout",                  &battle_config.debuff_on_logout},
 	{ "monster_ai",                        &battle_config.mob_ai},
+	{ "monster_ai",                        &battle_config.hom_setting},
 	{ "dynamic_mobs",                      &battle_config.dynamic_mobs},
 	{ "mob_remove_damaged",                &battle_config.mob_remove_damaged},
 	{ "show_hp_sp_drain",                  &battle_config.show_hp_sp_drain}, // [Skotlex]
@@ -3813,6 +3813,7 @@ static const struct battle_data_int {
 	const char *str;
 	int *val;
 } 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_second_get_time",              &battle_config.item_second_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.use_statpoint_table = 1;
 	battle_config.mob_ai = 0;
+	battle_config.hom_setting = 0xFFFF;
 	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_delay = 60000;

+ 2 - 1
src/map/battle.h

@@ -109,8 +109,8 @@ extern struct Battle_Config {
 	unsigned short clear_unit_onwarp; //[Skotlex]
 	unsigned short random_monster_checklv;
 	unsigned short attr_recover;
-	unsigned short flooritem_lifetime;
 	unsigned short item_auto_get;
+	int flooritem_lifetime;
 	int item_first_get_time;
 	int item_second_get_time;
 	int item_third_get_time;
@@ -383,6 +383,7 @@ extern struct Battle_Config {
 	unsigned short berserk_cancels_buffs; // [Aru]
 	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 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 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]

+ 5 - 2
src/map/clif.c

@@ -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,37)=cap_value(status->matk_max, 0, SHRT_MAX);
 	WBUFW(buf,39)=status->hit;
-	WBUFW(buf,41)=status->luk/3 + 1;	//crit is a +1 decimal value! Just display purpose.[Vicious]
+	if (battle_config.hom_setting&0x10)
+		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,45)=status->mdef;
 	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_homskillinfoblock(sd);
 		//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);
 //		Since hom is inmune to land effects, unneeded.
 //		skill_unit_move(&sd->hd->bl,gettick(),1);

+ 2 - 1
src/map/mob.c

@@ -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))
 			return 0; //Gangster paradise protection.
 	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.
 
 		dist = distance_bl(&md->bl, bl);

+ 5 - 4
src/map/status.c

@@ -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)
 		//Placed here instead of battle_check_target because support skill
 		//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)
 			return 0;
 	default:
@@ -2356,7 +2357,7 @@ int status_calc_homunculus(struct homun_data *hd, int first)
 		status->rhw.range = 1 + status->size;
 		status->mode = MD_CANMOVE|MD_CANATTACK;
 		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.
 			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)
 		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;
 
-	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);
 
 	if(flag&(SCB_ASPD|SCB_AGI|SCB_DEX)) {