- Fixed itemskill variable being cleared before parsing the skill, this causes auto-casted teleport to fail to skip the skill menu. It is now cleared on castend_pos/id directly.
- The item skill/lv variables now use 0 as default to signal they aren't being used (instead of -1) - Skills with state 'move_enable' will now do a "walk path" check between target cell/object and caster instead of a "shoot path" check, this would fix skills like snap or charge from letting you "teleport" across pits. - Fixed a possible double map_addblock when hatching a pet egg right before going through a warp. git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@9275 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
parent
4822dcf191
commit
208cf8d875
@ -4,6 +4,13 @@ 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/11/20
|
||||
* Fixed itemskill variable being cleared before parsing the skill, this
|
||||
causes auto-casted teleport to fail to skip the skill menu. It is now
|
||||
cleared on castend_pos/id directly. [Skotlex]
|
||||
* Skills with state 'move_enable' will now do a "walk path" check between
|
||||
target cell/object and caster instead of a "shoot path" check, this would
|
||||
fix skills like snap or charge from letting you "teleport" across pits.
|
||||
[Skotlex]
|
||||
* Raised the amount of skills that can stack on a single cell before the
|
||||
"in-area/out-area" detection code breaks to 24 (from 8) [Skotlex]
|
||||
* Fixed a crash in clif_SkillInfoBlock if the passed player already
|
||||
|
@ -9822,14 +9822,14 @@ void clif_parse_UseSkillToId(int fd, struct map_session_data *sd) {
|
||||
if(target_id<0 && -target_id == sd->bl.id) // for disguises [Valaris]
|
||||
target_id = sd->bl.id;
|
||||
|
||||
if (sd->skillitem >= 0 && sd->skillitem == skillnum) {
|
||||
if (sd->skillitem == skillnum) {
|
||||
if (skilllv != sd->skillitemlv)
|
||||
skilllv = sd->skillitemlv;
|
||||
unit_skilluse_id(&sd->bl, target_id, skillnum, skilllv);
|
||||
return;
|
||||
}
|
||||
|
||||
sd->skillitem = sd->skillitemlv = -1;
|
||||
sd->skillitem = sd->skillitemlv = 0;
|
||||
if (skillnum == MO_EXTREMITYFIST) {
|
||||
if ((sd->sc.data[SC_COMBO].timer == -1 ||
|
||||
(sd->sc.data[SC_COMBO].val1 != MO_COMBOFINISH &&
|
||||
@ -9918,12 +9918,12 @@ void clif_parse_UseSkillToPosSub(int fd, struct map_session_data *sd, int skilll
|
||||
|
||||
if (sd->invincible_timer != -1)
|
||||
pc_delinvincibletimer(sd);
|
||||
if (sd->skillitem >= 0 && sd->skillitem == skillnum) {
|
||||
if (sd->skillitem == skillnum) {
|
||||
if (skilllv != sd->skillitemlv)
|
||||
skilllv = sd->skillitemlv;
|
||||
unit_skilluse_pos(&sd->bl, x, y, skillnum, skilllv);
|
||||
} else {
|
||||
sd->skillitem = sd->skillitemlv = -1;
|
||||
sd->skillitem = sd->skillitemlv = 0;
|
||||
if ((lv = pc_checkskill(sd, skillnum)) > 0) {
|
||||
if (skilllv > lv)
|
||||
skilllv = lv;
|
||||
|
@ -596,8 +596,6 @@ int pc_authok(struct map_session_data *sd, int login_id2, time_t connect_until_t
|
||||
sd->state.connect_new = 1;
|
||||
|
||||
sd->followtimer = -1; // [MouseJstr]
|
||||
sd->skillitem = -1;
|
||||
sd->skillitemlv = -1;
|
||||
sd->invincible_timer = -1;
|
||||
|
||||
sd->canuseitem_tick = tick;
|
||||
|
@ -459,13 +459,14 @@ int pet_birth_process(struct map_session_data *sd, struct s_pet *pet)
|
||||
if (save_settings&8)
|
||||
chrif_save(sd,0); //is it REALLY Needed to save the char for hatching a pet? [Skotlex]
|
||||
|
||||
if(sd->bl.prev != NULL) {
|
||||
map_addblock(&sd->pd->bl);
|
||||
clif_spawn(&sd->pd->bl);
|
||||
clif_send_petdata(sd,0,0);
|
||||
clif_send_petdata(sd,5,battle_config.pet_hair_style);
|
||||
clif_pet_equip(sd->pd);
|
||||
clif_send_petstatus(sd);
|
||||
|
||||
}
|
||||
Assert((sd->status.pet_id == 0 || sd->pd == 0) || sd->pd->msd == sd);
|
||||
|
||||
return 0;
|
||||
|
@ -5701,6 +5701,9 @@ int skill_castend_id (int tid, unsigned int tick, int id, int data)
|
||||
else
|
||||
skill_castend_damage_id(src,target,ud->skillid,ud->skilllv,tick,0);
|
||||
|
||||
if (sd && sd->skillitem == ud->skillid) //Clear item skill data.
|
||||
sd->skillitem = sd->skillitemlv = 0;
|
||||
|
||||
sc = status_get_sc(src);
|
||||
if(sc && sc->count && sc->data[SC_MAGICPOWER].timer != -1 && ud->skillid != HW_MAGICPOWER && ud->skillid != WZ_WATERBALL)
|
||||
status_change_end(src,SC_MAGICPOWER,-1);
|
||||
@ -5750,7 +5753,7 @@ int skill_castend_id (int tid, unsigned int tick, int id, int data)
|
||||
//You can't place a skill failed packet here because it would be
|
||||
//sent in ALL cases, even cases where skill_check_condition fails
|
||||
//which would lead to double 'skill failed' messages u.u [Skotlex]
|
||||
if(sd) sd->skillitem = sd->skillitemlv = -1;
|
||||
if(sd) sd->skillitem = sd->skillitemlv = 0;
|
||||
else
|
||||
if(md) md->skillidx = -1;
|
||||
return 0;
|
||||
@ -5853,6 +5856,9 @@ int skill_castend_pos (int tid, unsigned int tick, int id, int data)
|
||||
unit_set_walkdelay(src, tick, battle_config.default_skill_delay+skill_get_walkdelay(ud->skillid, ud->skilllv), 1);
|
||||
skill_castend_pos2(src,ud->skillx,ud->skilly,ud->skillid,ud->skilllv,tick,0);
|
||||
|
||||
if (sd && sd->skillitem == ud->skillid) //Clear item skill data.
|
||||
sd->skillitem = sd->skillitemlv = 0;
|
||||
|
||||
if (ud->skilltimer == -1) {
|
||||
if (md) md->skillidx = -1;
|
||||
else ud->skillid = 0; //Non mobs can't clear this one as it is used for skill condition 'afterskill'
|
||||
@ -5865,7 +5871,7 @@ int skill_castend_pos (int tid, unsigned int tick, int id, int data)
|
||||
ud->skillid = ud->skilllv = 0;
|
||||
if(sd) {
|
||||
clif_skill_fail(sd,ud->skillid,0,0);
|
||||
sd->skillitem = sd->skillitemlv = -1;
|
||||
sd->skillitem = sd->skillitemlv = 0;
|
||||
}
|
||||
else if (hd && hd->master)
|
||||
clif_skill_fail(hd->master, ud->skillid, 0, 0);
|
||||
@ -6244,7 +6250,6 @@ int skill_castend_pos2 (struct block_list *src, int x, int y, int skillid, int s
|
||||
|
||||
if (sd && !(flag&1) && sd->state.arrow_atk) //Consume arrow if a ground skill was not invoked. [Skotlex]
|
||||
battle_consume_ammo(sd, skillid, skilllv);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -7843,7 +7848,7 @@ int skill_check_condition (struct map_session_data *sd, int skill, int lv, int t
|
||||
pc_isGM(sd)>= battle_config.gm_skilluncond &&
|
||||
sd->skillitem != skill)
|
||||
{ //GMs don't override the skillItem check, otherwise they can use items without them being consumed! [Skotlex]
|
||||
sd->skillitem = sd->skillitemlv = -1;
|
||||
sd->skillitem = sd->skillitemlv = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -7854,13 +7859,13 @@ int skill_check_condition (struct map_session_data *sd, int skill, int lv, int t
|
||||
|
||||
if(pc_is90overweight(sd)) {
|
||||
clif_skill_fail(sd,skill,9,0);
|
||||
sd->skillitem = sd->skillitemlv = -1;
|
||||
sd->skillitem = sd->skillitemlv = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (sd->state.abra_flag)
|
||||
{
|
||||
sd->skillitem = sd->skillitemlv = -1;
|
||||
sd->skillitem = sd->skillitemlv = 0;
|
||||
if(type&1) sd->state.abra_flag = 0;
|
||||
return 1;
|
||||
}
|
||||
@ -7869,7 +7874,7 @@ int skill_check_condition (struct map_session_data *sd, int skill, int lv, int t
|
||||
(skill == AM_PHARMACY || skill == AC_MAKINGARROW || skill == BS_REPAIRWEAPON ||
|
||||
skill == AM_TWILIGHT1 || skill == AM_TWILIGHT2 || skill == AM_TWILIGHT3
|
||||
)) {
|
||||
sd->skillitem = sd->skillitemlv = -1;
|
||||
sd->skillitem = sd->skillitemlv = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -7894,8 +7899,6 @@ int skill_check_condition (struct map_session_data *sd, int skill, int lv, int t
|
||||
else
|
||||
pc_delitem(sd,i,1,0);
|
||||
}
|
||||
if (type&1) //Casting finished
|
||||
sd->skillitem = sd->skillitemlv = -1;
|
||||
return 1;
|
||||
}
|
||||
// for the guild skills [celest]
|
||||
|
@ -880,10 +880,18 @@ int unit_skilluse_id2(struct block_list *src, int target_id, int skill_num, int
|
||||
|
||||
//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) &&
|
||||
!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;
|
||||
if(src->id != target_id && (!temp || ud->attacktimer == -1))
|
||||
{
|
||||
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 (!temp) //Stop attack on non-combo skills [Skotlex]
|
||||
unit_stop_attack(src);
|
||||
@ -1041,9 +1049,14 @@ int unit_skilluse_pos2( struct block_list *src, int skill_x, int skill_y, int sk
|
||||
bl.m = src->m;
|
||||
bl.x = skill_x;
|
||||
bl.y = skill_y;
|
||||
if(skill_num != TK_HIGHJUMP &&
|
||||
!battle_check_range(src,&bl,skill_get_range2(src, skill_num,skill_lv)+1))
|
||||
return 0;
|
||||
|
||||
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))
|
||||
return 0; //Walk-path check failed.
|
||||
} 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);
|
||||
ud->state.skillcastcancel = castcancel;
|
||||
@ -1837,7 +1850,6 @@ int unit_free(struct block_list *bl, int clrtype) {
|
||||
intif_homunculus_requestdelete(hd->homunculus.hom_id);
|
||||
if (sd) sd->status.hom_id = 0;
|
||||
}
|
||||
aFree(hd); // Remember to free it! [Lance]
|
||||
if(sd) sd->hd = NULL;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user