浏览代码

Bug Fixes:
- Fixed map-server crashed caused by Wall of Thorn when atatcked by Fire element (with wide range skill unit, bugreport9102). Also reverted some changes in c046668
- Added config conf/battle/skill.conf 'arrow_shower_knockback', as follow up 453b6d0. Direction of Arrow Shower knockback depends on Arrow Shower location

Signed-off-by: Cydh Ramdh <house.bad@gmail.com>

Cydh Ramdh 10 年之前
父节点
当前提交
70b8b8bc38
共有 9 个文件被更改,包括 286 次插入249 次删除
  1. 3 0
      conf/battle/skill.conf
  2. 2 2
      db/pre-re/skill_unit_db.txt
  3. 2 2
      db/re/skill_unit_db.txt
  4. 5 4
      src/map/battle.c
  5. 2 1
      src/map/battle.h
  6. 266 235
      src/map/skill.c
  7. 4 3
      src/map/skill.h
  8. 1 1
      src/map/status.c
  9. 1 1
      src/map/unit.c

+ 3 - 0
conf/battle/skill.conf

@@ -306,3 +306,6 @@ teleport_on_portal: no
 // Is the knockback direction for Cart Revolution always West? (Note 1)
 // On official servers it will knock the target always to the West. If disabled it will knock the target backwards.
 cart_revo_knockback: yes
+
+// On official servers, Arrow Shower blow direction always rely on skill placed location to target instead of caster to target
+arrow_shower_knockback: yes

+ 2 - 2
db/pre-re/skill_unit_db.txt

@@ -1,7 +1,7 @@
 // Skill Unit Database
 //
 // Structure of Database:
-// ID,unit ID,unit ID 2,layout,range,interval,target,flag
+// Skill ID,Unit ID,Unit ID 2,Layout,Range,Interval,Target,Flag
 //
 // layout = -1:special, 0:1*1, 1:3*3, 2:5*5, up to 5:11*11
 // target = friend (party +guildmates +neutral players) / party / guild
@@ -151,7 +151,7 @@
 2468,0xf4,    ,  0, 1,1000,all,   0x010	//SO_EARTH_INSIGNIA
 
 2479,0xe5,    ,  0, 1,1000,enemy, 0xC006	//GN_THORNS_TRAP
-2482,0xe6,0x7f,  0, 1, 100,all,   0xD000	//GN_WALLOFTHORN
+2482,0xe6,0x7f, -1, 1, 300,enemy, 0xD000	//GN_WALLOFTHORN
 2484,0x86,    ,  0, 1, 100,enemy, 0x080	//GN_CRAZYWEED_ATK
 2485,0xe7,    ,  0, 2,2000,enemy, 0x8098	//GN_DEMONIC_FIRE
 2487,0xe8,    ,  2, 0,  -1,enemy, 0x2000	//GN_FIRE_EXPANSION_SMOKE_POWDER

+ 2 - 2
db/re/skill_unit_db.txt

@@ -1,7 +1,7 @@
 // Skill Unit Database
 //
 // Structure of Database:
-// ID,unit ID,unit ID 2,layout,range,interval,target,flag
+// Skill ID,Unit ID,Unit ID 2,Layout,Range,Interval,Target,Flag
 //
 // layout = -1:special, 0:1*1, 1:3*3, 2:5*5, up to 5:11*11
 // target = friend (party +guildmates +neutral players) / party / guild
@@ -153,7 +153,7 @@
 2468,0xf4,    ,  0, 1,1000,all,   0x010	//SO_EARTH_INSIGNIA
 
 2479,0xe5,    ,  0, 1,1000,enemy, 0xC006	//GN_THORNS_TRAP
-2482,0xe6,0x7f,  0, 1, 100,all,   0xD000	//GN_WALLOFTHORN
+2482,0xe6,0x7f, -1, 1, 300,enemy, 0xD000	//GN_WALLOFTHORN
 2484,0x86,    ,  0, 1, 100,enemy, 0x080	//GN_CRAZYWEED_ATK
 2485,0xe7,    ,  0, 2,2000,enemy, 0x8098	//GN_DEMONIC_FIRE
 2487,0xe8,    ,  2, 0,  -1,enemy, 0x2000	//GN_FIRE_EXPANSION_SMOKE_POWDER

+ 5 - 4
src/map/battle.c

@@ -6277,14 +6277,14 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
  *	Initial refactoring by Baalberith
  *	Refined and optimized by helvetica
  */
-struct Damage battle_calc_attack(int attack_type,struct block_list *bl,struct block_list *target,uint16 skill_id,uint16 skill_lv,int count)
+struct Damage battle_calc_attack(int attack_type,struct block_list *bl,struct block_list *target,uint16 skill_id,uint16 skill_lv,int flag)
 {
 	struct Damage d;
 
 	switch(attack_type) {
-		case BF_WEAPON: d = battle_calc_weapon_attack(bl,target,skill_id,skill_lv,count); break;
-		case BF_MAGIC:  d = battle_calc_magic_attack(bl,target,skill_id,skill_lv,count);  break;
-		case BF_MISC:   d = battle_calc_misc_attack(bl,target,skill_id,skill_lv,count);   break;
+		case BF_WEAPON: d = battle_calc_weapon_attack(bl,target,skill_id,skill_lv,flag); break;
+		case BF_MAGIC:  d = battle_calc_magic_attack(bl,target,skill_id,skill_lv,flag);  break;
+		case BF_MISC:   d = battle_calc_misc_attack(bl,target,skill_id,skill_lv,flag);   break;
 		default:
 			ShowError("battle_calc_attack: unknown attack type! %d (skill_id=%d, skill_lv=%d)\n", attack_type, skill_id, skill_lv);
 			memset(&d,0,sizeof(d));
@@ -7798,6 +7798,7 @@ static const struct _battle_data {
 	{ "at_monsterignore",                   &battle_config.autotrade_monsterignore,         0,      0,      1,              },
 	{ "idletime_option",                    &battle_config.idletime_option,                 0x25,   1,      INT_MAX,        },
 	{ "spawn_direction",                    &battle_config.spawn_direction,                 0,      0,      1,              },
+	{ "arrow_shower_knockback",             &battle_config.arrow_shower_knockback,          1,      0,      1,              },
 };
 #ifndef STATS_OPT_OUT
 /**

+ 2 - 1
src/map/battle.h

@@ -79,7 +79,7 @@ struct block_list;
 
 // Damage Calculation
 
-struct Damage battle_calc_attack(int attack_type,struct block_list *bl,struct block_list *target,uint16 skill_id,uint16 skill_lv,int count);
+struct Damage battle_calc_attack(int attack_type,struct block_list *bl,struct block_list *target,uint16 skill_id,uint16 skill_lv,int flag);
 
 int64 battle_calc_return_damage(struct block_list *bl, struct block_list *src, int64 *, int flag, uint16 skill_id, bool status_reflect);
 
@@ -567,6 +567,7 @@ extern struct Battle_Config
 	int autotrade_monsterignore;
 	int idletime_option;
 	int spawn_direction;
+	int arrow_shower_knockback;
 } battle_config;
 
 void do_init_battle(void);

文件差异内容过多而无法显示
+ 266 - 235
src/map/skill.c


+ 4 - 3
src/map/skill.h

@@ -184,7 +184,8 @@ struct s_skill_db {
 };
 extern struct s_skill_db skill_db[MAX_SKILL_DB];
 
-#define MAX_SKILL_UNIT_LAYOUT	55
+#define MAX_SKILL_UNIT_LAYOUT	52
+#define MAX_SKILL_UNIT_LAYOUT2	17
 #define MAX_SQUARE_LAYOUT		5	// 11*11 Placement of a maximum unit
 #define MAX_SKILL_UNIT_COUNT ((MAX_SQUARE_LAYOUT*2+1)*(MAX_SQUARE_LAYOUT*2+1))
 struct s_skill_unit_layout {
@@ -388,7 +389,7 @@ int skill_delunitgroup_(struct skill_unit_group *group, const char* file, int li
 void skill_clear_unitgroup(struct block_list *src);
 int skill_clear_group(struct block_list *bl, int flag);
 void ext_skill_unit_onplace(struct skill_unit *unit, struct block_list *bl, unsigned int tick);
-int64 skill_unit_ondamaged(struct skill_unit *unit,struct block_list *bl,int64 damage);
+int64 skill_unit_ondamaged(struct skill_unit *unit,int64 damage);
 
 int skill_castfix( struct block_list *bl, uint16 skill_id, uint16 skill_lv);
 int skill_castfix_sc( struct block_list *bl, int time);
@@ -410,7 +411,7 @@ int skill_check_pc_partner(struct map_session_data *sd, uint16 skill_id, uint16
 int skill_check_unit_cell(uint16 skill_id,int16 m,int16 x,int16 y,int unit_id);
 int skill_unit_out_all( struct block_list *bl,unsigned int tick,int range);
 int skill_unit_move(struct block_list *bl,unsigned int tick,int flag);
-int skill_unit_move_unit_group( struct skill_unit_group *group, int16 m,int16 dx,int16 dy);
+void skill_unit_move_unit_group( struct skill_unit_group *group, int16 m,int16 dx,int16 dy);
 
 struct skill_unit_group *skill_check_dancing( struct block_list *src );
 

+ 1 - 1
src/map/status.c

@@ -1352,7 +1352,7 @@ int status_damage(struct block_list *src,struct block_list *target,int64 dhp, in
 	}
 
 	if (target->type == BL_SKILL)
-		return (int)skill_unit_ondamaged((struct skill_unit *)target, src, hp);
+		return (int)skill_unit_ondamaged((struct skill_unit *)target, hp);
 
 	status = status_get_status_data(target);
 	if(!status || status == &dummy_status )

+ 1 - 1
src/map/unit.c

@@ -898,7 +898,7 @@ uint8 unit_getdir(struct block_list *bl)
  * @param dx: Destination cell X
  * @param dy: Destination cell Y
  * @param count: How many cells to push bl
- * @param flag: Whether or not to send position packet updates
+ * @param flag: &1 Whether or not to send position packet updates
  * @return count (can be modified due to map cell restrictions)
  */
 int unit_blown(struct block_list* bl, int dx, int dy, int count, int flag)

部分文件因为文件数量过多而无法显示