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>
This commit is contained in:
parent
402170c018
commit
70b8b8bc38
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
/**
|
||||
|
@ -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);
|
||||
|
519
src/map/skill.c
519
src/map/skill.c
File diff suppressed because it is too large
Load Diff
@ -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 );
|
||||
|
||||
|
@ -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 )
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user