diff --git a/db/const.txt b/db/const.txt index 76926dcdd0..55f6c58365 100644 --- a/db/const.txt +++ b/db/const.txt @@ -380,6 +380,7 @@ mf_nolockon 58 mf_notomb 59 mf_skill_damage 60 +//'setcell' types cell_walkable 0 cell_shootable 1 cell_water 2 @@ -388,6 +389,8 @@ cell_basilica 4 cell_landprotector 5 cell_novending 6 cell_nochat 7 +cell_malestrom 8 +cell_icewall 9 //cell_gettype 0 cell_chkwall 1 @@ -403,6 +406,8 @@ cell_chkbasilica 10 cell_chklandprotector 11 cell_chknovending 12 cell_chknochat 13 +cell_chkmaelstrom 14 +cell_chkicewall 15 StatusPoint 9 1 BaseLevel 11 1 diff --git a/doc/script_commands.txt b/doc/script_commands.txt index 8dda02d2ba..c62e5a0932 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -7230,8 +7230,7 @@ Each of these can be 'on' or 'off'. Together they define a cell's behavior. This command lets you alter these flags for all map cells in the specified (x1,y1)-(x2,y2) rectangle. The 'flag' can be 0 or 1 (0:clear flag, 1:set flag). -The 'type' defines which flag to modify. Possible options include cell_walkable, -cell_shootable, cell_basilica. For a full list, see const.txt. +The 'type' defines which flag to modify. Possible options see const.txt. Example: diff --git a/src/map/pc.c b/src/map/pc.c index 0455482c66..4cfdfa62a9 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -4990,6 +4990,7 @@ int pc_setpos(struct map_session_data* sd, unsigned short mapindex, int x, int y sd->md->ud.dir = sd->ud.dir; } + pc_cell_basilica(sd); return 0; } @@ -10463,6 +10464,22 @@ void pc_bonus_script_check(struct map_session_data *sd, enum e_bonus_script_flag status_calc_pc(sd,false); } +/** [Cydh] + * Gives/removes SC_BASILICA when player steps in/out the cell with 'cell_basilica' + * @param sd player + */ +void pc_cell_basilica(struct map_session_data *sd) { + if (!sd) + return; + + if (!map_getcell(sd->bl.m,sd->bl.x,sd->bl.y,CELL_CHKBASILICA)) { + if (&sd->sc && sd->sc.data[SC_BASILICA]) + status_change_end(&sd->bl,SC_BASILICA,INVALID_TIMER); + } + else if (!(&sd->sc) || !sd->sc.data[SC_BASILICA]) + sc_start(&sd->bl,&sd->bl,SC_BASILICA,100,0,-1); +} + /*========================================== * pc Init/Terminate *------------------------------------------*/ diff --git a/src/map/pc.h b/src/map/pc.h index 59496970a8..d4e27e1584 100644 --- a/src/map/pc.h +++ b/src/map/pc.h @@ -1050,6 +1050,8 @@ int pc_bonus_script_timer(int tid, unsigned int tick, int id, intptr_t data); void pc_bonus_script_remove(struct map_session_data *sd, uint8 i); void pc_bonus_script_check(struct map_session_data *sd, enum e_bonus_script_flags flag); +void pc_cell_basilica(struct map_session_data *sd); + #if defined(RENEWAL_DROP) || defined(RENEWAL_EXP) int pc_level_penalty_mod(struct map_session_data *sd, int mob_level, uint32 mob_race, uint32 mob_mode, int type); #endif diff --git a/src/map/unit.c b/src/map/unit.c index 589ffc3316..e4cfcd363d 100644 --- a/src/map/unit.c +++ b/src/map/unit.c @@ -228,8 +228,8 @@ static int unit_walktoxy_timer(int tid, unsigned int tick, int id, intptr_t data int i; int x,y,dx,dy; uint8 dir; - struct block_list *bl; - struct unit_data *ud; + struct block_list *bl; + struct unit_data *ud; TBL_PC *sd; TBL_MOB *md; TBL_MER *mrd; @@ -301,10 +301,12 @@ static int unit_walktoxy_timer(int tid, unsigned int tick, int id, intptr_t data } else sd->areanpc_id=0; - if( sd->md) unit_check_start_teleport_timer(&sd->md->bl); - if( sd->ed) unit_check_start_teleport_timer(&sd->ed->bl); - if( sd->hd) unit_check_start_teleport_timer(&sd->hd->bl); - if( sd->pd) unit_check_start_teleport_timer(&sd->pd->bl); + if(sd->md) unit_check_start_teleport_timer(&sd->md->bl); + if(sd->ed) unit_check_start_teleport_timer(&sd->ed->bl); + if(sd->hd) unit_check_start_teleport_timer(&sd->hd->bl); + if(sd->pd) unit_check_start_teleport_timer(&sd->pd->bl); + + pc_cell_basilica(sd); } else if (md) { if( map_getcell(bl->m,x,y,CELL_CHKNPC) ) { if( npc_touch_areanpc2(md) ) @@ -326,10 +328,10 @@ static int unit_walktoxy_timer(int tid, unsigned int tick, int id, intptr_t data clif_move(ud); } } - else if( hd) unit_check_start_teleport_timer(&hd->bl); - else if( ed) unit_check_start_teleport_timer(&ed->bl); - else if( pd) unit_check_start_teleport_timer(&pd->bl); - else if( mrd) unit_check_start_teleport_timer(&mrd->bl); + else if (hd) unit_check_start_teleport_timer(&hd->bl); + else if (ed) unit_check_start_teleport_timer(&ed->bl); + else if (pd) unit_check_start_teleport_timer(&pd->bl); + else if (mrd) unit_check_start_teleport_timer(&mrd->bl); if(tid == INVALID_TIMER) // A directly invoked timer is from battle_stop_walking, therefore the rest is irrelevant. return 0;