Compare commits

...

11 Commits

Author SHA1 Message Date
Aleos
0afc77f91b
Merge branch 'master' into feature/blocking_play 2020-09-10 08:26:20 -04:00
aleos
039645edfe Small cleanup 2020-08-13 11:24:20 -04:00
Aleos
55cef01a39
Merge branch 'master' into feature/blocking_play 2020-08-13 11:19:44 -04:00
aleos
9776c668a3 Minor cleanups 2020-08-05 11:42:45 -04:00
Aleos
9d99e07c7b
Merge branch 'master' into feature/blocking_play 2020-08-05 11:18:59 -04:00
aleos
428e0c3744 Merge branch 'master' into feature/blocking_play 2020-06-22 10:30:31 -04:00
Aleos
d1d1a196ea
Adds a warping state check
Thanks to @Lemongrass3110!
2020-04-30 08:54:20 -04:00
Aleos
506cf4fbdd
Merge branch 'master' into feature/blocking_play 2020-04-30 08:51:56 -04:00
Aleos
063d8503ee
Merge branch 'master' into feature/blocking_play 2018-11-16 08:46:32 -05:00
Lemongrass3110
3409709718 Added missing SC definition 2018-10-31 09:55:30 +01:00
aleos89
3b1824fef5 Implemented Blocking Play feature
* Adds the SC_BLOCKING_PLAY status that keeps players from moving, using/picking/dropping items, using skills, chatting, and swapping equipment while changing maps.
* Disables the ability for players to pre-cast skills when changing maps to avoid cast times.
Thanks to @mrjnumber1!
2018-10-30 14:14:19 -04:00
10 changed files with 50 additions and 12 deletions

View File

@ -183,3 +183,8 @@ mail_delay: 1000
// Hides items from the player's favorite tab from being sold to a NPC. (Note 1) // Hides items from the player's favorite tab from being sold to a NPC. (Note 1)
hide_fav_sell: no hide_fav_sell: no
// Block the player from moving, using/picking/dropping items, using skills, chatting, and swapping equipment while changing maps.
// Disables the ability for players to pre-cast skills when changing maps to avoid cast times.
// Duration is in milliseconds. Set to 0 to disable.
blocking_play_delay: 20000

View File

@ -2687,10 +2687,6 @@ SC_GVG_BLIND (EFST_GVG_BLIND)
val1: Amount of HP that are instantly consumed val1: Amount of HP that are instantly consumed
val2: Amount of SP that are instantly consumed val2: Amount of SP that are instantly consumed
SC_EXTREMITYFIST2 ()
desc:
val1:
SC_LHZ_DUN_N1 (EFST_LHZ_DUN_N1) SC_LHZ_DUN_N1 (EFST_LHZ_DUN_N1)
desc: Increases damage against Swordman, Thief and reduces damage taken from Acolyte, Merchant monsters of Biolab 5 (except MVPs). desc: Increases damage against Swordman, Thief and reduces damage taken from Acolyte, Merchant monsters of Biolab 5 (except MVPs).
val1: +% Damage val1: +% Damage
@ -2716,3 +2712,11 @@ SC_DORAM_BUF_01 ()
SC_DORAM_BUF_02 () SC_DORAM_BUF_02 ()
desc: Recovers 5 SP every 10 seconds. desc: Recovers 5 SP every 10 seconds.
SC_BLOCKING_PLAY (EFST_BLOCKING_PLAY)
desc: Keeps players from moving, using/picking/dropping items, using skills, chatting, and swapping equipment while changing maps.
val1: N/A
SC_EXTREMITYFIST2 ()
desc:
val1:

View File

@ -9011,6 +9011,7 @@ static const struct _battle_data {
{ "homunculus_starving_rate", &battle_config.homunculus_starving_rate, 10, 0, 100, }, { "homunculus_starving_rate", &battle_config.homunculus_starving_rate, 10, 0, 100, },
{ "homunculus_starving_delay", &battle_config.homunculus_starving_delay, 20000, 0, INT_MAX, }, { "homunculus_starving_delay", &battle_config.homunculus_starving_delay, 20000, 0, INT_MAX, },
{ "drop_connection_on_quit", &battle_config.drop_connection_on_quit, 0, 0, 1, }, { "drop_connection_on_quit", &battle_config.drop_connection_on_quit, 0, 0, 1, },
{ "blocking_play_delay", &battle_config.blocking_play_delay, 20000, 0, INT_MAX, },
#include "../custom/battle_config_init.inc" #include "../custom/battle_config_init.inc"
}; };

View File

@ -689,6 +689,7 @@ struct Battle_Config
int homunculus_starving_rate; int homunculus_starving_rate;
int homunculus_starving_delay; int homunculus_starving_delay;
int drop_connection_on_quit; int drop_connection_on_quit;
int blocking_play_delay;
#include "../custom/battle_config_struct.inc" #include "../custom/battle_config_struct.inc"
}; };

View File

@ -19244,6 +19244,7 @@ static void clif_loadConfirm( struct map_session_data *sd ){
clif_send( &p, sizeof(p), &sd->bl, SELF ); clif_send( &p, sizeof(p), &sd->bl, SELF );
status_change_end(&sd->bl, SC_BLOCKING_PLAY, INVALID_TIMER);
if (sd->instance_id > 0) if (sd->instance_id > 0)
instance_reqinfo(sd, sd->instance_id); instance_reqinfo(sd, sd->instance_id);
if (sd->status.party_id > 0) if (sd->status.party_id > 0)
@ -19255,9 +19256,12 @@ static void clif_loadConfirm( struct map_session_data *sd ){
#endif #endif
} }
/// unknown usage (CZ_BLOCKING_PLAY_CANCEL) /// Enable playing abilities of a player if map is done loading.
/// 0447 /// 0447 (CZ_BLOCKING_PLAY_CANCEL)
void clif_parse_blocking_playcancel( int fd, struct map_session_data *sd ){ void clif_parse_blocking_playcancel( int fd, struct map_session_data *sd ){
nullpo_retv(sd);
if (sd->state.warping == 0)
clif_loadConfirm(sd); clif_loadConfirm(sd);
} }

View File

@ -5947,6 +5947,10 @@ enum e_setpos pc_setpos(struct map_session_data* sd, unsigned short mapindex, in
bg_team_leave(sd, false, true); bg_team_leave(sd, false, true);
sd->state.pmap = sd->bl.m; sd->state.pmap = sd->bl.m;
if (battle_config.blocking_play_delay > 0)
sc_start(&sd->bl, &sd->bl, SC_BLOCKING_PLAY, 100, 0, battle_config.blocking_play_delay);
if (sc && sc->count) { // Cancel some map related stuff. if (sc && sc->count) { // Cancel some map related stuff.
if (sc->data[SC_JAILED]) if (sc->data[SC_JAILED])
return SETPOS_MAPINDEX; //You may not get out! return SETPOS_MAPINDEX; //You may not get out!
@ -10464,7 +10468,7 @@ bool pc_equipitem(struct map_session_data *sd,short n,int req_pos,bool equipswit
return false; return false;
} }
if( sd->sc.count && (sd->sc.data[SC_BERSERK] || sd->sc.data[SC_SATURDAYNIGHTFEVER] || if( sd->sc.count && (sd->sc.data[SC_BERSERK] || sd->sc.data[SC_SATURDAYNIGHTFEVER] ||
sd->sc.data[SC_KYOUGAKU] || (sd->sc.data[SC_PYROCLASTIC] && sd->inventory_data[n]->type == IT_WEAPON)) ) { sd->sc.data[SC_KYOUGAKU] || (sd->sc.data[SC_PYROCLASTIC] && sd->inventory_data[n]->type == IT_WEAPON)) || sd->sc.data[SC_BLOCKING_PLAY]) {
if( equipswitch ){ if( equipswitch ){
clif_equipswitch_add( sd, n, req_pos, ITEM_EQUIP_ACK_FAIL ); clif_equipswitch_add( sd, n, req_pos, ITEM_EQUIP_ACK_FAIL );
}else{ }else{
@ -10772,8 +10776,8 @@ bool pc_unequipitem(struct map_session_data *sd, int n, int flag) {
sd->sc.data[SC_SATURDAYNIGHTFEVER] || sd->sc.data[SC_SATURDAYNIGHTFEVER] ||
sd->sc.data[SC__BLOODYLUST] || sd->sc.data[SC__BLOODYLUST] ||
sd->sc.data[SC_KYOUGAKU] || sd->sc.data[SC_KYOUGAKU] ||
(sd->sc.data[SC_PYROCLASTIC] && (sd->sc.data[SC_PYROCLASTIC] && sd->inventory_data[n]->type == IT_WEAPON) || // can't switch weapon
sd->inventory_data[n]->type == IT_WEAPON))) // can't switch weapon sd->sc.data[SC_BLOCKING_PLAY]))
{ {
clif_unequipitemack(sd,n,0,0); clif_unequipitemack(sd,n,0,0);
return false; return false;

View File

@ -1593,6 +1593,7 @@
export_constant(SC_EP16_2_BUFF_SS); export_constant(SC_EP16_2_BUFF_SS);
export_constant(SC_EP16_2_BUFF_SC); export_constant(SC_EP16_2_BUFF_SC);
export_constant(SC_EP16_2_BUFF_AC); export_constant(SC_EP16_2_BUFF_AC);
export_constant(SC_BLOCKING_PLAY);
#ifdef RENEWAL #ifdef RENEWAL
export_constant(SC_EXTREMITYFIST2); export_constant(SC_EXTREMITYFIST2);
#endif #endif

View File

@ -2028,6 +2028,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
case SC_ENTRY_QUEUE_APPLY_DELAY: case SC_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT: case SC_ENTRY_QUEUE_APPLY_DELAY: case SC_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT:
case SC_REUSE_LIMIT_LUXANIMA: case SC_LUXANIMA: case SC_SOULENERGY: case SC_REUSE_LIMIT_LUXANIMA: case SC_LUXANIMA: case SC_SOULENERGY:
case SC_EP16_2_BUFF_SS: case SC_EP16_2_BUFF_SC: case SC_EP16_2_BUFF_AC: case SC_EP16_2_BUFF_SS: case SC_EP16_2_BUFF_SC: case SC_EP16_2_BUFF_AC:
case SC_BLOCKING_PLAY:
continue; continue;
case SC_WHISTLE: case SC_ASSNCROS: case SC_POEMBRAGI: case SC_WHISTLE: case SC_ASSNCROS: case SC_POEMBRAGI:
case SC_APPLEIDUN: case SC_HUMMING: case SC_DONTFORGETME: case SC_APPLEIDUN: case SC_HUMMING: case SC_DONTFORGETME:
@ -8477,6 +8478,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case SC_LHZ_DUN_N1: case SC_LHZ_DUN_N2: case SC_LHZ_DUN_N3: case SC_LHZ_DUN_N4: case SC_LHZ_DUN_N1: case SC_LHZ_DUN_N2: case SC_LHZ_DUN_N3: case SC_LHZ_DUN_N4:
case SC_REUSE_LIMIT_LUXANIMA: case SC_LUXANIMA: case SC_SOULENERGY: case SC_REUSE_LIMIT_LUXANIMA: case SC_LUXANIMA: case SC_SOULENERGY:
case SC_EP16_2_BUFF_SS: case SC_EP16_2_BUFF_SC: case SC_EP16_2_BUFF_AC: case SC_EP16_2_BUFF_SS: case SC_EP16_2_BUFF_SC: case SC_EP16_2_BUFF_AC:
case SC_BLOCKING_PLAY:
continue; continue;
case SC_WHISTLE: case SC_WHISTLE:
case SC_ASSNCROS: case SC_ASSNCROS:
@ -9971,6 +9973,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case SC_ENTRY_QUEUE_APPLY_DELAY: case SC_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT: case SC_ENTRY_QUEUE_APPLY_DELAY: case SC_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT:
case SC_REUSE_LIMIT_LUXANIMA: case SC_LUXANIMA: case SC_SOULENERGY: case SC_REUSE_LIMIT_LUXANIMA: case SC_LUXANIMA: case SC_SOULENERGY:
case SC_EP16_2_BUFF_SS: case SC_EP16_2_BUFF_SC: case SC_EP16_2_BUFF_AC: case SC_EP16_2_BUFF_SS: case SC_EP16_2_BUFF_SC: case SC_EP16_2_BUFF_AC:
case SC_BLOCKING_PLAY:
continue; continue;
case SC_ASSUMPTIO: case SC_ASSUMPTIO:
if( bl->type == BL_MOB ) if( bl->type == BL_MOB )

View File

@ -1398,6 +1398,8 @@ void initChangeTables(void)
StatusIconChangeTable[SC_EP16_2_BUFF_SC] = EFST_EP16_2_BUFF_SC; StatusIconChangeTable[SC_EP16_2_BUFF_SC] = EFST_EP16_2_BUFF_SC;
StatusIconChangeTable[SC_EP16_2_BUFF_AC] = EFST_EP16_2_BUFF_AC; StatusIconChangeTable[SC_EP16_2_BUFF_AC] = EFST_EP16_2_BUFF_AC;
StatusIconChangeTable[SC_BLOCKING_PLAY] = EFST_BLOCKING_PLAY;
/* Other SC which are not necessarily associated to skills */ /* Other SC which are not necessarily associated to skills */
StatusChangeFlagTable[SC_ASPDPOTION0] |= SCB_ASPD; StatusChangeFlagTable[SC_ASPDPOTION0] |= SCB_ASPD;
StatusChangeFlagTable[SC_ASPDPOTION1] |= SCB_ASPD; StatusChangeFlagTable[SC_ASPDPOTION1] |= SCB_ASPD;
@ -1584,6 +1586,8 @@ void initChangeTables(void)
StatusChangeFlagTable[SC_EDP] |= SCB_WATK; StatusChangeFlagTable[SC_EDP] |= SCB_WATK;
#endif #endif
StatusChangeFlagTable[SC_BLOCKING_PLAY] |= SCB_NONE;
/* StatusDisplayType Table [Ind] */ /* StatusDisplayType Table [Ind] */
StatusDisplayType[SC_ALL_RIDING] = BL_PC; StatusDisplayType[SC_ALL_RIDING] = BL_PC;
StatusDisplayType[SC_PUSH_CART] = BL_PC; StatusDisplayType[SC_PUSH_CART] = BL_PC;
@ -1683,6 +1687,7 @@ void initChangeTables(void)
StatusChangeStateTable[SC_SUHIDE] |= SCS_NOMOVE; StatusChangeStateTable[SC_SUHIDE] |= SCS_NOMOVE;
StatusChangeStateTable[SC_SV_ROOTTWIST] |= SCS_NOMOVE; StatusChangeStateTable[SC_SV_ROOTTWIST] |= SCS_NOMOVE;
StatusChangeStateTable[SC_GRAVITYCONTROL] |= SCS_NOMOVE; StatusChangeStateTable[SC_GRAVITYCONTROL] |= SCS_NOMOVE;
StatusChangeStateTable[SC_BLOCKING_PLAY] |= SCS_NOMOVE;
/* StatusChangeState (SCS_) NOPICKUPITEMS */ /* StatusChangeState (SCS_) NOPICKUPITEMS */
StatusChangeStateTable[SC_HIDING] |= SCS_NOPICKITEM; StatusChangeStateTable[SC_HIDING] |= SCS_NOPICKITEM;
@ -1694,11 +1699,13 @@ void initChangeTables(void)
StatusChangeStateTable[SC_NOCHAT] |= SCS_NOPICKITEM|SCS_NOPICKITEMCOND; StatusChangeStateTable[SC_NOCHAT] |= SCS_NOPICKITEM|SCS_NOPICKITEMCOND;
StatusChangeStateTable[SC_SUHIDE] |= SCS_NOPICKITEM; StatusChangeStateTable[SC_SUHIDE] |= SCS_NOPICKITEM;
StatusChangeStateTable[SC_NEWMOON] |= SCS_NOPICKITEM; StatusChangeStateTable[SC_NEWMOON] |= SCS_NOPICKITEM;
StatusChangeStateTable[SC_BLOCKING_PLAY] |= SCS_NOPICKITEM;
/* StatusChangeState (SCS_) NODROPITEMS */ /* StatusChangeState (SCS_) NODROPITEMS */
StatusChangeStateTable[SC_AUTOCOUNTER] |= SCS_NODROPITEM; StatusChangeStateTable[SC_AUTOCOUNTER] |= SCS_NODROPITEM;
StatusChangeStateTable[SC_BLADESTOP] |= SCS_NODROPITEM; StatusChangeStateTable[SC_BLADESTOP] |= SCS_NODROPITEM;
StatusChangeStateTable[SC_NOCHAT] |= SCS_NODROPITEM|SCS_NODROPITEMCOND; StatusChangeStateTable[SC_NOCHAT] |= SCS_NODROPITEM|SCS_NODROPITEMCOND;
StatusChangeStateTable[SC_BLOCKING_PLAY] |= SCS_NODROPITEM;
/* StatusChangeState (SCS_) NOCAST (skills) */ /* StatusChangeState (SCS_) NOCAST (skills) */
StatusChangeStateTable[SC_SILENCE] |= SCS_NOCAST; StatusChangeStateTable[SC_SILENCE] |= SCS_NOCAST;
@ -1723,12 +1730,14 @@ void initChangeTables(void)
StatusChangeStateTable[SC_CURSEDCIRCLE_TARGET] |= SCS_NOCAST; StatusChangeStateTable[SC_CURSEDCIRCLE_TARGET] |= SCS_NOCAST;
StatusChangeStateTable[SC_KINGS_GRACE] |= SCS_NOCAST; StatusChangeStateTable[SC_KINGS_GRACE] |= SCS_NOCAST;
StatusChangeStateTable[SC_GRAVITYCONTROL] |= SCS_NOCAST; StatusChangeStateTable[SC_GRAVITYCONTROL] |= SCS_NOCAST;
StatusChangeStateTable[SC_BLOCKING_PLAY] |= SCS_NOCAST;
/* StatusChangeState (SCS_) NOCHAT (skills) */ /* StatusChangeState (SCS_) NOCHAT (skills) */
StatusChangeStateTable[SC_BERSERK] |= SCS_NOCHAT; StatusChangeStateTable[SC_BERSERK] |= SCS_NOCHAT;
StatusChangeStateTable[SC_SATURDAYNIGHTFEVER] |= SCS_NOCHAT; StatusChangeStateTable[SC_SATURDAYNIGHTFEVER] |= SCS_NOCHAT;
StatusChangeStateTable[SC_DEEPSLEEP] |= SCS_NOCHAT; StatusChangeStateTable[SC_DEEPSLEEP] |= SCS_NOCHAT;
StatusChangeStateTable[SC_NOCHAT] |= SCS_NOCHAT|SCS_NOCHATCOND; StatusChangeStateTable[SC_NOCHAT] |= SCS_NOCHAT|SCS_NOCHATCOND;
StatusChangeStateTable[SC_BLOCKING_PLAY] |= SCS_NOCHAT;
} }
static void initDummyData(void) static void initDummyData(void)
@ -10166,6 +10175,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
case SC_DORAM_BUF_01: case SC_DORAM_BUF_01:
case SC_DORAM_BUF_02: case SC_DORAM_BUF_02:
case SC_REUSE_LIMIT_LUXANIMA: case SC_REUSE_LIMIT_LUXANIMA:
case SC_BLOCKING_PLAY:
return 0; return 0;
case SC_PUSH_CART: case SC_PUSH_CART:
case SC_COMBO: case SC_COMBO:
@ -12916,6 +12926,7 @@ int status_change_clear(struct block_list* bl, int type)
case SC_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT: case SC_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT:
case SC_REUSE_LIMIT_LUXANIMA: case SC_REUSE_LIMIT_LUXANIMA:
case SC_SOULENERGY: case SC_SOULENERGY:
case SC_BLOCKING_PLAY:
// Costumes // Costumes
case SC_MOONSTAR: case SC_MOONSTAR:
case SC_SUPER_STAR: case SC_SUPER_STAR:
@ -12952,6 +12963,7 @@ int status_change_clear(struct block_list* bl, int type)
case SC_STYLE_CHANGE: case SC_STYLE_CHANGE:
case SC_ENTRY_QUEUE_APPLY_DELAY: case SC_ENTRY_QUEUE_APPLY_DELAY:
case SC_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT: case SC_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT:
case SC_BLOCKING_PLAY:
// Costumes // Costumes
case SC_MOONSTAR: case SC_MOONSTAR:
case SC_SUPER_STAR: case SC_SUPER_STAR:
@ -15069,6 +15081,7 @@ void status_change_clear_buffs(struct block_list* bl, uint8 type)
case SC_EP16_2_BUFF_SS: case SC_EP16_2_BUFF_SS:
case SC_EP16_2_BUFF_SC: case SC_EP16_2_BUFF_SC:
case SC_EP16_2_BUFF_AC: case SC_EP16_2_BUFF_AC:
case SC_BLOCKING_PLAY:
// Clans // Clans
case SC_CLAN_INFO: case SC_CLAN_INFO:
case SC_SWORDCLAN: case SC_SWORDCLAN:

View File

@ -937,6 +937,8 @@ enum sc_type : int16 {
SC_EP16_2_BUFF_SC, SC_EP16_2_BUFF_SC,
SC_EP16_2_BUFF_AC, SC_EP16_2_BUFF_AC,
SC_BLOCKING_PLAY,
#ifdef RENEWAL #ifdef RENEWAL
SC_EXTREMITYFIST2, //! NOTE: This SC should be right before SC_MAX, so it doesn't disturb if RENEWAL is disabled SC_EXTREMITYFIST2, //! NOTE: This SC should be right before SC_MAX, so it doesn't disturb if RENEWAL is disabled
#endif #endif