summaryrefslogtreecommitdiff
path: root/src/map/unit.c
diff options
context:
space:
mode:
authorzephyrus <zephyrus@54d463be-8e91-2dee-dedb-b68131a5f0ec>2008-09-10 14:30:25 +0000
committerzephyrus <zephyrus@54d463be-8e91-2dee-dedb-b68131a5f0ec>2008-09-10 14:30:25 +0000
commitd3f9255b3d67e570a7784b44b151ed15198425ee (patch)
treeb48e75936e8b77b61d3f65b8b972556ac511d0c4 /src/map/unit.c
parente02e0c5cba6e83986da6fdce9c69a9201f9a271f (diff)
downloadhercules-d3f9255b3d67e570a7784b44b151ed15198425ee.tar.gz
hercules-d3f9255b3d67e570a7784b44b151ed15198425ee.tar.bz2
hercules-d3f9255b3d67e570a7784b44b151ed15198425ee.tar.xz
hercules-d3f9255b3d67e570a7784b44b151ed15198425ee.zip
- Full implementation of mercenary skills.
git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@13203 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'src/map/unit.c')
-rw-r--r--src/map/unit.c65
1 files changed, 36 insertions, 29 deletions
diff --git a/src/map/unit.c b/src/map/unit.c
index 4003e89c6..daa96819f 100644
--- a/src/map/unit.c
+++ b/src/map/unit.c
@@ -945,29 +945,32 @@ int unit_skilluse_id2(struct block_list *src, int target_id, short skill_num, sh
return 0;
}
//TODO: Add type-independant skill_check_condition function.
- if (src->type == BL_MOB) {
- switch (skill_num) {
+ if( src->type == BL_MOB )
+ switch( skill_num )
+ {
case NPC_SUMMONSLAVE:
case NPC_SUMMONMONSTER:
case AL_TELEPORT:
- if (((TBL_MOB*)src)->master_id && ((TBL_MOB*)src)->special_state.ai)
+ if( ((TBL_MOB*)src)->master_id && ((TBL_MOB*)src)->special_state.ai )
return 0;
}
- }
-
+
//Check range when not using skill on yourself or is a combo-skill during attack
//(these are supposed to always have the same range as your attack)
- if(src->id != target_id && (!temp || ud->attacktimer == -1))
+ if( src->id != target_id && (!temp || ud->attacktimer == -1) )
{
- if (skill_get_state(ud->skillid) == ST_MOVE_ENABLE)
+ if( skill_get_state(ud->skillid) == ST_MOVE_ENABLE )
{
- if (!unit_can_reach_bl(src, target, skill_get_range2(src, skill_num,skill_lv)+1, 1, NULL, NULL))
- return 0; //Walk-path check failed.
- } else
- if (!battle_check_range(src, target, skill_get_range2(src, skill_num,skill_lv)
- +(skill_num==RG_CLOSECONFINE?0:1)))
- //Close confine is exploitable thanks to this extra range "feature" of the client. [Skotlex]
- return 0; //Arrow-path check failed.
+ if( !unit_can_reach_bl(src, target, skill_get_range2(src, skill_num,skill_lv) + 1, 1, NULL, NULL) )
+ return 0; // Walk-path check failed.
+ }
+ else if( src->type == BL_MER && skill_num == MA_REMOVETRAP )
+ {
+ if( !battle_check_range(battle_get_master(src), target, skill_get_range2(src, skill_num, skill_lv) + 1) )
+ return 0; // Aegis calc remove trap based on Master position, ignoring mercenary O.O
+ }
+ else if( !battle_check_range(src, target, skill_get_range2(src, skill_num,skill_lv) + (skill_num == RG_CLOSECONFINE?0:1)) )
+ return 0; // Arrow-path check failed.
}
if (!temp) //Stop attack on non-combo skills [Skotlex]
@@ -1028,8 +1031,8 @@ int unit_skilluse_id2(struct block_list *src, int target_id, short skill_num, sh
if (!(skill_get_castnodex(skill_num, skill_lv)&2))
casttime = skill_castfix_sc(src, casttime);
- if( casttime>0 || temp){
-
+ if( casttime > 0 || temp )
+ {
clif_skillcasting(src, src->id, target_id, 0,0, skill_num, skill_get_ele(skill_num, skill_lv), casttime);
if (sd && target->type == BL_MOB)
@@ -1062,8 +1065,8 @@ int unit_skilluse_id2(struct block_list *src, int target_id, short skill_num, sh
}
}
- if( casttime<=0 )
- ud->state.skillcastcancel=0;
+ if( casttime <= 0 )
+ ud->state.skillcastcancel = 0;
ud->canact_tick = tick + casttime + 100;
ud->skilltarget = target_id;
@@ -1072,14 +1075,14 @@ int unit_skilluse_id2(struct block_list *src, int target_id, short skill_num, sh
ud->skillid = skill_num;
ud->skilllv = skill_lv;
- if(sc && sc->data[SC_CLOAKING] &&
- !(sc->data[SC_CLOAKING]->val4&4) && skill_num != AS_CLOAKING)
+ if( sc && sc->data[SC_CLOAKING] && !(sc->data[SC_CLOAKING]->val4&4) && skill_num != AS_CLOAKING )
{
status_change_end(src,SC_CLOAKING,-1);
if (!src->prev) return 0; //Warped away!
}
- if(casttime > 0) {
+ if( casttime > 0 )
+ {
ud->skilltimer = add_timer( tick+casttime, skill_castend_id, src->id, 0 );
if( sd && pc_checkskill(sd,SA_FREECAST) > 0 )
status_calc_bl(&sd->bl, SCB_SPEED);
@@ -1147,12 +1150,12 @@ int unit_skilluse_pos2( struct block_list *src, short skill_x, short skill_y, sh
bl.x = skill_x;
bl.y = skill_y;
- if (skill_get_state(ud->skillid) == ST_MOVE_ENABLE)
+ if( skill_get_state(ud->skillid) == ST_MOVE_ENABLE )
{
- if (!unit_can_reach_bl(src, &bl, skill_get_range2(src, skill_num,skill_lv)+1, 1, NULL, NULL))
+ if( !unit_can_reach_bl(src, &bl, skill_get_range2(src, skill_num,skill_lv) + 1, 1, NULL, NULL) )
return 0; //Walk-path check failed.
- } else
- if (!battle_check_range(src,&bl,skill_get_range2(src, skill_num,skill_lv)+1))
+ }
+ else if( !battle_check_range(src, &bl, skill_get_range2(src, skill_num,skill_lv) + 1) )
return 0; //Arrow-path check failed.
unit_stop_attack(src);
@@ -1162,10 +1165,12 @@ int unit_skilluse_pos2( struct block_list *src, short skill_x, short skill_y, sh
if (!(skill_get_castnodex(skill_num, skill_lv)&2))
casttime = skill_castfix_sc(src, casttime);
- if( casttime>0 ) {
+ if( casttime > 0 )
+ {
unit_stop_walking( src, 1);
clif_skillcasting(src, src->id, 0, skill_x, skill_y, skill_num, skill_get_ele(skill_num, skill_lv), casttime);
- } else
+ }
+ else
ud->state.skillcastcancel=0;
ud->canact_tick = tick + casttime + 100;
@@ -1181,14 +1186,16 @@ int unit_skilluse_pos2( struct block_list *src, short skill_x, short skill_y, sh
if (!src->prev) return 0; //Warped away!
}
- if(casttime > 0) {
+ if( casttime > 0 )
+ {
ud->skilltimer = add_timer( tick+casttime, skill_castend_pos, src->id, 0 );
if( sd && pc_checkskill(sd,SA_FREECAST) > 0 )
status_calc_bl(&sd->bl, SCB_SPEED);
else
unit_stop_walking(src,1);
}
- else {
+ else
+ {
ud->skilltimer = INVALID_TIMER;
skill_castend_pos(ud->skilltimer,tick,src->id,0);
}