git-svn-id: https://svn.code.sf.net/p/rathena/svn/athena@354 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
parent
d4cd760e3c
commit
636123d3cf
@ -2786,8 +2786,10 @@ static struct Damage battle_calc_pc_weapon_attack(
|
|||||||
struct mob_data *tmd=NULL;
|
struct mob_data *tmd=NULL;
|
||||||
int hitrate,flee,cri = 0,atkmin,atkmax;
|
int hitrate,flee,cri = 0,atkmin,atkmax;
|
||||||
int dex,luk,target_count = 1;
|
int dex,luk,target_count = 1;
|
||||||
|
int no_cardfix=0;
|
||||||
int def1 = battle_get_def(target);
|
int def1 = battle_get_def(target);
|
||||||
int def2 = battle_get_def2(target);
|
int def2 = battle_get_def2(target);
|
||||||
|
// int mdef1, mdef2;
|
||||||
int t_vit = battle_get_vit(target);
|
int t_vit = battle_get_vit(target);
|
||||||
struct Damage wd;
|
struct Damage wd;
|
||||||
int damage,damage2,damage3=0,damage4=0,type,div_,blewcount=skill_get_blewcount(skill_num,skill_lv);
|
int damage,damage2,damage3=0,damage4=0,type,div_,blewcount=skill_get_blewcount(skill_num,skill_lv);
|
||||||
@ -3307,6 +3309,9 @@ static struct Damage battle_calc_pc_weapon_attack(
|
|||||||
break;
|
break;
|
||||||
case CR_GRANDCROSS:
|
case CR_GRANDCROSS:
|
||||||
hitrate= 1000000;
|
hitrate= 1000000;
|
||||||
|
if(!battle_config.gx_cardfix)
|
||||||
|
|
||||||
|
no_cardfix = 1;
|
||||||
break;
|
break;
|
||||||
case AM_DEMONSTRATION: // デモンストレーション
|
case AM_DEMONSTRATION: // デモンストレーション
|
||||||
damage = damage*(100+ 20*skill_lv)/100;
|
damage = damage*(100+ 20*skill_lv)/100;
|
||||||
@ -3418,6 +3423,7 @@ static struct Damage battle_calc_pc_weapon_attack(
|
|||||||
case ASC_METEORASSAULT: /* メテオアサルト */
|
case ASC_METEORASSAULT: /* メテオアサルト */
|
||||||
damage = damage*(40+ 40*skill_lv)/100;
|
damage = damage*(40+ 40*skill_lv)/100;
|
||||||
damage2 = damage2*(40+ 40*skill_lv)/100;
|
damage2 = damage2*(40+ 40*skill_lv)/100;
|
||||||
|
no_cardfix = 1;
|
||||||
break;
|
break;
|
||||||
case SN_SHARPSHOOTING: /* シャープシューティング */
|
case SN_SHARPSHOOTING: /* シャープシューティング */
|
||||||
damage += damage*(30*skill_lv)/100;
|
damage += damage*(30*skill_lv)/100;
|
||||||
@ -3548,6 +3554,25 @@ static struct Damage battle_calc_pc_weapon_attack(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 状態異常中のダメージ追加でクリティカルにも有効なスキル
|
||||||
|
|
||||||
|
if (sc_data) {
|
||||||
|
|
||||||
|
// エンチャントデッドリーポイズン
|
||||||
|
|
||||||
|
if(sc_data[SC_EDP].timer != -1) {
|
||||||
|
|
||||||
|
damage += damage * (150 + sc_data[SC_EDP].val1 * 50) / 100;
|
||||||
|
|
||||||
|
damage2 += damage2 * (150 + sc_data[SC_EDP].val1 * 50) / 100;
|
||||||
|
|
||||||
|
no_cardfix = 1;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// 精錬ダメージの追加
|
// 精錬ダメージの追加
|
||||||
if( skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST) { //DEF, VIT無視
|
if( skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST) { //DEF, VIT無視
|
||||||
damage += battle_get_atk2(src);
|
damage += battle_get_atk2(src);
|
||||||
@ -3614,7 +3639,7 @@ static struct Damage battle_calc_pc_weapon_attack(
|
|||||||
//Advanced Katar Research by zanetheinsane
|
//Advanced Katar Research by zanetheinsane
|
||||||
if(sd->weapontype1 == 0x10 || sd->weapontype2 == 0x10){
|
if(sd->weapontype1 == 0x10 || sd->weapontype2 == 0x10){
|
||||||
if((skill = pc_checkskill(sd,ASC_KATAR)) > 0) {
|
if((skill = pc_checkskill(sd,ASC_KATAR)) > 0) {
|
||||||
damage += (damage*((skill*2)+10)) / 100 ;
|
damage += damage*(10+(skill * 2))/100;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3667,8 +3692,8 @@ static struct Damage battle_calc_pc_weapon_attack(
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(skill_num != CR_GRANDCROSS || !battle_config.gx_cardfix)
|
if(!no_cardfix)
|
||||||
damage=damage*cardfix/100; //カード補正によるダメージ増加
|
damage=damage*cardfix/100; //カード補正によるダメージ増加
|
||||||
//カードによるダメージ増加処理ここまで
|
//カードによるダメージ増加処理ここまで
|
||||||
|
|
||||||
//カードによるダメージ追加処理(左手)ここから
|
//カードによるダメージ追加処理(左手)ここから
|
||||||
@ -3689,7 +3714,10 @@ static struct Damage battle_calc_pc_weapon_attack(
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(skill_num != CR_GRANDCROSS) damage2=damage2*cardfix/100; //カード補正による左手ダメージ増加
|
if(!no_cardfix)
|
||||||
|
|
||||||
|
damage2=damage2*cardfix/100;
|
||||||
|
//カード補正による左手ダメージ増加
|
||||||
//カードによるダメージ増加処理(左手)ここまで
|
//カードによるダメージ増加処理(左手)ここまで
|
||||||
|
|
||||||
// -- moonsoul (cardfix for magic damage portion of ASC_BREAKER)
|
// -- moonsoul (cardfix for magic damage portion of ASC_BREAKER)
|
||||||
@ -4465,6 +4493,12 @@ int battle_weapon_attack( struct block_list *src,struct block_list *target,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(battle_check_target(src,target,BCT_ENEMY) <= 0 &&
|
||||||
|
|
||||||
|
!battle_check_range(src,target,0))
|
||||||
|
|
||||||
|
return 0; // 攻撃対象外
|
||||||
|
|
||||||
race = battle_get_race(target);
|
race = battle_get_race(target);
|
||||||
ele = battle_get_elem_type(target);
|
ele = battle_get_elem_type(target);
|
||||||
if(battle_check_target(src,target,BCT_ENEMY) > 0 &&
|
if(battle_check_target(src,target,BCT_ENEMY) > 0 &&
|
||||||
@ -5012,6 +5046,7 @@ static const struct {
|
|||||||
{ "player_skillup_limit", &battle_config.skillup_limit },
|
{ "player_skillup_limit", &battle_config.skillup_limit },
|
||||||
{ "weapon_produce_rate", &battle_config.wp_rate },
|
{ "weapon_produce_rate", &battle_config.wp_rate },
|
||||||
{ "potion_produce_rate", &battle_config.pp_rate },
|
{ "potion_produce_rate", &battle_config.pp_rate },
|
||||||
|
{ "deadly_potion_produce_rate", &battle_config.cdp_rate },
|
||||||
{ "monster_active_enable", &battle_config.monster_active_enable },
|
{ "monster_active_enable", &battle_config.monster_active_enable },
|
||||||
{ "monster_damage_delay_rate", &battle_config.monster_damage_delay_rate},
|
{ "monster_damage_delay_rate", &battle_config.monster_damage_delay_rate},
|
||||||
{ "monster_loot_type", &battle_config.monster_loot_type },
|
{ "monster_loot_type", &battle_config.monster_loot_type },
|
||||||
@ -5100,6 +5135,7 @@ static const struct {
|
|||||||
{ "making_arrow_name_input", &battle_config.making_arrow_name_input },
|
{ "making_arrow_name_input", &battle_config.making_arrow_name_input },
|
||||||
{ "holywater_name_input", &battle_config.holywater_name_input },
|
{ "holywater_name_input", &battle_config.holywater_name_input },
|
||||||
{ "display_delay_skill_fail", &battle_config.display_delay_skill_fail },
|
{ "display_delay_skill_fail", &battle_config.display_delay_skill_fail },
|
||||||
|
{ "display_snatcher_skill_fail", &battle_config.display_snatcher_skill_fail },
|
||||||
{ "chat_warpportal", &battle_config.chat_warpportal },
|
{ "chat_warpportal", &battle_config.chat_warpportal },
|
||||||
{ "mob_warpportal", &battle_config.mob_warpportal },
|
{ "mob_warpportal", &battle_config.mob_warpportal },
|
||||||
{ "dead_branch_active", &battle_config.dead_branch_active },
|
{ "dead_branch_active", &battle_config.dead_branch_active },
|
||||||
@ -5114,6 +5150,7 @@ static const struct {
|
|||||||
{ "gx_cardfix", &battle_config.gx_cardfix },
|
{ "gx_cardfix", &battle_config.gx_cardfix },
|
||||||
{ "gx_dupele", &battle_config.gx_dupele },
|
{ "gx_dupele", &battle_config.gx_dupele },
|
||||||
{ "gx_disptype", &battle_config.gx_disptype },
|
{ "gx_disptype", &battle_config.gx_disptype },
|
||||||
|
{ "devotion_level_difference", &battle_config.devotion_level_difference },
|
||||||
{ "player_skill_partner_check", &battle_config.player_skill_partner_check},
|
{ "player_skill_partner_check", &battle_config.player_skill_partner_check},
|
||||||
{ "hide_GM_session", &battle_config.hide_GM_session },
|
{ "hide_GM_session", &battle_config.hide_GM_session },
|
||||||
{ "unit_movement_type", &battle_config.unit_movement_type },
|
{ "unit_movement_type", &battle_config.unit_movement_type },
|
||||||
@ -5240,6 +5277,7 @@ void battle_set_defaults() {
|
|||||||
battle_config.skillup_limit = 0;
|
battle_config.skillup_limit = 0;
|
||||||
battle_config.wp_rate=100;
|
battle_config.wp_rate=100;
|
||||||
battle_config.pp_rate=100;
|
battle_config.pp_rate=100;
|
||||||
|
battle_config.cdp_rate=100;
|
||||||
battle_config.monster_active_enable=1;
|
battle_config.monster_active_enable=1;
|
||||||
battle_config.monster_damage_delay_rate=100;
|
battle_config.monster_damage_delay_rate=100;
|
||||||
battle_config.monster_loot_type=0;
|
battle_config.monster_loot_type=0;
|
||||||
@ -5329,6 +5367,7 @@ void battle_set_defaults() {
|
|||||||
battle_config.making_arrow_name_input = 1;
|
battle_config.making_arrow_name_input = 1;
|
||||||
battle_config.holywater_name_input = 1;
|
battle_config.holywater_name_input = 1;
|
||||||
battle_config.display_delay_skill_fail = 1;
|
battle_config.display_delay_skill_fail = 1;
|
||||||
|
battle_config.display_snatcher_skill_fail = 1;
|
||||||
battle_config.chat_warpportal = 0;
|
battle_config.chat_warpportal = 0;
|
||||||
battle_config.mob_warpportal = 0;
|
battle_config.mob_warpportal = 0;
|
||||||
battle_config.dead_branch_active = 0;
|
battle_config.dead_branch_active = 0;
|
||||||
@ -5343,6 +5382,7 @@ void battle_set_defaults() {
|
|||||||
battle_config.gx_cardfix = 0;
|
battle_config.gx_cardfix = 0;
|
||||||
battle_config.gx_dupele = 1;
|
battle_config.gx_dupele = 1;
|
||||||
battle_config.gx_disptype = 1;
|
battle_config.gx_disptype = 1;
|
||||||
|
battle_config.devotion_level_difference = 10;
|
||||||
battle_config.player_skill_partner_check = 1;
|
battle_config.player_skill_partner_check = 1;
|
||||||
battle_config.hide_GM_session = 0;
|
battle_config.hide_GM_session = 0;
|
||||||
battle_config.unit_movement_type = 0;
|
battle_config.unit_movement_type = 0;
|
||||||
|
@ -174,6 +174,7 @@ extern struct Battle_Config {
|
|||||||
int skillup_limit;
|
int skillup_limit;
|
||||||
int wp_rate;
|
int wp_rate;
|
||||||
int pp_rate;
|
int pp_rate;
|
||||||
|
int cdp_rate;
|
||||||
int monster_active_enable;
|
int monster_active_enable;
|
||||||
int monster_damage_delay_rate;
|
int monster_damage_delay_rate;
|
||||||
int monster_loot_type;
|
int monster_loot_type;
|
||||||
@ -262,6 +263,7 @@ extern struct Battle_Config {
|
|||||||
int making_arrow_name_input;
|
int making_arrow_name_input;
|
||||||
int holywater_name_input;
|
int holywater_name_input;
|
||||||
int display_delay_skill_fail;
|
int display_delay_skill_fail;
|
||||||
|
int display_snatcher_skill_fail;
|
||||||
int chat_warpportal;
|
int chat_warpportal;
|
||||||
int mob_warpportal;
|
int mob_warpportal;
|
||||||
int dead_branch_active;
|
int dead_branch_active;
|
||||||
@ -302,6 +304,7 @@ extern struct Battle_Config {
|
|||||||
int gx_cardfix;
|
int gx_cardfix;
|
||||||
int gx_dupele;
|
int gx_dupele;
|
||||||
int gx_disptype;
|
int gx_disptype;
|
||||||
|
int devotion_level_difference;
|
||||||
int player_skill_partner_check;
|
int player_skill_partner_check;
|
||||||
int hide_GM_session;
|
int hide_GM_session;
|
||||||
int unit_movement_type;
|
int unit_movement_type;
|
||||||
|
@ -9002,6 +9002,10 @@ void clif_parse_MoveToKafra(int fd, struct map_session_data *sd) {
|
|||||||
if (item_index < 0 || item_index >= MAX_INVENTORY)
|
if (item_index < 0 || item_index >= MAX_INVENTORY)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if(itemdb_isdropable(sd->status.inventory[item_index].nameid) == 0)
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
if (sd->state.storage_flag)
|
if (sd->state.storage_flag)
|
||||||
storage_guild_storageadd(sd, item_index, item_amount);
|
storage_guild_storageadd(sd, item_index, item_amount);
|
||||||
else
|
else
|
||||||
@ -10023,6 +10027,9 @@ static int clif_parse(int fd) {
|
|||||||
map_deliddb(&sd->bl); // account_id has been included in the DB before auth answer
|
map_deliddb(&sd->bl); // account_id has been included in the DB before auth answer
|
||||||
}
|
}
|
||||||
close(fd);
|
close(fd);
|
||||||
|
if (sd) // ’ljÁ
|
||||||
|
|
||||||
|
map_deliddb(&sd->bl); // ’ljÁ
|
||||||
delete_session(fd);
|
delete_session(fd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -54,13 +54,25 @@ int guild_skill_get_inf(int id) { // Modified for new skills [Sara]
|
|||||||
int guild_skill_get_sp(int id,int lv){ return 0; }
|
int guild_skill_get_sp(int id,int lv){ return 0; }
|
||||||
int guild_skill_get_range(int id){ return 0; }
|
int guild_skill_get_range(int id){ return 0; }
|
||||||
int guild_skill_get_max(int id) { // Modified for new skills [Sara]
|
int guild_skill_get_max(int id) { // Modified for new skills [Sara]
|
||||||
if (id==GD_EXTENSION) return 10;
|
if(id==GD_EXTENSION) return 10;
|
||||||
else if (id==GD_REGENERATION) return 3;
|
else if(id==GD_REGENERATION) return 3;
|
||||||
else return 1;
|
else return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ギルドスキルがあるか確認
|
// ギルドスキルがあるか確認
|
||||||
int guild_checkskill(struct guild *g,int id){ return g->skill[id-10000].lv; }
|
int guild_checkskill(struct guild *g,int id)
|
||||||
|
{
|
||||||
|
|
||||||
|
int idx = id-GD_SKILLBASE;
|
||||||
|
|
||||||
|
|
||||||
|
if (idx < 0 || idx >= MAX_GUILDSKILL)
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return g->skill[idx].lv;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int guild_payexp_timer(int tid,unsigned int tick,int id,int data);
|
int guild_payexp_timer(int tid,unsigned int tick,int id,int data);
|
||||||
@ -931,17 +943,20 @@ int guild_payexp(struct map_session_data *sd,int exp)
|
|||||||
int guild_skillup(struct map_session_data *sd,int skill_num,int flag)
|
int guild_skillup(struct map_session_data *sd,int skill_num,int flag)
|
||||||
{
|
{
|
||||||
struct guild *g;
|
struct guild *g;
|
||||||
int idx;
|
int idx = skill_num - GD_SKILLBASE;
|
||||||
|
|
||||||
nullpo_retr(0, sd);
|
nullpo_retr(0, sd);
|
||||||
|
|
||||||
|
if(idx < 0 || idx >= MAX_GUILDSKILL)
|
||||||
|
|
||||||
|
return 0;
|
||||||
if(sd->status.guild_id==0 || (g=guild_search(sd->status.guild_id))==NULL)
|
if(sd->status.guild_id==0 || (g=guild_search(sd->status.guild_id))==NULL)
|
||||||
return 0;
|
return 0;
|
||||||
if(strcmp(sd->status.name,g->master))
|
if(strcmp(sd->status.name,g->master))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if( (g->skill_point>0 || flag&1) &&
|
if( (g->skill_point>0 || flag&1) &&
|
||||||
g->skill[(idx=skill_num-10000)].id!=0 &&
|
g->skill[idx].id!=0 &&
|
||||||
g->skill[idx].lv < guild_skill_get_max(skill_num) ){
|
g->skill[idx].lv < guild_skill_get_max(skill_num) ){
|
||||||
intif_guild_skillup(g->guild_id,skill_num,sd->status.account_id,flag);
|
intif_guild_skillup(g->guild_id,skill_num,sd->status.account_id,flag);
|
||||||
}
|
}
|
||||||
@ -958,7 +973,7 @@ int guild_skillupack(int guild_id,int skill_num,int account_id)
|
|||||||
if(g==NULL)
|
if(g==NULL)
|
||||||
return 0;
|
return 0;
|
||||||
if(sd!=NULL)
|
if(sd!=NULL)
|
||||||
clif_guild_skillup(sd,skill_num,g->skill[skill_num-10000].lv);
|
clif_guild_skillup(sd,skill_num,g->skill[skill_num-GD_SKILLBASE].lv);
|
||||||
// 全員に通知
|
// 全員に通知
|
||||||
for(i=0;i<g->max_member;i++)
|
for(i=0;i<g->max_member;i++)
|
||||||
if((sd=g->member[i].sd)!=NULL)
|
if((sd=g->member[i].sd)!=NULL)
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
#define NATURAL_HEAL_INTERVAL 500
|
#define NATURAL_HEAL_INTERVAL 500
|
||||||
#define MAX_FLOORITEM 500000
|
#define MAX_FLOORITEM 500000
|
||||||
#define MAX_LEVEL 255
|
#define MAX_LEVEL 255
|
||||||
#define MAX_WALKPATH 48
|
#define MAX_WALKPATH 32
|
||||||
#define MAX_DROP_PER_MAP 48
|
#define MAX_DROP_PER_MAP 48
|
||||||
#define MAX_IGNORE_LIST 80
|
#define MAX_IGNORE_LIST 80
|
||||||
|
|
||||||
@ -255,6 +255,7 @@ struct map_session_data {
|
|||||||
short autospell_id,autospell_lv,autospell_rate;
|
short autospell_id,autospell_lv,autospell_rate;
|
||||||
short hp_drain_rate,hp_drain_per,sp_drain_rate,sp_drain_per;
|
short hp_drain_rate,hp_drain_per,sp_drain_rate,sp_drain_per;
|
||||||
short hp_drain_rate_,hp_drain_per_,sp_drain_rate_,sp_drain_per_;
|
short hp_drain_rate_,hp_drain_per_,sp_drain_rate_,sp_drain_per_;
|
||||||
|
short hp_drain_value,sp_drain_value,hp_drain_value_,sp_drain_value_;
|
||||||
int short_weapon_damage_return,long_weapon_damage_return;
|
int short_weapon_damage_return,long_weapon_damage_return;
|
||||||
int weapon_coma_ele[10],weapon_coma_race[12];
|
int weapon_coma_ele[10],weapon_coma_race[12];
|
||||||
short break_weapon_rate,break_armor_rate;
|
short break_weapon_rate,break_armor_rate;
|
||||||
@ -582,6 +583,7 @@ enum {
|
|||||||
SP_ADDEFF2,SP_BREAK_WEAPON_RATE,SP_BREAK_ARMOR_RATE,SP_ADD_STEAL_RATE, // 1067-1070
|
SP_ADDEFF2,SP_BREAK_WEAPON_RATE,SP_BREAK_ARMOR_RATE,SP_ADD_STEAL_RATE, // 1067-1070
|
||||||
SP_MAGIC_DAMAGE_RETURN,SP_RANDOM_ATTACK_INCREASE,SP_ALL_STATS,SP_AGI_VIT,SP_AGI_DEX_STR,SP_PERFECT_HIDE, // 1071-1076
|
SP_MAGIC_DAMAGE_RETURN,SP_RANDOM_ATTACK_INCREASE,SP_ALL_STATS,SP_AGI_VIT,SP_AGI_DEX_STR,SP_PERFECT_HIDE, // 1071-1076
|
||||||
SP_DISGUISE,SP_CLASSCHANGE, // 1077-1078
|
SP_DISGUISE,SP_CLASSCHANGE, // 1077-1078
|
||||||
|
SP_HP_DRAIN_VALUE,SP_SP_DRAIN_VALUE, // 1079-1080
|
||||||
|
|
||||||
SP_RESTART_FULL_RECORVER=2000,SP_NO_CASTCANCEL,SP_NO_SIZEFIX,SP_NO_MAGIC_DAMAGE,SP_NO_WEAPON_DAMAGE,SP_NO_GEMSTONE, // 2000-2005
|
SP_RESTART_FULL_RECORVER=2000,SP_NO_CASTCANCEL,SP_NO_SIZEFIX,SP_NO_MAGIC_DAMAGE,SP_NO_WEAPON_DAMAGE,SP_NO_GEMSTONE, // 2000-2005
|
||||||
SP_NO_CASTCANCEL2,SP_INFINITE_ENDURE,SP_UNBREAKABLE_WEAPON,SP_UNBREAKABLE_ARMOR // 2006-2009
|
SP_NO_CASTCANCEL2,SP_INFINITE_ENDURE,SP_UNBREAKABLE_WEAPON,SP_UNBREAKABLE_ARMOR // 2006-2009
|
||||||
|
@ -1590,16 +1590,20 @@ static int mob_ai_sub_hard(struct block_list *bl,va_list ap)
|
|||||||
(dist=distance(md->bl.x,md->bl.y,abl->x,abl->y))>=32 || battle_check_target(bl,abl,BCT_ENEMY)==0)
|
(dist=distance(md->bl.x,md->bl.y,abl->x,abl->y))>=32 || battle_check_target(bl,abl,BCT_ENEMY)==0)
|
||||||
md->attacked_id=0;
|
md->attacked_id=0;
|
||||||
else {
|
else {
|
||||||
md->target_id=md->attacked_id; // set target
|
//距離が遠い場合はタゲを変更しない
|
||||||
md->state.targettype = ATTACKABLE;
|
|
||||||
attack_type = 1;
|
if (!md->target_id || (distance(md->bl.x,md->bl.y,abl->x,abl->y)<3)) {
|
||||||
md->attacked_id=0;
|
md->target_id=md->attacked_id; // set target
|
||||||
md->min_chase=dist+13;
|
md->state.targettype = ATTACKABLE;
|
||||||
if(md->min_chase>26)
|
attack_type = 1;
|
||||||
md->min_chase=26;
|
md->attacked_id=0;
|
||||||
|
md->min_chase=dist+13;
|
||||||
|
if(md->min_chase>26)
|
||||||
|
md->min_chase=26;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
md->state.master_check = 0;
|
md->state.master_check = 0;
|
||||||
// Processing of slave monster
|
// Processing of slave monster
|
||||||
@ -3040,7 +3044,7 @@ int mobskill_castend_id( int tid, unsigned int tick, int id,int data )
|
|||||||
|
|
||||||
if(battle_config.mob_skill_log)
|
if(battle_config.mob_skill_log)
|
||||||
printf("MOB skill castend skill=%d, class = %d\n",md->skillid,md->class);
|
printf("MOB skill castend skill=%d, class = %d\n",md->skillid,md->class);
|
||||||
mob_stop_walking(md,0);
|
// mob_stop_walking(md,0);
|
||||||
|
|
||||||
switch( skill_get_nk(md->skillid) )
|
switch( skill_get_nk(md->skillid) )
|
||||||
{
|
{
|
||||||
@ -3171,7 +3175,7 @@ int mobskill_castend_pos( int tid, unsigned int tick, int id,int data )
|
|||||||
|
|
||||||
if(battle_config.mob_skill_log)
|
if(battle_config.mob_skill_log)
|
||||||
printf("MOB skill castend skill=%d, class = %d\n",md->skillid,md->class);
|
printf("MOB skill castend skill=%d, class = %d\n",md->skillid,md->class);
|
||||||
mob_stop_walking(md,0);
|
// mob_stop_walking(md,0);
|
||||||
|
|
||||||
skill_castend_pos2(&md->bl,md->skillx,md->skilly,md->skillid,md->skilllv,tick,0);
|
skill_castend_pos2(&md->bl,md->skillx,md->skilly,md->skillid,md->skilllv,tick,0);
|
||||||
|
|
||||||
@ -3257,6 +3261,7 @@ int mobskill_use_id(struct mob_data *md,struct block_list *target,int skill_idx)
|
|||||||
|
|
||||||
if(casttime>0 || forcecast){ // ‰r<E280B0>¥‚ª•K—v
|
if(casttime>0 || forcecast){ // ‰r<E280B0>¥‚ª•K—v
|
||||||
// struct mob_data *md2;
|
// struct mob_data *md2;
|
||||||
|
mob_stop_walking(md,0); // 歩行停止
|
||||||
clif_skillcasting( &md->bl,
|
clif_skillcasting( &md->bl,
|
||||||
md->bl.id, target->id, 0,0, skill_id,casttime);
|
md->bl.id, target->id, 0,0, skill_id,casttime);
|
||||||
|
|
||||||
@ -3352,9 +3357,11 @@ int mobskill_use_pos( struct mob_data *md,
|
|||||||
printf("MOB skill use target_pos=(%d,%d) skill=%d lv=%d cast=%d, class = %d\n",
|
printf("MOB skill use target_pos=(%d,%d) skill=%d lv=%d cast=%d, class = %d\n",
|
||||||
skill_x,skill_y,skill_id,skill_lv,casttime,md->class);
|
skill_x,skill_y,skill_id,skill_lv,casttime,md->class);
|
||||||
|
|
||||||
if( casttime>0 ) // A cast time is required.
|
if( casttime>0 ) { // A cast time is required.
|
||||||
|
mob_stop_walking(md,0); // 歩行停止
|
||||||
clif_skillcasting( &md->bl,
|
clif_skillcasting( &md->bl,
|
||||||
md->bl.id, 0, skill_x,skill_y, skill_id,casttime);
|
md->bl.id, 0, skill_x,skill_y, skill_id,casttime);
|
||||||
|
}
|
||||||
|
|
||||||
if( casttime<=0 ) // A skill without a cast time wont be cancelled.
|
if( casttime<=0 ) // A skill without a cast time wont be cancelled.
|
||||||
md->state.skillcastcancel=0;
|
md->state.skillcastcancel=0;
|
||||||
|
52
src/map/pc.c
52
src/map/pc.c
@ -2726,6 +2726,25 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
|
|||||||
sd->hp_drain_rate_ += type2;
|
sd->hp_drain_rate_ += type2;
|
||||||
sd->hp_drain_per_ += val;
|
sd->hp_drain_per_ += val;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
case SP_HP_DRAIN_VALUE:
|
||||||
|
|
||||||
|
if(!sd->state.lr_flag) {
|
||||||
|
|
||||||
|
sd->hp_drain_rate += type2;
|
||||||
|
|
||||||
|
sd->hp_drain_value += val;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else if(sd->state.lr_flag == 1) {
|
||||||
|
|
||||||
|
sd->hp_drain_rate_ += type2;
|
||||||
|
|
||||||
|
sd->hp_drain_value_ += val;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case SP_SP_DRAIN_RATE:
|
case SP_SP_DRAIN_RATE:
|
||||||
if(!sd->state.lr_flag) {
|
if(!sd->state.lr_flag) {
|
||||||
@ -2736,6 +2755,25 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
|
|||||||
sd->sp_drain_rate_ += type2;
|
sd->sp_drain_rate_ += type2;
|
||||||
sd->sp_drain_per_ += val;
|
sd->sp_drain_per_ += val;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
case SP_SP_DRAIN_VALUE:
|
||||||
|
|
||||||
|
if(!sd->state.lr_flag) {
|
||||||
|
|
||||||
|
sd->sp_drain_rate += type2;
|
||||||
|
|
||||||
|
sd->sp_drain_value += val;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else if(sd->state.lr_flag == 1) {
|
||||||
|
|
||||||
|
sd->sp_drain_rate_ += type2;
|
||||||
|
|
||||||
|
sd->sp_drain_value_ += val;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case SP_WEAPON_COMA_ELE:
|
case SP_WEAPON_COMA_ELE:
|
||||||
if(sd->state.lr_flag != 2)
|
if(sd->state.lr_flag != 2)
|
||||||
@ -3107,6 +3145,16 @@ int pc_dropitem(struct map_session_data *sd,int n,int amount)
|
|||||||
{
|
{
|
||||||
nullpo_retr(1, sd);
|
nullpo_retr(1, sd);
|
||||||
|
|
||||||
|
if(n < 0 || n >= MAX_INVENTORY)
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
|
||||||
|
if(amount <= 0)
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
|
||||||
if (sd->status.inventory[n].nameid <= 0 ||
|
if (sd->status.inventory[n].nameid <= 0 ||
|
||||||
sd->status.inventory[n].amount < amount ||
|
sd->status.inventory[n].amount < amount ||
|
||||||
sd->trade_partner != 0 || sd->vender_id != 0 ||
|
sd->trade_partner != 0 || sd->vender_id != 0 ||
|
||||||
@ -3240,8 +3288,10 @@ int pc_useitem(struct map_session_data *sd,int n)
|
|||||||
if(sd->inventory_data[n])
|
if(sd->inventory_data[n])
|
||||||
run_script(sd->inventory_data[n]->use_script,0,sd->bl.id,0);
|
run_script(sd->inventory_data[n]->use_script,0,sd->bl.id,0);
|
||||||
|
|
||||||
clif_useitemack(sd,n,amount-1,1);
|
|
||||||
pc_delitem(sd,n,1,1);
|
pc_delitem(sd,n,1,1);
|
||||||
|
amount = sd->status.inventory[n].amount;
|
||||||
|
|
||||||
|
clif_useitemack(sd,n,amount,1);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -232,7 +232,11 @@ int SkillStatusChangeTable[]={ /* skill.h
|
|||||||
-1,-1,
|
-1,-1,
|
||||||
SC_GOSPEL,
|
SC_GOSPEL,
|
||||||
/* 370- */
|
/* 370- */
|
||||||
-1,-1,-1,-1,-1,-1,-1,-1,SC_EDP,-1,
|
-1,-1,-1,-1,-1,-1,-1,-1,
|
||||||
|
|
||||||
|
SC_EDP,
|
||||||
|
|
||||||
|
-1,
|
||||||
/* 380- */
|
/* 380- */
|
||||||
SC_TRUESIGHT,
|
SC_TRUESIGHT,
|
||||||
-1,-1,
|
-1,-1,
|
||||||
@ -1053,8 +1057,8 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl,int s
|
|||||||
if((skill*15 + 55) + (skill2 = pc_checkskill(sd,TF_STEAL))*10 > rand()%1000) {
|
if((skill*15 + 55) + (skill2 = pc_checkskill(sd,TF_STEAL))*10 > rand()%1000) {
|
||||||
if(pc_steal_item(sd,bl))
|
if(pc_steal_item(sd,bl))
|
||||||
clif_skill_nodamage(src,bl,TF_STEAL,skill2,1);
|
clif_skill_nodamage(src,bl,TF_STEAL,skill2,1);
|
||||||
//else
|
else if (battle_config.display_snatcher_skill_fail)
|
||||||
// clif_skill_fail(sd,skillid,0,0); // it's annoying! =p [Celest]
|
clif_skill_fail(sd,skillid,0,0); // it's annoying! =p [Celest]
|
||||||
}
|
}
|
||||||
// エンチャントデットリ?ポイズン(猛毒?果)
|
// エンチャントデットリ?ポイズン(猛毒?果)
|
||||||
if (sd && sd->sc_data[SC_EDP].timer != -1 && rand() % 10000 < sd->sc_data[SC_EDP].val2 * sc_def_vit) {
|
if (sd && sd->sc_data[SC_EDP].timer != -1 && rand() % 10000 < sd->sc_data[SC_EDP].val2 * sc_def_vit) {
|
||||||
@ -2559,6 +2563,7 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
|
|||||||
case WZ_JUPITEL: /* ユピテルサンダ? */
|
case WZ_JUPITEL: /* ユピテルサンダ? */
|
||||||
case NPC_MAGICALATTACK: /* MOB:魔法打?攻? */
|
case NPC_MAGICALATTACK: /* MOB:魔法打?攻? */
|
||||||
case PR_ASPERSIO: /* アスペルシオ */
|
case PR_ASPERSIO: /* アスペルシオ */
|
||||||
|
// case HW_NAPALMVULCAN: /* ƒiƒp<C692>[ƒ€ƒoƒ‹ƒJƒ“ */
|
||||||
skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
|
skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -2612,34 +2617,34 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HW_NAPALMVULCAN: // Fixed By SteelViruZ
|
case HW_NAPALMVULCAN: // Fixed By SteelViruZ
|
||||||
if(flag&1){
|
if(flag&1){
|
||||||
if(bl->id!=skill_area_temp[1]){
|
if(bl->id!=skill_area_temp[1]){
|
||||||
skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,
|
|
||||||
skill_area_temp[0]);
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
int ar=(skillid==HW_NAPALMVULCAN)?1:2;
|
|
||||||
skill_area_temp[1]=bl->id;
|
|
||||||
if(skillid==HW_NAPALMVULCAN){
|
|
||||||
skill_area_temp[0]=0;
|
|
||||||
map_foreachinarea(skill_area_sub,
|
|
||||||
bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0,
|
|
||||||
src,skillid,skilllv,tick, flag|BCT_ENEMY ,
|
|
||||||
skill_area_sub_count);
|
|
||||||
}else{
|
|
||||||
skill_area_temp[0]=0;
|
|
||||||
skill_area_temp[2]=bl->x;
|
|
||||||
skill_area_temp[3]=bl->y;
|
|
||||||
}
|
|
||||||
skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,
|
skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,
|
||||||
skill_area_temp[0] );
|
skill_area_temp[0]);
|
||||||
map_foreachinarea(skill_area_sub,
|
|
||||||
bl->m,bl->x-ar,bl->y-ar,bl->x+ar,bl->y+ar,0,
|
|
||||||
src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
|
|
||||||
skill_castend_damage_id);
|
|
||||||
}
|
}
|
||||||
break;
|
}else{
|
||||||
|
int ar=(skillid==HW_NAPALMVULCAN)?1:2;
|
||||||
|
skill_area_temp[1]=bl->id;
|
||||||
|
if(skillid==HW_NAPALMVULCAN){
|
||||||
|
skill_area_temp[0]=0;
|
||||||
|
map_foreachinarea(skill_area_sub,
|
||||||
|
bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0,
|
||||||
|
src,skillid,skilllv,tick, flag|BCT_ENEMY ,
|
||||||
|
skill_area_sub_count);
|
||||||
|
}else{
|
||||||
|
skill_area_temp[0]=0;
|
||||||
|
skill_area_temp[2]=bl->x;
|
||||||
|
skill_area_temp[3]=bl->y;
|
||||||
|
}
|
||||||
|
skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,
|
||||||
|
skill_area_temp[0] );
|
||||||
|
map_foreachinarea(skill_area_sub,
|
||||||
|
bl->m,bl->x-ar,bl->y-ar,bl->x+ar,bl->y+ar,0,
|
||||||
|
src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
|
||||||
|
skill_castend_damage_id);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case WZ_FROSTNOVA: /* フロストノヴァ */
|
case WZ_FROSTNOVA: /* フロストノヴァ */
|
||||||
skill_castend_pos2(src,bl->x,bl->y,skillid,skilllv,tick,0);
|
skill_castend_pos2(src,bl->x,bl->y,skillid,skilllv,tick,0);
|
||||||
|
@ -311,6 +311,9 @@ enum { // struct map_session_data
|
|||||||
|
|
||||||
SC_SPIDERWEB =180, /* スパイダ?ウェッブ */
|
SC_SPIDERWEB =180, /* スパイダ?ウェッブ */
|
||||||
SC_MEMORIZE =181, /* メモライズ */
|
SC_MEMORIZE =181, /* メモライズ */
|
||||||
|
// SC_DPOISON =182, /* 猛毒 */
|
||||||
|
|
||||||
|
// SC_EDP =183, /* エフェクトが判明したら移動 */
|
||||||
|
|
||||||
SC_WEDDING =187, //結婚用(結婚衣裳になって?くのが?いとか)
|
SC_WEDDING =187, //結婚用(結婚衣裳になって?くのが?いとか)
|
||||||
SC_NOCHAT =188, //赤エモ?態
|
SC_NOCHAT =188, //赤エモ?態
|
||||||
@ -860,7 +863,8 @@ enum {
|
|||||||
CR_FULLPROTECTION,
|
CR_FULLPROTECTION,
|
||||||
ITM_TOMAHAWK,
|
ITM_TOMAHAWK,
|
||||||
|
|
||||||
GD_APPROVAL=10000,
|
// moved to common/mmo.h
|
||||||
|
/* GD_APPROVAL=10000,
|
||||||
GD_KAFRACONTACT=10001,
|
GD_KAFRACONTACT=10001,
|
||||||
GD_GUARDIANRESEARCH=10002,
|
GD_GUARDIANRESEARCH=10002,
|
||||||
GD_GUARDUP=10003,
|
GD_GUARDUP=10003,
|
||||||
@ -874,7 +878,7 @@ enum {
|
|||||||
GD_REGENERATION=10011,
|
GD_REGENERATION=10011,
|
||||||
GD_RESTORE=10012,
|
GD_RESTORE=10012,
|
||||||
GD_EMERGENCYCALL=10013,
|
GD_EMERGENCYCALL=10013,
|
||||||
GD_DEVELOPMENT=10014,
|
GD_DEVELOPMENT=10014,*/
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user