summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog-Trunk.txt14
-rw-r--r--db/Changelog.txt2
-rw-r--r--db/skill_db.txt2
-rw-r--r--src/map/battle.c4
-rw-r--r--src/map/guild.c2
-rw-r--r--src/map/map.c2
-rw-r--r--src/map/pc.c32
-rw-r--r--src/map/pc.h2
-rw-r--r--src/map/skill.c49
-rw-r--r--src/map/skill.h2
-rw-r--r--src/map/status.c2
11 files changed, 69 insertions, 44 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt
index 454d860a1..0599c215a 100644
--- a/Changelog-Trunk.txt
+++ b/Changelog-Trunk.txt
@@ -4,6 +4,20 @@ 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. EVERYTHING ELSE
GOES INTO TRUNK AND WILL BE MERGED INTO STABLE BY VALARIS AND WIZPUTER. -- VALARIS
+
+2006/03/18
+ * Small fix to prevent killer/killable states from allowing you to target
+ yourself. [Skotlex]
+ * Added Explosion Spirits to list of effects that dispel on logout.
+ [Skotlex]
+ * Fixed handling of guild skills by pc_blockskill_start, moved it to
+ skill.c [Skotlex]
+ * Fixed autoguard icon showing with stun. [Skotlex]
+ * Fixed acid demonstration breaking shield instead of armor. [Skotlex]
+ * Fixed Slim Pitcher crashing server ocassionally. [Skotlex]
+ * Hopefully fixed Ankle Snare lasting the whole trap's duration [Skotlex]
+ * Added sc_start(SC_ENDURE) on infinite endure bonus. [Skotlex]
+ * Fixed Berserk Pitcher consuming required items twice. [Skotlex]
2006/03/18
* Fixed BA_DISSONANCE and DC_UGLYDANCE not working. status_check_skilluse was blocking
them due to the lack of an exception like BA_MUSICALSTRIKE has it. [blackhole89]
diff --git a/db/Changelog.txt b/db/Changelog.txt
index 3bf8e75bf..24a365d07 100644
--- a/db/Changelog.txt
+++ b/db/Changelog.txt
@@ -25,7 +25,9 @@
-----
=========================
+
03/20
+ * Fixed splash area of Ganbantein [Skotlex]
* Updated atk,def,mdef of NJ/GS items, thanks to Haplo [Lupus]
- also re-fixed few blackhole89 (def, atk) values
* Uploaded Kargha's updated item_db.txt with the Gunslinger/Ninja usage bits set.
diff --git a/db/skill_db.txt b/db/skill_db.txt
index 74ee577a1..4c5fffee0 100644
--- a/db/skill_db.txt
+++ b/db/skill_db.txt
@@ -502,7 +502,7 @@
480,4,8,1,0,0,0,5,5,no,0,0,0,weapon,0 //PA_SHIELDCHAIN#Shield Chain#
481,0,0,0,0,0,0,5,0,no,0,0,0,none,0 //HP_MANARECHARGE#Mana Recharge#
482,0,6,4,0,1,0,5,1,no,0,0,0,magic,0 //PF_DOUBLECASTING#Double Casting#
-483,9,6,2,0,1,0,1,1,no,0,0,0,none,0 //HW_GANBANTEIN#Ganbantein#
+483,9,6,2,0,1,1,1,1,no,0,0,0,none,0 //HW_GANBANTEIN#Ganbantein#
484,9,6,2,2,1,0,5,1,yes,0,0,0,magic,0 //HW_GRAVITATION#Gravity Field#
485,-2,6,1,-1,0,0,10,1,no,0,0,0,weapon,0 //WS_CARTTERMINATION#Cart Termination#
486,0,6,4,0,1,0,5,1,no,0,0,0,weapon,0 //WS_OVERTHRUSTMAX#Maximum Power Thrust#
diff --git a/src/map/battle.c b/src/map/battle.c
index ace030d10..22778f836 100644
--- a/src/map/battle.c
+++ b/src/map/battle.c
@@ -3489,7 +3489,7 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f
return -1; //Cannot be targeted yet.
if (sd->state.monster_ignore && src->type == BL_MOB)
return 0; //option to have monsters ignore GMs [Valaris]
- if (sd->special_state.killable)
+ if (sd->special_state.killable && t_bl != s_bl)
{
state |= BCT_ENEMY; //Universal Victim
strip_enemy = 0;
@@ -3544,7 +3544,7 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f
case BL_PC:
{
struct map_session_data *sd = (struct map_session_data *) s_bl;
- if (sd->special_state.killer)
+ if (sd->special_state.killer && s_bl != t_bl)
{
state |= BCT_ENEMY; //Is on a killing rampage :O
strip_enemy = 0;
diff --git a/src/map/guild.c b/src/map/guild.c
index 364f676e7..792cb821b 100644
--- a/src/map/guild.c
+++ b/src/map/guild.c
@@ -1225,7 +1225,7 @@ void guild_block_skill(struct map_session_data *sd, int time) {
int skill_num[] = { GD_BATTLEORDER, GD_REGENERATION, GD_RESTORE, GD_EMERGENCYCALL };
int i;
for (i = 0; i < 4; i++)
- pc_blockskill_start(sd, skill_num[i], time);
+ skill_blockpc_start(sd, skill_num[i], time);
}
// 同盟関係かどうかチェック
diff --git a/src/map/map.c b/src/map/map.c
index 9c9e99d5f..f6820de9f 100644
--- a/src/map/map.c
+++ b/src/map/map.c
@@ -1586,6 +1586,8 @@ int map_quit(struct map_session_data *sd) {
status_change_end(&sd->bl,SC_STRIPHELM,-1);
if(sd->sc.data[SC_EXTREMITYFIST].timer!=-1)
status_change_end(&sd->bl,SC_EXTREMITYFIST,-1);
+ if(sd->sc.data[SC_EXPLOSIONSPIRITS].timer!=-1)
+ status_change_end(&sd->bl,SC_EXPLOSIONSPIRITS,-1);
}
}
skill_clear_unitgroup(&sd->bl); // スキルユニットグル?プの削除
diff --git a/src/map/pc.c b/src/map/pc.c
index 970f2b347..46357f59a 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -1519,8 +1519,10 @@ int pc_bonus(struct map_session_data *sd,int type,int val)
sd->special_state.no_gemstone = 1;
break;
case SP_INFINITE_ENDURE:
- if(sd->state.lr_flag != 2)
+ if(sd->state.lr_flag != 2) {
sd->special_state.infinite_endure = 1;
+ sc_start(&sd->bl, SC_ENDURE,100,1,0);
+ }
break;
case SP_INTRAVISION: // Maya Purple Card effect allowing to see Hiding/Cloaking people [DracoRPG]
if(sd->state.lr_flag != 2)
@@ -2189,33 +2191,6 @@ int pc_skill(struct map_session_data *sd,int id,int level,int flag)
return 0;
}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int pc_blockskill_end(int tid,unsigned int tick,int id,int data)
-{
- struct map_session_data *sd = map_id2sd(id);
- if (data <= 0 || data >= MAX_SKILL)
- return 0;
- if (sd) sd->blockskill[data] = 0;
-
- return 1;
-}
-int pc_blockskill_start (struct map_session_data *sd, int skillid, int tick)
-{
- nullpo_retr (-1, sd);
-
- if (skillid >= 10000 && skillid < 10015)
- skillid -= 9500;
- else if (skillid < 1 || skillid > MAX_SKILL)
- return -1;
-
- sd->blockskill[skillid] = 1;
- return add_timer(gettick()+tick,pc_blockskill_end,sd->bl.id,skillid);
-}
-
/*==========================================
* カ?ド?入
*------------------------------------------
@@ -8276,7 +8251,6 @@ int do_init_pc(void) {
add_timer_func_list(pc_calc_pvprank_timer, "pc_calc_pvprank_timer");
add_timer_func_list(pc_autosave, "pc_autosave");
add_timer_func_list(pc_spiritball_timer, "pc_spiritball_timer");
- add_timer_func_list(pc_blockskill_end, "pc_blockskill_end");
add_timer_func_list(pc_follow_timer, "pc_follow_timer");
natural_heal_prev_tick = gettick();
add_timer_interval(natural_heal_prev_tick + NATURAL_HEAL_INTERVAL, pc_natural_heal, 0, 0, NATURAL_HEAL_INTERVAL);
diff --git a/src/map/pc.h b/src/map/pc.h
index a1b82dd15..66591adc8 100644
--- a/src/map/pc.h
+++ b/src/map/pc.h
@@ -94,8 +94,6 @@ int pc_bonus3(struct map_session_data *sd,int,int,int,int);
int pc_bonus4(struct map_session_data *sd,int,int,int,int,int);
int pc_skill(struct map_session_data*,int,int,int);
-int pc_blockskill_start (struct map_session_data*,int,int); // [celest]
-
int pc_insert_card(struct map_session_data *sd,int idx_card,int idx_equip);
int pc_steal_item(struct map_session_data *sd,struct block_list *bl);
diff --git a/src/map/skill.c b/src/map/skill.c
index 3edd9d474..44ac95464 100644
--- a/src/map/skill.c
+++ b/src/map/skill.c
@@ -1211,7 +1211,7 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, int
break;
case CR_ACIDDEMONSTRATION:
- skill_break_equip(bl, EQP_WEAPON|EQP_SHIELD, 100*skilllv, BCT_ENEMY);
+ skill_break_equip(bl, EQP_WEAPON|EQP_ARMOR, 100*skilllv, BCT_ENEMY);
break;
case TK_DOWNKICK:
@@ -2816,7 +2816,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl,int s
clif_skill_nodamage (src,bl,skillid,skilllv,
sc_start4(src,SC_WATK_ELEMENT,100,
3,20,0,0,skill_get_time2(skillid, skilllv)));
- if (sd) pc_blockskill_start (sd, skillid, skill_get_time(skillid, skilllv));
+ if (sd) skill_blockpc_start (sd, skillid, skill_get_time(skillid, skilllv));
}
break;
@@ -3057,7 +3057,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl,int s
clif_updatestatus(sd,SP_SP);
}
}
- if (sd) pc_blockskill_start (sd, skillid, (skilllv < 5 ? 10000: 15000));
+ if (sd) skill_blockpc_start (sd, skillid, (skilllv < 5 ? 10000: 15000));
break;
/* HP吸?/HP吸?魔法 */
@@ -3711,7 +3711,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
//Initiate 10% of your damage becomes fire element.
clif_skill_nodamage (src,src,skillid,skilllv,
sc_start4(src,SC_WATK_ELEMENT,100,3,20,0,0,skill_get_time2(skillid, skilllv)));
- if (sd) pc_blockskill_start (sd, skillid, skill_get_time(skillid, skilllv));
+ if (sd) skill_blockpc_start (sd, skillid, skill_get_time(skillid, skilllv));
break;
case LK_BERSERK: /* バ?サ?ク */
case KN_AUTOCOUNTER: /* オ?トカウンタ? */
@@ -3784,7 +3784,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
clif_skill_nodamage(src,bl,skillid,skilllv,
sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv)));
if (sd)
- pc_blockskill_start (sd, skillid, skill_get_time2(skillid,skilllv));
+ skill_blockpc_start (sd, skillid, skill_get_time2(skillid,skilllv));
break;
case AS_ENCHANTPOISON: // Prevent spamming [Valaris]
@@ -5282,6 +5282,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
hp = hp * (100 + pc_checkskill(dstsd,SM_RECOVERY)*10)/100;
}
tbl.id = 0;
+ tbl.type = BL_NUL;
tbl.m = src->m;
tbl.x = src->x;
tbl.y = src->y;
@@ -6062,7 +6063,7 @@ int skill_castend_pos2( struct block_list *src, int x,int y,int skillid,int skil
case MO_BODYRELOCATION:
if (sd) {
pc_movepos(sd, x, y, 1);
- pc_blockskill_start (sd, MO_EXTREMITYFIST, 2000);
+ skill_blockpc_start (sd, MO_EXTREMITYFIST, 2000);
} else if (src->type == BL_MOB) {
struct mob_data *md = (struct mob_data *)src;
mob_warp(md, -1, x, y, 0);
@@ -6935,14 +6936,17 @@ int skill_unit_onplace_timer(struct skill_unit *src,struct block_list *bl,unsign
case UNT_SPIDERWEB:
case UNT_ANKLESNARE:
- if(sg->val2==0 && (!tsc || tsc->data[type].timer==-1 )){
+ if(sg->val2==0 && tsc && tsc->data[type].timer==-1){
int sec = skill_get_time2(sg->skill_id,sg->skill_lv);
if (sc_start(bl,type,100,sg->skill_lv,sec))
{
+ struct TimerData* td = get_timer(tsc->data[type].timer);
+ if (td) sec = DIFF_TICK(td->tick, tick);
map_moveblock(bl, src->bl.x, src->bl.y, tick);
clif_fixpos(bl);
sg->val2=bl->id;
- }
+ } else
+ sec = 3000; //Couldn't trap it?
//clif_01ac(&src->bl); //Removed? Check the openkore description of this packet: [Skotlex]
// 01AC: long ID
// Indicates that an object is trapped, but ID is not a
@@ -8005,6 +8009,7 @@ int skill_check_condition(struct map_session_data *sd,int type)
case HW_GANBANTEIN:
force_gem_flag = 1;
break;
+ case AM_BERSERKPITCHER:
case AM_POTIONPITCHER:
case CR_SLIMPITCHER:
case MG_STONECURSE:
@@ -10926,6 +10931,33 @@ int skill_arrow_create( struct map_session_data *sd,int nameid)
return 0;
}
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int skill_blockpc_end(int tid,unsigned int tick,int id,int data)
+{
+ struct map_session_data *sd = map_id2sd(id);
+ if (data <= 0 || data >= MAX_SKILL)
+ return 0;
+ if (sd) sd->blockskill[data] = 0;
+
+ return 1;
+}
+int skill_blockpc_start(struct map_session_data *sd, int skillid, int tick)
+{
+ nullpo_retr (-1, sd);
+
+ if (skillid >= GD_SKILLBASE)
+ skillid = GD_SKILLRANGEMIN + skillid - GD_SKILLBASE;
+ if (skillid < 1 || skillid > MAX_SKILL)
+ return -1;
+
+ sd->blockskill[skillid] = 1;
+ return add_timer(gettick()+tick,skill_blockpc_end,sd->bl.id,skillid);
+}
+
+
/*----------------------------------------------------------------------------
* ?炎化系
*/
@@ -11661,6 +11693,7 @@ int do_init_skill(void)
add_timer_func_list(skill_castend_id,"skill_castend_id");
add_timer_func_list(skill_castend_pos,"skill_castend_pos");
add_timer_func_list(skill_timerskill,"skill_timerskill");
+ add_timer_func_list(skill_blockpc_end, "skill_blockpc_end");
add_timer_interval(gettick()+SKILLUNITTIMER_INVERVAL,skill_unit_timer,0,0,SKILLUNITTIMER_INVERVAL);
diff --git a/src/map/skill.h b/src/map/skill.h
index 0939d6f9e..bdb545d22 100644
--- a/src/map/skill.h
+++ b/src/map/skill.h
@@ -241,6 +241,8 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag );
int skill_castend_pos2( struct block_list *src, int x,int y,int skillid,int skilllv,unsigned int tick,int flag);
+int skill_blockpc_start (struct map_session_data*,int,int); // [celest]
+
// スキル攻?一括?理
int skill_attack( int attack_type, struct block_list* src, struct block_list *dsrc,
struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag );
diff --git a/src/map/status.c b/src/map/status.c
index 452f57ed5..c8c022c55 100644
--- a/src/map/status.c
+++ b/src/map/status.c
@@ -156,7 +156,7 @@ void initChangeTables(void) {
set_sc(AM_CP_ARMOR, SC_CP_ARMOR, SI_CP_ARMOR);
set_sc(AM_CP_HELM, SC_CP_HELM, SI_CP_HELM);
set_sc(CR_AUTOGUARD, SC_AUTOGUARD, SI_AUTOGUARD);
- set_sc(CR_SHIELDCHARGE, SC_STUN, SI_AUTOGUARD);
+ set_sc(CR_SHIELDCHARGE, SC_STUN, SI_BLANK);
set_sc(CR_REFLECTSHIELD, SC_REFLECTSHIELD, SI_REFLECTSHIELD);
set_sc(CR_HOLYCROSS, SC_BLIND, SI_BLANK);
set_sc(CR_GRANDCROSS, SC_BLIND, SI_BLANK);