summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--conf/battle/skill.conf5
-rw-r--r--src/map/battle.c2
-rw-r--r--src/map/battle.h1
-rw-r--r--src/map/pc.c4
-rw-r--r--src/map/status.c9
-rw-r--r--src/map/unit.c8
6 files changed, 28 insertions, 1 deletions
diff --git a/conf/battle/skill.conf b/conf/battle/skill.conf
index 322a4778a..ee995cb1d 100644
--- a/conf/battle/skill.conf
+++ b/conf/battle/skill.conf
@@ -267,3 +267,8 @@ eq_single_target_reflectable: yes
// When this setting is enabled, it allows you to immune to all kinds of damage, including those stated previous.
// (The number will show but no actual damage will be done)
invincible.nodamage: no
+
+// Dancing Weapon Switch
+// On official server, a fix is in place that prevents the switching of weapons to cancel songs.
+// Default: yes
+dancing_weaponswitch_fix: yes \ No newline at end of file
diff --git a/src/map/battle.c b/src/map/battle.c
index 79e7a00b0..e0659ce81 100644
--- a/src/map/battle.c
+++ b/src/map/battle.c
@@ -5309,6 +5309,8 @@ static const struct _battle_data {
{ "buyer_name", &battle_config.buyer_name, 1, 0, 1, },
{ "skill_wall_check", &battle_config.skill_wall_check, 1, 0, 1, },
{ "cell_stack_limit", &battle_config.cell_stack_limit, 1, 1, 255, },
+ { "dancing_weaponswitch_fix", &battle_config.dancing_weaponswitch_fix, 1, 0, 1, },
+
// eAthena additions
{ "item_logarithmic_drops", &battle_config.logarithmic_drops, 0, 0, 1, },
{ "item_drop_common_min", &battle_config.item_drop_common_min, 1, 1, 10000, },
diff --git a/src/map/battle.h b/src/map/battle.h
index 7048e35a8..962ca81a7 100644
--- a/src/map/battle.h
+++ b/src/map/battle.h
@@ -327,6 +327,7 @@ extern struct Battle_Config
int sp_rate;
int bone_drop;
int buyer_name;
+ int dancing_weaponswitch_fix;
// eAthena additions
int night_at_start; // added by [Yor]
diff --git a/src/map/pc.c b/src/map/pc.c
index 459f6ef99..f918ce9ca 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -4805,6 +4805,8 @@ int pc_checkallowskill(struct map_session_data *sd)
for (i = 0; i < ARRAYLENGTH(scw_list); i++)
{ // Skills requiring specific weapon types
+ if( scw_list[i] == SC_DANCING && !battle_config.dancing_weaponswitch_fix )
+ continue;
if(sd->sc.data[scw_list[i]] &&
!pc_check_weapontype(sd,skill_get_weapontype(status_sc2skill(scw_list[i]))))
status_change_end(&sd->bl, scw_list[i], INVALID_TIMER);
@@ -8085,6 +8087,8 @@ int pc_unequipitem(struct map_session_data *sd,int n,int flag)
sd->status.weapon = sd->weapontype2;
pc_calcweapontype(sd);
clif_changelook(&sd->bl,LOOK_WEAPON,sd->status.weapon);
+ if( !battle_config.dancing_weaponswitch_fix )
+ status_change_end(&sd->bl, SC_DANCING, INVALID_TIMER); // Unequipping => stop dancing.
}
if(sd->status.inventory[n].equip & EQP_HAND_L) {
sd->status.shield = sd->weapontype2 = 0;
diff --git a/src/map/status.c b/src/map/status.c
index 1b12c2ae4..80d194774 100644
--- a/src/map/status.c
+++ b/src/map/status.c
@@ -8858,8 +8858,15 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
{// end status on partner as well
dsc = dsd->sc.data[SC_DANCING];
if(dsc)
- { //This will prevent recursive loops.
+ {
+ struct status_change *tsc = status_get_sc(&dsd->bl);
+
+ //This will prevent recursive loops.
dsc->val2 = dsc->val4 = 0;
+
+ // Set cant.move back to 0 to avoid character freezing.
+ tsc->cant.move = 0;
+ sc->cant.move = 0;
status_change_end(&dsd->bl, SC_DANCING, INVALID_TIMER);
}
}
diff --git a/src/map/unit.c b/src/map/unit.c
index 848dd6dea..507bfbb07 100644
--- a/src/map/unit.c
+++ b/src/map/unit.c
@@ -920,6 +920,14 @@ int unit_can_move(struct block_list *bl)
return 0; //Can't move
if (sc) {
+ // Ensemble checks to prevent freezing characters
+ if( sc->cant.move && sc->data[SC_LONGING] && !((sc->data[SC_DANCING]->val1&0xFFFF) == CG_MOONLIT))
+ {
+ // allow movement
+ sc->cant.move = 0;
+ return 1;
+ }
+
if( sc->cant.move || (sc->data[SC_FEAR] && sc->data[SC_FEAR]->val2 > 0) || (sc->data[SC_SPIDERWEB] && sc->data[SC_SPIDERWEB]->val1) )
return 0;