diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/map/atcommand.c | 126 | ||||
-rw-r--r-- | src/map/battle.c | 490 | ||||
-rw-r--r-- | src/map/battleground.c | 39 | ||||
-rw-r--r-- | src/map/chat.c | 30 | ||||
-rw-r--r-- | src/map/chrif.c | 16 | ||||
-rw-r--r-- | src/map/chrif.h | 6 | ||||
-rw-r--r-- | src/map/clif.c | 555 | ||||
-rw-r--r-- | src/map/duel.c | 2 | ||||
-rw-r--r-- | src/map/elemental.c | 3 | ||||
-rw-r--r-- | src/map/guild.c | 26 | ||||
-rw-r--r-- | src/map/guild.h | 6 | ||||
-rw-r--r-- | src/map/homunculus.c | 5 | ||||
-rw-r--r-- | src/map/instance.c | 28 | ||||
-rw-r--r-- | src/map/intif.c | 12 | ||||
-rw-r--r-- | src/map/itemdb.c | 2 | ||||
-rw-r--r-- | src/map/map.c | 311 | ||||
-rw-r--r-- | src/map/map.h | 101 | ||||
-rw-r--r-- | src/map/mercenary.c | 3 | ||||
-rw-r--r-- | src/map/mob.c | 160 | ||||
-rw-r--r-- | src/map/npc.c | 98 | ||||
-rw-r--r-- | src/map/npc_chat.c | 35 | ||||
-rw-r--r-- | src/map/party.c | 30 | ||||
-rw-r--r-- | src/map/party.h | 5 | ||||
-rw-r--r-- | src/map/pc.c | 110 | ||||
-rw-r--r-- | src/map/pc_groups.c | 2 | ||||
-rw-r--r-- | src/map/pet.c | 30 | ||||
-rw-r--r-- | src/map/quest.c | 32 | ||||
-rw-r--r-- | src/map/quest.h | 19 | ||||
-rw-r--r-- | src/map/script.c | 1325 | ||||
-rw-r--r-- | src/map/script.h | 10 | ||||
-rw-r--r-- | src/map/skill.c | 563 | ||||
-rw-r--r-- | src/map/status.c | 1037 | ||||
-rw-r--r-- | src/map/status.h | 7 | ||||
-rw-r--r-- | src/map/unit.c | 132 |
34 files changed, 2988 insertions, 2368 deletions
diff --git a/src/map/atcommand.c b/src/map/atcommand.c index ffd09caeb..9d03dd057 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -609,7 +609,7 @@ ACMD(jump) * various info. *------------------------------------------*/ ACMD(who) { - struct map_session_data *pl_sd = NULL; + const struct map_session_data *pl_sd = NULL; struct s_mapiterator *iter = NULL; char player_name[NAME_LENGTH] = ""; int count = 0; @@ -640,7 +640,7 @@ ACMD(who) { StrBuf->Init(&buf); iter = mapit_getallusers(); - for (pl_sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); pl_sd = (TBL_PC*)mapit->next(iter)) { + for (pl_sd = BL_UCCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); pl_sd = BL_UCCAST(BL_PC, mapit->next(iter))) { if (!((pc_has_permission(pl_sd, PC_PERM_HIDE_SESSION) || pc_isinvisible(pl_sd)) && pc_get_group_level(pl_sd) > level)) { // you can look only lower or same level if (stristr(pl_sd->status.name, player_name) == NULL // search with no case sensitive || (map_id >= 0 && pl_sd->bl.m != map_id)) @@ -709,7 +709,7 @@ ACMD(who) { *------------------------------------------*/ ACMD(whogm) { - struct map_session_data* pl_sd; + const struct map_session_data *pl_sd; struct s_mapiterator* iter; int j, count; int level; @@ -731,7 +731,7 @@ ACMD(whogm) level = pc_get_group_level(sd); iter = mapit_getallusers(); - for (pl_sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); pl_sd = (TBL_PC*)mapit->next(iter)) { + for (pl_sd = BL_UCCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); pl_sd = BL_UCCAST(BL_PC, mapit->next(iter))) { int pl_level = pc_get_group_level(pl_sd); if (!pl_level) continue; @@ -1563,8 +1563,11 @@ int atcommand_stopattack(struct block_list *bl,va_list ap) *------------------------------------------*/ int atcommand_pvpoff_sub(struct block_list *bl,va_list ap) { - TBL_PC* sd = (TBL_PC*)bl; + struct map_session_data *sd = NULL; nullpo_ret(bl); + Assert_ret(bl->type == BL_PC); + sd = BL_UCAST(BL_PC, bl); + clif->pvpset(sd, 0, 0, 2); if (sd->pvp_timer != INVALID_TIMER) { timer->delete(sd->pvp_timer, pc->calc_pvprank_timer); @@ -1598,8 +1601,11 @@ ACMD(pvpoff) *------------------------------------------*/ int atcommand_pvpon_sub(struct block_list *bl,va_list ap) { - TBL_PC* sd = (TBL_PC*)bl; + struct map_session_data *sd = NULL; nullpo_ret(bl); + Assert_ret(bl->type == BL_PC); + sd = BL_UCAST(BL_PC, bl); + if (sd->pvp_timer == INVALID_TIMER) { sd->pvp_timer = timer->add(timer->gettick() + 200, pc->calc_pvprank_timer, sd->bl.id, 0); sd->pvp_rank = 0; @@ -2041,10 +2047,12 @@ ACMD(monster) *------------------------------------------*/ int atkillmonster_sub(struct block_list *bl, va_list ap) { - struct mob_data *md = (struct mob_data *)bl; + struct mob_data *md = NULL; int flag = va_arg(ap, int); - nullpo_ret(bl); + Assert_ret(bl->type == BL_MOB); + md = BL_UCAST(BL_MOB, bl); + if (md->guardian_data) return 0; //Do not touch WoE mobs! @@ -2959,10 +2967,8 @@ ACMD(doom) struct s_mapiterator* iter; iter = mapit_getallusers(); - for( pl_sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); pl_sd = (TBL_PC*)mapit->next(iter) ) - { - if (pl_sd->fd != fd && pc_get_group_level(sd) >= pc_get_group_level(pl_sd)) - { + for (pl_sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); pl_sd = BL_UCAST(BL_PC, mapit->next(iter))) { + if (pl_sd->fd != fd && pc_get_group_level(sd) >= pc_get_group_level(pl_sd)) { status_kill(&pl_sd->bl); clif->specialeffect(&pl_sd->bl,450,AREA); clif->message(pl_sd->fd, msg_fd(fd,61)); // The holy messenger has given judgment. @@ -2984,10 +2990,8 @@ ACMD(doommap) struct s_mapiterator* iter; iter = mapit_getallusers(); - for( pl_sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); pl_sd = (TBL_PC*)mapit->next(iter) ) - { - if (pl_sd->fd != fd && sd->bl.m == pl_sd->bl.m && pc_get_group_level(sd) >= pc_get_group_level(pl_sd)) - { + for (pl_sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); pl_sd = BL_UCAST(BL_PC, mapit->next(iter))) { + if (pl_sd->fd != fd && sd->bl.m == pl_sd->bl.m && pc_get_group_level(sd) >= pc_get_group_level(pl_sd)) { status_kill(&pl_sd->bl); clif->specialeffect(&pl_sd->bl,450,AREA); clif->message(pl_sd->fd, msg_fd(fd,61)); // The holy messenger has given judgment. @@ -3021,7 +3025,7 @@ ACMD(raise) struct s_mapiterator* iter; iter = mapit_getallusers(); - for( pl_sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); pl_sd = (TBL_PC*)mapit->next(iter) ) + for (pl_sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); pl_sd = BL_UCAST(BL_PC, mapit->next(iter))) if( pc_isdead(pl_sd) ) atcommand->raise_sub(pl_sd); mapit->free(iter); @@ -3040,7 +3044,7 @@ ACMD(raisemap) struct s_mapiterator* iter; iter = mapit_getallusers(); - for( pl_sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); pl_sd = (TBL_PC*)mapit->next(iter) ) + for (pl_sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); pl_sd = BL_UCAST(BL_PC, mapit->next(iter))) if (sd->bl.m == pl_sd->bl.m && pc_isdead(pl_sd) ) atcommand->raise_sub(pl_sd); mapit->free(iter); @@ -3089,8 +3093,7 @@ ACMD(kickall) struct s_mapiterator* iter; iter = mapit_getallusers(); - for (pl_sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); pl_sd = (TBL_PC*)mapit->next(iter)) - { + for (pl_sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); pl_sd = BL_UCAST(BL_PC, mapit->next(iter))) { if (pc_get_group_level(sd) >= pc_get_group_level(pl_sd)) { // you can kick only lower or same gm level if (sd->status.account_id != pl_sd->status.account_id) clif->GM_kick(NULL, pl_sd); @@ -3424,7 +3427,7 @@ ACMD(recallall) count = 0; iter = mapit_getallusers(); - for (pl_sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); pl_sd = (TBL_PC*)mapit->next(iter)) { + for (pl_sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); pl_sd = BL_UCAST(BL_PC, mapit->next(iter))) { if (sd->status.account_id != pl_sd->status.account_id && pc_get_group_level(sd) >= pc_get_group_level(pl_sd)) { if (pl_sd->bl.m == sd->bl.m && pl_sd->bl.x == sd->bl.x && pl_sd->bl.y == sd->bl.y) continue; // Don't waste time warping the character to the same place. @@ -3484,8 +3487,7 @@ ACMD(guildrecall) count = 0; iter = mapit_getallusers(); - for (pl_sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); pl_sd = (TBL_PC*)mapit->next(iter)) - { + for (pl_sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); pl_sd = BL_UCAST(BL_PC, mapit->next(iter))) { if (sd->status.account_id != pl_sd->status.account_id && pl_sd->status.guild_id == g->guild_id) { if (pc_get_group_level(pl_sd) > pc_get_group_level(sd) || (pl_sd->bl.m == sd->bl.m && pl_sd->bl.x == sd->bl.x && pl_sd->bl.y == sd->bl.y)) continue; // Skip GMs greater than you... or chars already on the cell @@ -3541,7 +3543,7 @@ ACMD(partyrecall) count = 0; iter = mapit_getallusers(); - for( pl_sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); pl_sd = (TBL_PC*)mapit->next(iter) ) { + for (pl_sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); pl_sd = BL_UCAST(BL_PC, mapit->next(iter))) { if (sd->status.account_id != pl_sd->status.account_id && pl_sd->status.party_id == p->party.party_id) { if (pc_get_group_level(pl_sd) > pc_get_group_level(sd) || (pl_sd->bl.m == sd->bl.m && pl_sd->bl.x == sd->bl.x && pl_sd->bl.y == sd->bl.y)) continue; // Skip GMs greater than you... or chars already on the cell @@ -3704,7 +3706,7 @@ ACMD(reloadscript) { //atcommand_broadcast( fd, sd, "@broadcast", "You will feel a bit of lag at this point !" ); iter = mapit_getallusers(); - for (pl_sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); pl_sd = (TBL_PC*)mapit->next(iter)) { + for (pl_sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); pl_sd = BL_UCAST(BL_PC, mapit->next(iter))) { if (pl_sd->npc_id || pl_sd->npc_shopid) { if (pl_sd->state.using_fake_npc) { clif->clearunit_single(pl_sd->npc_id, CLR_OUTSIGHT, pl_sd->fd); @@ -3742,10 +3744,11 @@ ACMD(reloadscript) { * 3 = Shows the chats in that map TODO# add the missing mapflags e.g. adjust_skill_damage to display *------------------------------------------*/ -ACMD(mapinfo) { - struct map_session_data* pl_sd; +ACMD(mapinfo) +{ + const struct map_session_data *pl_sd; struct s_mapiterator* iter; - struct chat_data *cd = NULL; + const struct chat_data *cd = NULL; char direction[12]; int i, m_id, chat_num = 0, list = 0, vend_num = 0; unsigned short m_index; @@ -3780,11 +3783,11 @@ ACMD(mapinfo) { // count chats (for initial message) chat_num = 0; iter = mapit_getallusers(); - for( pl_sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); pl_sd = (TBL_PC*)mapit->next(iter) ) { + for (pl_sd = BL_UCCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); pl_sd = BL_UCCAST(BL_PC, mapit->next(iter))) { if( pl_sd->mapindex == m_index ) { if( pl_sd->state.vending ) vend_num++; - else if( (cd = (struct chat_data*)map->id2bl(pl_sd->chatID)) != NULL && cd->usersd[0] == pl_sd ) + else if ((cd = map->id2cd(pl_sd->chatID)) != NULL && cd->usersd[0] == pl_sd) chat_num++; } } @@ -3925,8 +3928,7 @@ ACMD(mapinfo) { case 1: clif->message(fd, msg_fd(fd,1098)); // ----- Players in Map ----- iter = mapit_getallusers(); - for (pl_sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); pl_sd = (TBL_PC*)mapit->next(iter)) - { + for (pl_sd = BL_UCCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); pl_sd = BL_UCCAST(BL_PC, mapit->next(iter))) { if (pl_sd->mapindex == m_index) { safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1099), // Player '%s' (session #%d) | Location: %d,%d pl_sd->status.name, pl_sd->fd, pl_sd->bl.x, pl_sd->bl.y); @@ -3963,12 +3965,8 @@ ACMD(mapinfo) { case 3: clif->message(fd, msg_fd(fd,1113)); // ----- Chats in Map ----- iter = mapit_getallusers(); - for (pl_sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); pl_sd = (TBL_PC*)mapit->next(iter)) - { - if ((cd = (struct chat_data*)map->id2bl(pl_sd->chatID)) != NULL && - pl_sd->mapindex == m_index && - cd->usersd[0] == pl_sd) - { + for (pl_sd = BL_UCCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); pl_sd = BL_UCCAST(BL_PC, mapit->next(iter))) { + if ((cd = map->id2cd(pl_sd->chatID)) != NULL && pl_sd->mapindex == m_index && cd->usersd[0] == pl_sd) { safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1114), // Chat: %s | Player: %s | Location: %d %d cd->title, pl_sd->status.name, cd->bl.x, cd->bl.y); clif->message(fd, atcmd_output); @@ -4749,7 +4747,7 @@ ACMD(disguiseall) } iter = mapit_getallusers(); - for( pl_sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); pl_sd = (TBL_PC*)mapit->next(iter) ) + for (pl_sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); pl_sd = BL_UCAST(BL_PC, mapit->next(iter))) pc->disguise(pl_sd, mob_id); mapit->free(iter); @@ -4829,7 +4827,7 @@ ACMD(undisguiseall) { struct s_mapiterator* iter; iter = mapit_getallusers(); - for( pl_sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); pl_sd = (TBL_PC*)mapit->next(iter) ) + for (pl_sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); pl_sd = BL_UCAST(BL_PC, mapit->next(iter))) if( pl_sd->disguise != -1 ) pc->disguise(pl_sd, -1); mapit->free(iter); @@ -6065,7 +6063,8 @@ ACMD(mobsearch) char mob_name[100]; int mob_id; int number = 0; - struct s_mapiterator* it; + struct s_mapiterator *it; + const struct mob_data *md = NULL; if (!*message || sscanf(message, "%99[^\n]", mob_name) < 1) { clif->message(fd, msg_fd(fd,1218)); // Please enter a monster name (usage: @mobsearch <monster name>). @@ -6087,12 +6086,7 @@ ACMD(mobsearch) clif->message(fd, atcmd_output); it = mapit_geteachmob(); - for(;;) - { - TBL_MOB* md = (TBL_MOB*)mapit->next(it); - if( md == NULL ) - break;// no more mobs - + for (md = BL_UCCAST(BL_MOB, mapit->first(it)); mapit->exists(it); md = BL_UCCAST(BL_MOB, mapit->next(it))) { if( md->bl.m != sd->bl.m ) continue; if( mob_id != -1 && md->class_ != mob_id ) @@ -6250,24 +6244,22 @@ ACMD(users) char buf[CHAT_SIZE_MAX]; int users[MAX_MAPINDEX]; int users_all; - struct s_mapiterator* iter; + struct s_mapiterator *iter; + const struct map_session_data *pl_sd = NULL; memset(users, 0, sizeof(users)); users_all = 0; // count users on each map iter = mapit_getallusers(); - for(;;) - { - struct map_session_data* sd2 = (struct map_session_data*)mapit->next(iter); - if( sd2 == NULL ) - break;// no more users - - if( sd2->mapindex >= MAX_MAPINDEX ) + for (pl_sd = BL_UCCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); pl_sd = BL_UCCAST(BL_PC, mapit->next(iter))) { + if (pl_sd->mapindex >= MAX_MAPINDEX) continue;// invalid mapindex - if( users[sd2->mapindex] < INT_MAX ) ++users[sd2->mapindex]; - if( users_all < INT_MAX ) ++users_all; + if (users[pl_sd->mapindex] < INT_MAX) + ++users[pl_sd->mapindex]; + if (users_all < INT_MAX) + ++users_all; } mapit->free(iter); @@ -6536,7 +6528,7 @@ ACMD(refreshall) struct s_mapiterator* iter; iter = mapit_getallusers(); - for (iter_sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); iter_sd = (TBL_PC*)mapit->next(iter)) + for (iter_sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); iter_sd = BL_UCAST(BL_PC, mapit->next(iter))) clif->refresh(iter_sd); mapit->free(iter); return true; @@ -6744,7 +6736,8 @@ ACMD(showmobs) char mob_name[100]; int mob_id; int number = 0; - struct s_mapiterator* it; + struct s_mapiterator *it; + const struct mob_data *md = NULL; if (sscanf(message, "%99[^\n]", mob_name) < 0) { clif->message(fd, msg_fd(fd,546)); // Please enter a mob name/id (usage: @showmobs <mob name/id>) @@ -6781,12 +6774,7 @@ ACMD(showmobs) clif->message(fd, atcmd_output); it = mapit_geteachmob(); - for(;;) - { - TBL_MOB* md = (TBL_MOB*)mapit->next(it); - if( md == NULL ) - break;// no more mobs - + for (md = BL_UCCAST(BL_MOB, mapit->first(it)); mapit->next(it); md = BL_UCCAST(BL_MOB, mapit->next(it))) { if( md->bl.m != sd->bl.m ) continue; if( mob_id != -1 && md->class_ != mob_id ) @@ -6808,7 +6796,7 @@ ACMD(showmobs) * homunculus level up [orn] *------------------------------------------*/ ACMD(homlevel) { - TBL_HOM * hd; + struct homun_data *hd; int level = 0; enum homun_type htype; @@ -7303,7 +7291,7 @@ int atcommand_mutearea_sub(struct block_list *bl, va_list ap) { // As it is being used [ACMD(mutearea)] there's no need to be a bool, but if there's need to reuse it, it's better to be this way int time, id; - struct map_session_data *pl_sd = (struct map_session_data *)bl; + struct map_session_data *pl_sd = BL_CAST(BL_PC, bl); if (pl_sd == NULL) return 0; @@ -7419,7 +7407,7 @@ ACMD(sizeall) size = cap_value(size,0,2); iter = mapit_getallusers(); - for (pl_sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); pl_sd = (TBL_PC*)mapit->next(iter)) { + for (pl_sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); pl_sd = BL_UCAST(BL_PC, mapit->next(iter))) { if (pl_sd->state.size != size) { if (pl_sd->state.size) { pl_sd->state.size = SZ_SMALL; @@ -9822,7 +9810,7 @@ bool atcommand_exec(const int fd, struct map_session_data *sd, const char *messa //Reconstructed message char atcmd_msg[CHAT_SIZE_MAX]; - TBL_PC * ssd = NULL; //sd for target + struct map_session_data *ssd = NULL; //sd for target AtCommandInfo * info; nullpo_retr(false, sd); diff --git a/src/map/battle.c b/src/map/battle.c index 201cd6a00..3b3ea2047 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -61,18 +61,30 @@ struct Battle_Config battle_config; struct battle_interface battle_s; struct battle_interface *battle; -int battle_getcurrentskill(struct block_list *bl) { //Returns the current/last skill in use by this bl. - struct unit_data *ud; +/** + * Returns the current/last skill in use by this bl. + * + * @param bl The bl to check. + * @return The current/last skill ID. + */ +int battle_getcurrentskill(struct block_list *bl) +{ + const struct unit_data *ud; nullpo_ret(bl); if (bl->type == BL_SKILL) { - struct skill_unit * su = (struct skill_unit*)bl; - return su->group?su->group->skill_id:0; + const struct skill_unit *su = BL_UCCAST(BL_SKILL, bl); + if (su->group == NULL) + return 0; + return su->group->skill_id; } ud = unit->bl2ud(bl); - return ud?ud->skill_id:0; + if (ud == NULL) + return 0; + + return ud->skill_id; } /*========================================== @@ -125,12 +137,12 @@ int battle_gettarget(struct block_list* bl) { nullpo_ret(bl); switch (bl->type) { - case BL_PC: return ((struct map_session_data*)bl)->ud.target; - case BL_MOB: return ((struct mob_data*)bl)->target_id; - case BL_PET: return ((struct pet_data*)bl)->target_id; - case BL_HOM: return ((struct homun_data*)bl)->ud.target; - case BL_MER: return ((struct mercenary_data*)bl)->ud.target; - case BL_ELEM: return ((struct elemental_data*)bl)->ud.target; + case BL_PC: return BL_UCCAST(BL_PC, bl)->ud.target; + case BL_MOB: return BL_UCCAST(BL_MOB, bl)->target_id; + case BL_PET: return BL_UCCAST(BL_PET, bl)->target_id; + case BL_HOM: return BL_UCCAST(BL_HOM, bl)->ud.target; + case BL_MER: return BL_UCCAST(BL_MER, bl)->ud.target; + case BL_ELEM: return BL_UCCAST(BL_ELEM, bl)->ud.target; } return 0; @@ -230,47 +242,37 @@ int battle_delay_damage_sub(int tid, int64 tick, int id, intptr_t data) { struct delay_damage *dat = (struct delay_damage *)data; if ( dat ) { - struct block_list* src = NULL; - struct block_list* target = map->id2bl(dat->target_id); - - if( !target || status->isdead(target) ) {/* nothing we can do */ - if( dat->src_type == BL_PC && (src = map->id2bl(dat->src_id)) != NULL && --((TBL_PC*)src)->delayed_damage == 0 && ((TBL_PC*)src)->state.hold_recalc ) { - ((TBL_PC*)src)->state.hold_recalc = 0; - status_calc_pc(((TBL_PC*)src),SCO_FORCE); + struct block_list *src = map->id2bl(dat->src_id); + struct map_session_data *sd = BL_CAST(BL_PC, src); + struct block_list *target = map->id2bl(dat->target_id); + + if (target != NULL && !status->isdead(target)) { + //Check to see if you haven't teleported. [Skotlex] + if (src != NULL && ( + battle_config.fix_warp_hit_delay_abuse ? + (dat->skill_id == MO_EXTREMITYFIST || target->m != src->m || check_distance_bl(src, target, dat->distance)) + : + ((target->type != BL_PC || BL_UCAST(BL_PC, target)->invincible_timer == INVALID_TIMER) + && (dat->skill_id == MO_EXTREMITYFIST || (target->m == src->m && check_distance_bl(src, target, dat->distance)))) + )) { + map->freeblock_lock(); + status_fix_damage(src, target, dat->damage, dat->delay); + if (dat->attack_type && !status->isdead(target) && dat->additional_effects) + skill->additional_effect(src,target,dat->skill_id,dat->skill_lv,dat->attack_type,dat->dmg_lv,tick); + if (dat->dmg_lv > ATK_BLOCK && dat->attack_type) + skill->counter_additional_effect(src,target,dat->skill_id,dat->skill_lv,dat->attack_type,tick); + map->freeblock_unlock(); + } else if (src == NULL && dat->skill_id == CR_REFLECTSHIELD) { + // it was monster reflected damage, and the monster died, we pass the damage to the character as expected + map->freeblock_lock(); + status_fix_damage(target, target, dat->damage, dat->delay); + map->freeblock_unlock(); } - ers_free(battle->delay_damage_ers, dat); - return 0; - } - - src = map->id2bl(dat->src_id); - - //Check to see if you haven't teleported. [Skotlex] - if (src && ( - battle_config.fix_warp_hit_delay_abuse ? - (dat->skill_id == MO_EXTREMITYFIST || target->m != src->m || check_distance_bl(src, target, dat->distance)) - : - ((target->type != BL_PC || ((TBL_PC*)target)->invincible_timer == INVALID_TIMER) - && (dat->skill_id == MO_EXTREMITYFIST || (target->m == src->m && check_distance_bl(src, target, dat->distance)))) - )) { - map->freeblock_lock(); - status_fix_damage(src, target, dat->damage, dat->delay); - if( dat->attack_type && !status->isdead(target) && dat->additional_effects ) - skill->additional_effect(src,target,dat->skill_id,dat->skill_lv,dat->attack_type,dat->dmg_lv,tick); - if( dat->dmg_lv > ATK_BLOCK && dat->attack_type ) - skill->counter_additional_effect(src,target,dat->skill_id,dat->skill_lv,dat->attack_type,tick); - map->freeblock_unlock(); - } else if( !src && dat->skill_id == CR_REFLECTSHIELD ) { - /** - * it was monster reflected damage, and the monster died, we pass the damage to the character as expected - **/ - map->freeblock_lock(); - status_fix_damage(target, target, dat->damage, dat->delay); - map->freeblock_unlock(); } - if( src && src->type == BL_PC && --((TBL_PC*)src)->delayed_damage == 0 && ((TBL_PC*)src)->state.hold_recalc ) { - ((TBL_PC*)src)->state.hold_recalc = 0; - status_calc_pc(((TBL_PC*)src),SCO_FORCE); + if (sd != NULL && --sd->delayed_damage == 0 && sd->state.hold_recalc) { + sd->state.hold_recalc = 0; + status_calc_pc(sd, SCO_FORCE); } } ers_free(battle->delay_damage_ers, dat); @@ -317,8 +319,8 @@ int battle_delay_damage(int64 tick, int amotion, struct block_list *src, struct if (src->type != BL_PC && amotion > 1000) amotion = 1000; //Aegis places a damage-delay cap of 1 sec to non player attacks. [Skotlex] - if( src->type == BL_PC ) { - ((TBL_PC*)src)->delayed_damage++; + if (src->type == BL_PC) { + BL_UCAST(BL_PC, src)->delayed_damage++; } timer->add(tick+amotion, battle->delay_damage_sub, 0, (intptr_t)dat); @@ -371,7 +373,7 @@ int64 battle_attr_fix(struct block_list *src, struct block_list *target, int64 d } if( target && target->type == BL_SKILL ) { if( atk_elem == ELE_FIRE && battle->get_current_skill(target) == GN_WALLOFTHORN ) { - struct skill_unit *su = (struct skill_unit*)target; + struct skill_unit *su = BL_UCAST(BL_SKILL, target); struct skill_unit_group *sg; struct block_list *sgsrc; @@ -526,17 +528,20 @@ int64 battle_calc_base_damage(struct block_list *src, struct block_list *bl, uin int64 damage; struct status_data *st = status->get_status_data(src); struct status_change *sc = status->get_sc(src); - + const struct map_session_data *sd = NULL; nullpo_retr(0, src); + + sd = BL_CCAST(BL_PC, src); + if ( !skill_id ) { s_ele = st->rhw.ele; s_ele_ = st->lhw.ele; - if ( src->type == BL_PC ) { - if ( ((TBL_PC*)src)->charm_type != CHARM_TYPE_NONE && ((TBL_PC*)src)->charm_count >= MAX_SPIRITCHARM ) { - s_ele = s_ele_ = ((TBL_PC*)src)->charm_type; + if (sd != NULL) { + if (sd->charm_type != CHARM_TYPE_NONE && sd->charm_count >= MAX_SPIRITCHARM) { + s_ele = s_ele_ = sd->charm_type; } - if ( flag & 2 && ((TBL_PC*)src)->bonus.arrow_ele ) - s_ele = ((TBL_PC*)src)->bonus.arrow_ele; + if (flag&2 && sd->bonus.arrow_ele != 0) + s_ele = sd->bonus.arrow_ele; } } if (src->type == BL_PC) { @@ -550,8 +555,7 @@ int64 battle_calc_base_damage(struct block_list *src, struct block_list *bl, uin damage = batk + 3 * battle->calc_weapon_damage(src, bl, skill_id, skill_lv, &st->lhw, nk, n_ele, s_ele, s_ele_, status_get_size(bl), type, flag, flag2) / 4; else damage = (batk << 1) + battle->calc_weapon_damage(src, bl, skill_id, skill_lv, &st->rhw, nk, n_ele, s_ele, s_ele_, status_get_size(bl), type, flag, flag2); - } - else{ + } else { damage = st->batk + battle->calc_weapon_damage(src, bl, skill_id, skill_lv, &st->rhw, nk, n_ele, s_ele, s_ele_, status_get_size(bl), type, flag, flag2); } @@ -2720,6 +2724,8 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam nullpo_ret(bl); nullpo_ret(d); + + sd = BL_CAST(BL_PC, bl); div_ = d->div_; flag = d->flag; @@ -2729,8 +2735,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam return 0; if( battle_config.ksprotection && mob->ksprotected(src, bl) ) return 0; - if (bl->type == BL_PC) { - sd=(struct map_session_data *)bl; + if (sd != NULL) { //Special no damage states if(flag&BF_WEAPON && sd->special_state.no_weapon_damage) damage -= damage * sd->special_state.no_weapon_damage / 100; @@ -2861,9 +2866,11 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam // If the target is too far away from the devotion caster, autoguard has no effect // Autoguard will be disabled later on struct block_list *d_bl = map->id2bl(sce_d->val1); - if (d_bl && check_distance_bl(bl, d_bl, sce_d->val3) - && ((d_bl->type == BL_MER && ((TBL_MER*)d_bl)->master && ((TBL_MER*)d_bl)->master->bl.id == bl->id) - || (d_bl->type == BL_PC && ((TBL_PC*)d_bl)->devotion[sce_d->val2] == bl->id)) + struct mercenary_data *d_md = BL_CAST(BL_MER, d_bl); + struct map_session_data *d_sd = BL_CAST(BL_PC, d_bl); + if (d_bl != NULL && check_distance_bl(bl, d_bl, sce_d->val3) + && ((d_bl->type == BL_MER && d_md->master != NULL && d_md->master->bl.id == bl->id) + || (d_bl->type == BL_PC && d_sd->devotion[sce_d->val2] == bl->id)) ) { // if player is target of devotion, show guard effect on the devotion caster rather than the target clif->skill_nodamage(d_bl, d_bl, CR_AUTOGUARD, sce->val1, 1); @@ -3059,10 +3066,11 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam // Compressed code, fixed by map.h [Epoque] if (src->type == BL_MOB) { + const struct mob_data *md = BL_UCCAST(BL_MOB, src); int i; if (sc->data[SC_MANU_DEF] != NULL) { for (i = 0; i < ARRAYLENGTH(mob->manuk); i++) { - if (mob->manuk[i] == ((TBL_MOB*)src)->class_) { + if (mob->manuk[i] == md->class_) { damage -= damage * sc->data[SC_MANU_DEF]->val1 / 100; break; } @@ -3070,7 +3078,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam } if (sc->data[SC_SPL_DEF] != NULL) { for (i = 0; i < ARRAYLENGTH(mob->splendide); i++) { - if (mob->splendide[i] == ((TBL_MOB*)src)->class_) { + if (mob->splendide[i] == md->class_) { damage -= damage * sc->data[SC_SPL_DEF]->val1 / 100; break; } @@ -3078,7 +3086,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam } if (sc->data[SC_MORA_BUFF] != NULL) { for (i = 0; i < ARRAYLENGTH(mob->mora); i++) { - if (mob->mora[i] == ((TBL_MOB*)src)->class_) { + if (mob->mora[i] == md->class_) { damage -= damage * sc->data[SC_MORA_BUFF]->val1 / 100; break; } @@ -3123,7 +3131,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam if( (sce = sc->data[SC_STONEHARDSKIN]) && flag&(BF_SHORT|BF_WEAPON) && damage > 0 ) { sce->val2 -= (int)cap_value(damage,INT_MIN,INT_MAX); if( src->type == BL_PC ) { - TBL_PC *ssd = BL_CAST(BL_PC, src); + struct map_session_data *ssd = BL_CAST(BL_PC, src); if (ssd && ssd->status.weapon != W_BOW) skill->break_equip(src, EQP_WEAPON, 3000, BCT_SELF); } else @@ -3194,7 +3202,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam clif->millenniumshield(bl, sc->fv_counter++); if (sc->data[SC_STYLE_CHANGE] && rnd()%2) { - TBL_HOM *hd = BL_CAST(BL_HOM,bl); + struct homun_data *hd = BL_CAST(BL_HOM,bl); if (hd) homun->addspiritball(hd, 10); //add a sphere } @@ -3213,24 +3221,25 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam damage += damage * 75 / 100; // [Epoque] if (bl->type == BL_MOB) { + const struct mob_data *md = BL_UCCAST(BL_MOB, bl); int i; - if ( ((sce=tsc->data[SC_MANU_ATK]) && (flag&BF_WEAPON)) || - ((sce=tsc->data[SC_MANU_MATK]) && (flag&BF_MAGIC)) - ) - for (i=0;ARRAYLENGTH(mob->manuk)>i;i++) - if (((TBL_MOB*)bl)->class_==mob->manuk[i]) { + if (((sce=tsc->data[SC_MANU_ATK]) != NULL && (flag&BF_WEAPON)) + || ((sce=tsc->data[SC_MANU_MATK]) != NULL && (flag&BF_MAGIC))) { + for (i = 0; i < ARRAYLENGTH(mob->manuk); i++) + if (md->class_ == mob->manuk[i]) { damage += damage * sce->val1 / 100; break; } - if ( ((sce=tsc->data[SC_SPL_ATK]) && (flag&BF_WEAPON)) || - ((sce=tsc->data[SC_SPL_MATK]) && (flag&BF_MAGIC)) - ) - for (i=0;ARRAYLENGTH(mob->splendide)>i;i++) - if (((TBL_MOB*)bl)->class_==mob->splendide[i]) { + } + if (((sce=tsc->data[SC_SPL_ATK]) != NULL && (flag&BF_WEAPON)) + || ((sce=tsc->data[SC_SPL_MATK]) != NULL && (flag&BF_MAGIC))) { + for (i = 0; i < ARRAYLENGTH(mob->splendide); i++) + if (md->class_ == mob->splendide[i]) { damage += damage * sce->val1 / 100; break; } + } } if( tsc->data[SC_POISONINGWEAPON] ) { struct status_data *tstatus = status->get_status_data(bl); @@ -3246,12 +3255,12 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam if (tsc->data[SC_SHIELDSPELL_REF] && tsc->data[SC_SHIELDSPELL_REF]->val1 == 1 && damage > 0) skill->break_equip(bl,EQP_ARMOR,10000,BCT_ENEMY ); if (tsc->data[SC_STYLE_CHANGE] && rnd()%2) { - TBL_HOM *hd = BL_CAST(BL_HOM,bl); + struct homun_data *hd = BL_CAST(BL_HOM,bl); if (hd) homun->addspiritball(hd, 10); } if (src->type == BL_PC && damage > 0 && (sce = tsc->data[SC_GENTLETOUCH_ENERGYGAIN]) != NULL) { - struct map_session_data *tsd = (struct map_session_data *)src; - if ( tsd && rnd() % 100 < sce->val2 ) + struct map_session_data *tsd = BL_UCAST(BL_PC, src); + if (tsd != NULL && rnd() % 100 < sce->val2) pc->addspiritball(tsd, skill->get_time(MO_CALLSPIRITS, 1), pc->getmaxspiritball(tsd, 0)); } } @@ -3292,18 +3301,20 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam } if( bl->type == BL_MOB && !status->isdead(bl) && src != bl) { - if ( damage > 0 ) - mob->skill_event((TBL_MOB*)bl,src,timer->gettick(),flag); + struct mob_data *md = BL_UCAST(BL_MOB, bl); + if (damage > 0) + mob->skill_event(md, src, timer->gettick(), flag); if (skill_id) - mob->skill_event((TBL_MOB*)bl,src,timer->gettick(),MSC_SKILLUSED|(skill_id<<16)); + mob->skill_event(md, src, timer->gettick(), MSC_SKILLUSED|(skill_id<<16)); } if (sd && pc_ismadogear(sd) && rnd()%100 < 50) { int element = -1; if (!skill_id || (element = skill->get_ele(skill_id, skill_lv)) == -1) { // Take weapon's element struct status_data *sstatus = NULL; - if (src->type == BL_PC && ((TBL_PC*)src)->bonus.arrow_ele) { - element = ((TBL_PC*)src)->bonus.arrow_ele; + struct map_session_data *ssd = BL_CAST(BL_PC, src); + if (src->type == BL_PC && ssd->bonus.arrow_ele != 0) { + element = ssd->bonus.arrow_ele; } else if ((sstatus = status->get_status_data(src)) != NULL) { element = sstatus->rhw.ele; } @@ -3371,7 +3382,13 @@ int64 battle_calc_gvg_damage(struct block_list *src,struct block_list *bl,int64 } } if(src->type != BL_MOB) { - struct guild *g = src->type == BL_PC ? ((TBL_PC *)src)->guild : guild->search(status->get_guild_id(src)); + struct guild *g = NULL; + if (src->type == BL_PC) { + struct map_session_data *sd = BL_UCAST(BL_PC, src); + g = sd->guild; + } else { + g = guild->search(status->get_guild_id(src)); + } if (class_ == MOBID_EMPELIUM && (!g || guild->checkskill(g,GD_APPROVAL) <= 0)) return 0; @@ -3420,7 +3437,8 @@ int battle_calc_drain(int64 damage, int rate, int per) { /*========================================== * Consumes ammo for the given skill. *------------------------------------------*/ -void battle_consume_ammo(TBL_PC*sd, int skill_id, int lv) { +void battle_consume_ammo(struct map_session_data *sd, int skill_id, int lv) +{ int qty=1; nullpo_retv(sd); @@ -3499,7 +3517,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list short s_ele = 0; unsigned int skillratio = 100; //Skill dmg modifiers. - TBL_PC *sd; + struct map_session_data *sd = NULL; struct status_change *sc; struct Damage ad; struct status_data *sstatus = status->get_status_data(src); @@ -3562,8 +3580,11 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list //Skill Range Criteria ad.flag |= battle->range_type(src, target, skill_id, skill_lv); flag.infdef = (tstatus->mode&MD_PLANT) ? 1 : 0; - if( !flag.infdef && target->type == BL_SKILL && ((TBL_SKILL*)target)->group->unit_id == UNT_REVERBERATION ) - flag.infdef = 1; // Reverberation takes 1 damage + if (!flag.infdef && target->type == BL_SKILL) { + const struct skill_unit *su = BL_UCCAST(BL_SKILL, target); + if (su->group->unit_id == UNT_REVERBERATION) + flag.infdef = 1; // Reverberation takes 1 damage + } switch(skill_id) { case MG_FIREWALL: @@ -3691,10 +3712,11 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list if (skill_id) { for(i = 0; i < map->list[target->m].zone->capped_skills_count; i++) { if( skill_id == map->list[target->m].zone->capped_skills[i]->nameid && (map->list[target->m].zone->capped_skills[i]->type & target->type) ) { - if( target->type == BL_MOB && map->list[target->m].zone->capped_skills[i]->subtype != MZS_NONE ) { - if( (((TBL_MOB*)target)->status.mode&MD_BOSS) && !(map->list[target->m].zone->disabled_skills[i]->subtype&MZS_BOSS) ) + if (target->type == BL_MOB && map->list[target->m].zone->capped_skills[i]->subtype != MZS_NONE) { + const struct mob_data *md = BL_UCCAST(BL_MOB, target); + if ((md->status.mode&MD_BOSS) && !(map->list[target->m].zone->disabled_skills[i]->subtype&MZS_BOSS)) continue; - if( ((TBL_MOB*)target)->special_state.clone && !(map->list[target->m].zone->disabled_skills[i]->subtype&MZS_CLONE) ) + if (md->special_state.clone && !(map->list[target->m].zone->disabled_skills[i]->subtype&MZS_CLONE)) continue; } if( ad.damage > map->list[target->m].zone->capped_skills[i]->cap ) @@ -4165,10 +4187,11 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list * if (skill_id) { for(i = 0; i < map->list[target->m].zone->capped_skills_count; i++) { if( skill_id == map->list[target->m].zone->capped_skills[i]->nameid && (map->list[target->m].zone->capped_skills[i]->type & target->type) ) { - if( target->type == BL_MOB && map->list[target->m].zone->capped_skills[i]->subtype != MZS_NONE ) { - if( (((TBL_MOB*)target)->status.mode&MD_BOSS) && !(map->list[target->m].zone->disabled_skills[i]->subtype&MZS_BOSS) ) + if (target->type == BL_MOB && map->list[target->m].zone->capped_skills[i]->subtype != MZS_NONE) { + const struct mob_data *t_md = BL_UCCAST(BL_MOB, target); + if ((t_md->status.mode&MD_BOSS) && !(map->list[target->m].zone->disabled_skills[i]->subtype&MZS_BOSS)) continue; - if( ((TBL_MOB*)target)->special_state.clone && !(map->list[target->m].zone->disabled_skills[i]->subtype&MZS_CLONE) ) + if (t_md->special_state.clone && !(map->list[target->m].zone->disabled_skills[i]->subtype&MZS_CLONE)) continue; } if( md.damage > map->list[target->m].zone->capped_skills[i]->cap ) @@ -4294,13 +4317,16 @@ struct Damage battle_calc_weapon_attack(struct block_list *src,struct block_list //Initial flag flag.rh=1; flag.weapon=1; - flag.infdef=(tstatus->mode&MD_PLANT && skill_id != RA_CLUSTERBOMB + flag.infdef = (tstatus->mode&MD_PLANT && skill_id != RA_CLUSTERBOMB?1:0); #ifdef RENEWAL - && skill_id != HT_FREEZINGTRAP + if (skill_id == HT_FREEZINGTRAP) + flag.infdef = 0; #endif - ?1:0); - if( !flag.infdef && target->type == BL_SKILL && ((TBL_SKILL*)target)->group->unit_id == UNT_REVERBERATION ) - flag.infdef = 1; // Reverberation takes 1 damage + if (!flag.infdef && target->type == BL_SKILL) { + const struct skill_unit *su = BL_UCCAST(BL_SKILL, target); + if (su->group->unit_id == UNT_REVERBERATION) + flag.infdef = 1; // Reverberation takes 1 damage + } //Initial Values wd.type = BDT_NORMAL; @@ -4846,10 +4872,12 @@ struct Damage battle_calc_weapon_attack(struct block_list *src,struct block_list ATK_ADD(sstatus->rhw.atk2); //Else use Atk2 break; case HFLI_SBR44: //[orn] - if(src->type == BL_HOM) { - wd.damage = ((TBL_HOM*)src)->homunculus.intimacy ; + if (src->type == BL_HOM) { + const struct homun_data *hd = BL_UCCAST(BL_HOM, src); + wd.damage = hd->homunculus.intimacy; break; } + break; default: { i = (flag.cri @@ -5153,8 +5181,9 @@ struct Damage battle_calc_weapon_attack(struct block_list *src,struct block_list } #endif if(sc->data[SC_STYLE_CHANGE]){ - TBL_HOM *hd = BL_CAST(BL_HOM,src); - if (hd) ATK_ADD(hd->homunculus.spiritball * 3); + struct homun_data *hd = BL_CAST(BL_HOM, src); + if (hd != NULL) + ATK_ADD(hd->homunculus.spiritball * 3); } } @@ -5384,10 +5413,11 @@ struct Damage battle_calc_weapon_attack(struct block_list *src,struct block_list if (skill_id) { for(i = 0; i < map->list[target->m].zone->capped_skills_count; i++) { if( skill_id == map->list[target->m].zone->capped_skills[i]->nameid && (map->list[target->m].zone->capped_skills[i]->type & target->type) ) { - if( target->type == BL_MOB && map->list[target->m].zone->capped_skills[i]->subtype != MZS_NONE ) { - if( (((TBL_MOB*)target)->status.mode&MD_BOSS) && !(map->list[target->m].zone->disabled_skills[i]->subtype&MZS_BOSS) ) + if (target->type == BL_MOB && map->list[target->m].zone->capped_skills[i]->subtype != MZS_NONE) { + const struct mob_data *md = BL_UCCAST(BL_MOB, target); + if ((md->status.mode&MD_BOSS) && !(map->list[target->m].zone->disabled_skills[i]->subtype&MZS_BOSS)) continue; - if( ((TBL_MOB*)target)->special_state.clone && !(map->list[target->m].zone->disabled_skills[i]->subtype&MZS_CLONE) ) + if (md->special_state.clone && !(map->list[target->m].zone->disabled_skills[i]->subtype&MZS_CLONE)) continue; } if( wd.damage > map->list[target->m].zone->capped_skills[i]->cap ) @@ -5596,14 +5626,10 @@ struct Damage battle_calc_weapon_attack(struct block_list *src,struct block_list } } //Reject Sword bugreport:4493 by Daegaladh - if(wd.damage && tsc && tsc->data[SC_SWORDREJECT] && - (src->type!=BL_PC || ( - ((TBL_PC *)src)->weapontype1 == W_DAGGER || - ((TBL_PC *)src)->weapontype1 == W_1HSWORD || - ((TBL_PC *)src)->status.weapon == W_2HSWORD - )) && - rnd()%100 < tsc->data[SC_SWORDREJECT]->val2 - ) { + if (wd.damage != 0 && tsc != NULL && tsc->data[SC_SWORDREJECT] != NULL + && (sd == NULL || sd->weapontype1 == W_DAGGER || sd->weapontype1 == W_1HSWORD || sd->status.weapon == W_2HSWORD) + && rnd()%100 < tsc->data[SC_SWORDREJECT]->val2 + ) { ATK_RATER(50); status_fix_damage(target,src,wd.damage,clif->damage(target,src,0,0,wd.damage,0,BDT_NORMAL,0)); clif->skill_nodamage(target,target,ST_REJECTSWORD,tsc->data[SC_SWORDREJECT]->val1,1); @@ -5644,10 +5670,11 @@ struct Damage battle_calc_attack(int attack_type,struct block_list *bl,struct bl int i; for(i = 0; i < map->list[target->m].zone->capped_skills_count; i++) { if( skill_id == map->list[target->m].zone->capped_skills[i]->nameid && (map->list[target->m].zone->capped_skills[i]->type & target->type) ) { - if( target->type == BL_MOB && map->list[target->m].zone->capped_skills[i]->subtype != MZS_NONE ) { - if( (((TBL_MOB*)target)->status.mode&MD_BOSS) && !(map->list[target->m].zone->disabled_skills[i]->subtype&MZS_BOSS) ) + if (target->type == BL_MOB && map->list[target->m].zone->capped_skills[i]->subtype != MZS_NONE) { + const struct mob_data *md = BL_UCCAST(BL_MOB, target); + if ((md->status.mode&MD_BOSS) && !(map->list[target->m].zone->disabled_skills[i]->subtype&MZS_BOSS)) continue; - if( ((TBL_MOB*)target)->special_state.clone && !(map->list[target->m].zone->disabled_skills[i]->subtype&MZS_CLONE) ) + if (md->special_state.clone && !(map->list[target->m].zone->disabled_skills[i]->subtype&MZS_CLONE)) continue; } if( d.damage > map->list[target->m].zone->capped_skills[i]->cap ) @@ -5893,7 +5920,7 @@ void battle_reflect_damage(struct block_list *target, struct block_list *src, st #undef NORMALIZE_RDAMAGE } -void battle_drain(TBL_PC *sd, struct block_list *tbl, int64 rdamage, int64 ldamage, int race, int boss) +void battle_drain(struct map_session_data *sd, struct block_list *tbl, int64 rdamage, int64 ldamage, int race, int boss) { struct weapon_data *wd; int type, thp = 0, tsp = 0, rhp = 0, rsp = 0, hp, sp, i; @@ -5964,19 +5991,23 @@ int battle_damage_area(struct block_list *bl, va_list ap) { amotion=va_arg(ap,int); dmotion=va_arg(ap,int); damage=va_arg(ap,int); - if (bl->type == BL_MOB && ((TBL_MOB*)bl)->class_ == MOBID_EMPELIUM) + if (bl->type == BL_MOB && BL_UCCAST(BL_MOB, bl)->class_ == MOBID_EMPELIUM) return 0; if( bl != src && battle->check_target(src,bl,BCT_ENEMY) > 0 ) { + struct map_session_data *sd = NULL; nullpo_ret(src); + map->freeblock_lock(); - if( src->type == BL_PC ) - battle->drain((TBL_PC*)src, bl, damage, damage, status_get_race(bl), is_boss(bl)); + sd = BL_CAST(BL_PC, src); + + if (src->type == BL_PC) + battle->drain(sd, bl, damage, damage, status_get_race(bl), is_boss(bl)); if( amotion ) battle->delay_damage(tick, amotion,src,bl,0,CR_REFLECTSHIELD,0,damage,ATK_DEF,0,true); else status_fix_damage(src,bl,damage,0); clif->damage(bl,bl,amotion,dmotion,damage,1,BDT_ENDURE,0); - if( !(src->type == BL_PC && ((TBL_PC*)src)->state.autocast) ) + if (src->type != BL_PC || !sd->state.autocast) skill->additional_effect(src, bl, CR_REFLECTSHIELD, 1, BF_WEAPON|BF_SHORT|BF_NORMAL,ATK_DEF,tick); map->freeblock_unlock(); } @@ -6171,9 +6202,9 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t if (sd && sd->bonus.splash_range > 0 && damage > 0) skill->castend_damage_id(src, target, 0, 1, tick, 0); - if ( target->type == BL_SKILL && damage > 0 ){ - TBL_SKILL *su = (TBL_SKILL*)target; - if( su->group && su->group->skill_id == HT_BLASTMINE) + if (target->type == BL_SKILL && damage > 0) { + struct skill_unit *su = BL_UCAST(BL_SKILL, target); + if (su->group && su->group->skill_id == HT_BLASTMINE) skill->blown(src, target, 3, -1, 0); } map->freeblock_lock(); @@ -6189,20 +6220,23 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t if( tsc->data[SC_DEVOTION] ) { struct status_change_entry *sce = tsc->data[SC_DEVOTION]; struct block_list *d_bl = map->id2bl(sce->val1); - - if( d_bl && ( - (d_bl->type == BL_MER && ((TBL_MER*)d_bl)->master && ((TBL_MER*)d_bl)->master->bl.id == target->id) || - (d_bl->type == BL_PC && ((TBL_PC*)d_bl)->devotion[sce->val2] == target->id) - ) && check_distance_bl(target, d_bl, sce->val3) ) - { + struct mercenary_data *d_md = BL_CAST(BL_MER, d_bl); + struct map_session_data *d_sd = BL_CAST(BL_PC, d_bl); + + if (d_bl != NULL + && ((d_bl->type == BL_MER && d_md->master != NULL && d_md->master->bl.id == target->id) + || (d_bl->type == BL_PC && d_sd->devotion[sce->val2] == target->id) + ) + && check_distance_bl(target, d_bl, sce->val3) + ) { clif->damage(d_bl, d_bl, 0, 0, damage, 0, BDT_NORMAL, 0); status_fix_damage(NULL, d_bl, damage, 0); - } - else + } else { status_change_end(target, SC_DEVOTION, INVALID_TIMER); + } } else if( tsc->data[SC_CIRCLE_OF_FIRE_OPTION] && (wd.flag&BF_SHORT) && target->type == BL_PC ) { - struct elemental_data *ed = ((TBL_PC*)target)->ed; - if( ed ) { + struct elemental_data *ed = BL_UCAST(BL_PC, target)->ed; + if (ed != NULL) { clif->skill_damage(&ed->bl, target, tick, status_get_amotion(src), 0, -30000, 1, EL_CIRCLE_OF_FIRE, tsc->data[SC_CIRCLE_OF_FIRE_OPTION]->val1, BDT_SKILL); skill->attack(BF_MAGIC,&ed->bl,&ed->bl,src,EL_CIRCLE_OF_FIRE,tsc->data[SC_CIRCLE_OF_FIRE_OPTION]->val1,tick,wd.flag); } @@ -6366,35 +6400,54 @@ bool battle_check_undead(int race,int element) } //Returns the upmost level master starting with the given object -struct block_list* battle_get_master(struct block_list *src) { - struct block_list *prev; //Used for infinite loop check (master of yourself?) +struct block_list *battle_get_master(struct block_list *src) +{ + struct block_list *prev = NULL; //Used for infinite loop check (master of yourself?) nullpo_retr(NULL, src); do { prev = src; switch (src->type) { case BL_PET: - if (((TBL_PET*)src)->msd) - src = (struct block_list*)((TBL_PET*)src)->msd; + { + struct pet_data *pd = BL_UCAST(BL_PET, src); + if (pd->msd != NULL) + src = &pd->msd->bl; + } break; case BL_MOB: - if (((TBL_MOB*)src)->master_id) - src = map->id2bl(((TBL_MOB*)src)->master_id); + { + struct mob_data *md = BL_UCAST(BL_MOB, src); + if (md->master_id != 0) + src = map->id2bl(md->master_id); + } break; case BL_HOM: - if (((TBL_HOM*)src)->master) - src = (struct block_list*)((TBL_HOM*)src)->master; + { + struct homun_data *hd = BL_UCAST(BL_HOM, src); + if (hd->master != NULL) + src = &hd->master->bl; + } break; case BL_MER: - if (((TBL_MER*)src)->master) - src = (struct block_list*)((TBL_MER*)src)->master; + { + struct mercenary_data *md = BL_UCAST(BL_MER, src); + if (md->master != NULL) + src = &md->master->bl; + } break; case BL_ELEM: - if (((TBL_ELEM*)src)->master) - src = (struct block_list*)((TBL_ELEM*)src)->master; + { + struct elemental_data *ed = BL_UCAST(BL_ELEM, src); + if (ed->master != NULL) + src = &ed->master->bl; + } break; case BL_SKILL: - if (((TBL_SKILL*)src)->group && ((TBL_SKILL*)src)->group->src_id) - src = map->id2bl(((TBL_SKILL*)src)->group->src_id); + { + struct skill_unit *su = BL_UCAST(BL_SKILL, src); + if (su->group != NULL && su->group->src_id != 0) + src = map->id2bl(su->group->src_id); + } break; } } while (src && src != prev); @@ -6435,14 +6488,15 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f if( (s_bl = battle->get_master(src)) == NULL ) s_bl = src; - if ( s_bl->type == BL_PC ) { - switch( t_bl->type ) { + if (s_bl->type == BL_PC) { + const struct map_session_data *s_sd = BL_UCCAST(BL_PC, s_bl); + switch (t_bl->type) { case BL_MOB: // Source => PC, Target => MOB - if (pc_has_permission((TBL_PC*)s_bl, PC_PERM_DISABLE_PVM) ) + if (pc_has_permission(s_sd, PC_PERM_DISABLE_PVM)) return 0; break; case BL_PC: - if (pc_has_permission((TBL_PC*)s_bl, PC_PERM_DISABLE_PVP)) + if (pc_has_permission(s_sd, PC_PERM_DISABLE_PVP)) return 0; break; default:/* anything else goes */ @@ -6451,29 +6505,31 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f } switch( target->type ) { // Checks on actual target - case BL_PC: { - struct status_change* sc = status->get_sc(src); - if( ((TBL_PC*)target)->invincible_timer != INVALID_TIMER ) { - switch( battle->get_current_skill(src) ) { - /* TODO a proper distinction should be established bugreport:8397 */ - case PR_SANCTUARY: - case PR_MAGNIFICAT: - break; - default: - return -1; - } - } - if ( pc_isinvisible((TBL_PC*)target) ) - return -1; //Cannot be targeted yet. - if( sc && sc->count ) { - if( sc->data[SC_SIREN] && sc->data[SC_SIREN]->val2 == target->id ) + case BL_PC: + { + const struct status_change *sc = status->get_sc(src); + const struct map_session_data *t_sd = BL_UCCAST(BL_PC, target); + if (t_sd->invincible_timer != INVALID_TIMER) { + switch( battle->get_current_skill(src) ) { + /* TODO a proper distinction should be established bugreport:8397 */ + case PR_SANCTUARY: + case PR_MAGNIFICAT: + break; + default: return -1; } } + if (pc_isinvisible(t_sd)) + return -1; //Cannot be targeted yet. + if (sc && sc->count) { + if (sc->data[SC_SIREN] && sc->data[SC_SIREN]->val2 == target->id) + return -1; + } + } break; case BL_MOB: { - TBL_MOB *md = BL_CAST(BL_MOB, target); + const struct mob_data *md = BL_UCCAST(BL_MOB, target); if(( (md->special_state.ai == AI_SPHERE || (md->special_state.ai == AI_FLORA && battle_config.summon_flora&1)) && s_bl->type == BL_PC && src->type != BL_MOB @@ -6488,7 +6544,7 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f } case BL_SKILL: { - TBL_SKILL *su = (TBL_SKILL*)target; + const struct skill_unit *su = BL_UCCAST(BL_SKILL, target); if( !su->group ) return 0; if( skill->get_inf2(su->group->skill_id)&INF2_TRAP && @@ -6559,13 +6615,13 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f switch( t_bl->type ) { //Checks on target master case BL_PC: { - struct map_session_data *sd; - if( t_bl == s_bl ) break; - sd = BL_CAST(BL_PC, t_bl); + const struct map_session_data *sd = BL_UCCAST(BL_PC, t_bl); + if (t_bl == s_bl) + break; if( sd->state.monster_ignore && flag&BCT_ENEMY ) return 0; // Global immunity only to Attacks - if( sd->status.karma && s_bl->type == BL_PC && ((TBL_PC*)s_bl)->status.karma ) + if (sd->status.karma && s_bl->type == BL_PC && BL_UCCAST(BL_PC, s_bl)->status.karma) state |= BCT_ENEMY; // Characters with bad karma may fight amongst them if( sd->state.killable ) { state |= BCT_ENEMY; // Everything can kill it @@ -6575,7 +6631,7 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f } case BL_MOB: { - struct mob_data *md = BL_CAST(BL_MOB, t_bl); + const struct mob_data *md = BL_UCCAST(BL_MOB, t_bl); if( !((map->agit_flag || map->agit2_flag) && map->list[m].flag.gvg_castle) && md->guardian_data && (md->guardian_data->g || md->guardian_data->castle->guild_id) ) @@ -6589,31 +6645,32 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f case BL_PET: if (t_bl->type != BL_MOB && flag&BCT_ENEMY) return 0; //Pet may not attack non-mobs. - if (t_bl->type == BL_MOB && ((TBL_MOB*)t_bl)->guardian_data && flag&BCT_ENEMY) + if (t_bl->type == BL_MOB && BL_UCCAST(BL_MOB, t_bl)->guardian_data && flag&BCT_ENEMY) return 0; //pet may not attack Guardians/Emperium break; - case BL_SKILL: { - struct skill_unit *su = (struct skill_unit *)src; - struct status_change* sc = status->get_sc(target); - if (!su->group) - return 0; + case BL_SKILL: + { + const struct skill_unit *su = BL_UCCAST(BL_SKILL, src); + const struct status_change *sc = status->get_sc(target); + if (su->group == NULL) + return 0; - if (su->group->src_id == target->id) { - int inf2 = skill->get_inf2(su->group->skill_id); - if (inf2&INF2_NO_TARGET_SELF) - return -1; - if (inf2&INF2_TARGET_SELF) - return 1; - } - //Status changes that prevent traps from triggering - if (sc && sc->count && skill->get_inf2(su->group->skill_id)&INF2_TRAP) { - if( sc->data[SC_WZ_SIGHTBLASTER] && sc->data[SC_WZ_SIGHTBLASTER]->val2 > 0 && sc->data[SC_WZ_SIGHTBLASTER]->val4%2 == 0) - return -1; - } + if (su->group->src_id == target->id) { + int inf2 = skill->get_inf2(su->group->skill_id); + if (inf2&INF2_NO_TARGET_SELF) + return -1; + if (inf2&INF2_TARGET_SELF) + return 1; } + //Status changes that prevent traps from triggering + if (sc != NULL && sc->count != 0 && skill->get_inf2(su->group->skill_id)&INF2_TRAP) { + if (sc->data[SC_WZ_SIGHTBLASTER] != NULL && sc->data[SC_WZ_SIGHTBLASTER]->val2 > 0 && sc->data[SC_WZ_SIGHTBLASTER]->val4%2 == 0) + return -1; + } + } break; case BL_MER: - if (t_bl->type == BL_MOB && ((TBL_MOB*)t_bl)->class_ == MOBID_EMPELIUM && flag&BCT_ENEMY) + if (t_bl->type == BL_MOB && BL_UCCAST(BL_MOB, t_bl)->class_ == MOBID_EMPELIUM && flag&BCT_ENEMY) return 0; //mercenary may not attack Emperium break; } //end switch actual src @@ -6621,7 +6678,7 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f switch( s_bl->type ) { //Checks on source master case BL_PC: { - struct map_session_data *sd = BL_CAST(BL_PC, s_bl); + const struct map_session_data *sd = BL_UCCAST(BL_PC, s_bl); if( s_bl != t_bl ) { if( sd->state.killer ) { state |= BCT_ENEMY; // Can kill anything @@ -6629,13 +6686,13 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f } else if( sd->duel_group && !((!battle_config.duel_allow_pvp && map->list[m].flag.pvp) || (!battle_config.duel_allow_gvg && map_flag_gvg(m))) ) { - if( t_bl->type == BL_PC && (sd->duel_group == ((TBL_PC*)t_bl)->duel_group) ) + if (t_bl->type == BL_PC && sd->duel_group == BL_UCCAST(BL_PC, t_bl)->duel_group) return (BCT_ENEMY&flag)?1:-1; // Duel targets can ONLY be your enemy, nothing else. else if (src->type != BL_SKILL || (flag&BCT_ALL) != BCT_ALL) return 0; } } - if (map_flag_gvg(m) && !sd->status.guild_id && t_bl->type == BL_MOB && ((TBL_MOB*)t_bl)->class_ == MOBID_EMPELIUM) + if (map_flag_gvg(m) && !sd->status.guild_id && t_bl->type == BL_MOB && BL_UCCAST(BL_MOB, t_bl)->class_ == MOBID_EMPELIUM) return 0; //If you don't belong to a guild, can't target emperium. if( t_bl->type != BL_PC ) state |= BCT_ENEMY; //Natural enemy. @@ -6643,21 +6700,21 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f } case BL_MOB: { - struct mob_data *md = BL_CAST(BL_MOB, s_bl); + const struct mob_data *md = BL_UCCAST(BL_MOB, s_bl); if( !((map->agit_flag || map->agit2_flag) && map->list[m].flag.gvg_castle) && md->guardian_data && (md->guardian_data->g || md->guardian_data->castle->guild_id) ) return 0; // Disable guardians/emperium owned by Guilds on non-woe times. if (md->special_state.ai == AI_NONE) { //Normal mobs - struct mob_data *target_md = BL_CAST(BL_MOB, target); - if( (target_md && t_bl->type == BL_PC && target_md->special_state.ai != AI_ZANZOU && target_md->special_state.ai != AI_ATTACK) - || (t_bl->type == BL_MOB && !((TBL_MOB*)t_bl)->special_state.ai) ) + const struct mob_data *target_md = BL_CCAST(BL_MOB, target); + if ((target_md != NULL && t_bl->type == BL_PC && target_md->special_state.ai != AI_ZANZOU && target_md->special_state.ai != AI_ATTACK) + || (t_bl->type == BL_MOB && BL_UCCAST(BL_MOB, t_bl)->special_state.ai == AI_NONE)) state |= BCT_PARTY; //Normal mobs with no ai are friends. else state |= BCT_ENEMY; //However, all else are enemies. } else { - if (t_bl->type == BL_MOB && ((TBL_MOB*)t_bl)->special_state.ai == AI_NONE) + if (t_bl->type == BL_MOB && BL_UCCAST(BL_MOB, t_bl)->special_state.ai == AI_NONE) state |= BCT_ENEMY; //Natural enemy for AI mobs are normal mobs. } break; @@ -6720,15 +6777,16 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f if( state&BCT_ENEMY && map->list[m].flag.battleground && sbg_id && sbg_id == tbg_id ) state &= ~BCT_ENEMY; - if( state&BCT_ENEMY && battle_config.pk_mode && !map_flag_gvg(m) && s_bl->type == BL_PC && t_bl->type == BL_PC ) - { // Prevent novice engagement on pk_mode (feature by Valaris) - TBL_PC *sd = (TBL_PC*)s_bl, *sd2 = (TBL_PC*)t_bl; + if (state&BCT_ENEMY && battle_config.pk_mode && !map_flag_gvg(m) && s_bl->type == BL_PC && t_bl->type == BL_PC) { + // Prevent novice engagement on pk_mode (feature by Valaris) + const struct map_session_data *s_sd = BL_UCCAST(BL_PC, s_bl); + const struct map_session_data *t_sd = BL_UCCAST(BL_PC, t_bl); if ( - (sd->class_&MAPID_UPPERMASK) == MAPID_NOVICE || - (sd2->class_&MAPID_UPPERMASK) == MAPID_NOVICE || - (int)sd->status.base_level < battle_config.pk_min_level || - (int)sd2->status.base_level < battle_config.pk_min_level || - (battle_config.pk_level_range && abs((int)sd->status.base_level - (int)sd2->status.base_level) > battle_config.pk_level_range) + (s_sd->class_&MAPID_UPPERMASK) == MAPID_NOVICE || + (t_sd->class_&MAPID_UPPERMASK) == MAPID_NOVICE || + (int)s_sd->status.base_level < battle_config.pk_min_level || + (int)t_sd->status.base_level < battle_config.pk_min_level || + (battle_config.pk_level_range && abs((int)s_sd->status.base_level - (int)t_sd->status.base_level) > battle_config.pk_level_range) ) state &= ~BCT_ENEMY; } diff --git a/src/map/battleground.c b/src/map/battleground.c index b2d6f0faf..e3fedbf34 100644 --- a/src/map/battleground.c +++ b/src/map/battleground.c @@ -220,29 +220,46 @@ int bg_team_get_id(struct block_list *bl) { nullpo_ret(bl); switch( bl->type ) { case BL_PC: - return ((TBL_PC*)bl)->bg_id; + { + const struct map_session_data *sd = BL_UCCAST(BL_PC, bl); + return sd->bg_id; + } case BL_PET: - if( ((TBL_PET*)bl)->msd ) - return ((TBL_PET*)bl)->msd->bg_id; + { + const struct pet_data *pd = BL_UCCAST(BL_PET, bl); + if (pd->msd != NULL) + return pd->msd->bg_id; + } break; case BL_MOB: { - struct map_session_data *msd; - struct mob_data *md = (TBL_MOB*)bl; + const struct mob_data *md = BL_UCCAST(BL_MOB, bl); + const struct map_session_data *msd; if (md->special_state.ai != AI_NONE && (msd = map->id2sd(md->master_id)) != NULL) return msd->bg_id; return md->bg_id; } case BL_HOM: - if( ((TBL_HOM*)bl)->master ) - return ((TBL_HOM*)bl)->master->bg_id; + { + const struct homun_data *hd = BL_UCCAST(BL_HOM, bl); + if (hd->master != NULL) + return hd->master->bg_id; + } break; case BL_MER: - if( ((TBL_MER*)bl)->master ) - return ((TBL_MER*)bl)->master->bg_id; + { + const struct mercenary_data *md = BL_UCCAST(BL_MER, bl); + if (md->master != NULL) + return md->master->bg_id; + } break; case BL_SKILL: - return ((TBL_SKILL*)bl)->group->bg_id; + { + const struct skill_unit *su = BL_UCCAST(BL_SKILL, bl); + if (su->group != NULL) + return su->group->bg_id; + } + break; } return 0; @@ -655,7 +672,7 @@ int bg_afk_timer(int tid, int64 tick, int id, intptr_t data) { int count = 0; iter = mapit_getallusers(); - for( sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); sd = (TBL_PC*)mapit->next(iter) ) { + for (sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); sd = BL_UCAST(BL_PC, mapit->next(iter))) { if( !sd->bg_queue.arena || !sd->bg_id ) continue; if( DIFF_TICK(sockt->last_tick, sd->idletime) > bg->mafksec ) diff --git a/src/map/chat.c b/src/map/chat.c index 45d4ea0cc..d60b9bece 100644 --- a/src/map/chat.c +++ b/src/map/chat.c @@ -53,7 +53,7 @@ struct chat_data* chat_createchat(struct block_list* bl, const char* title, cons nullpo_retr(NULL, ev); /* Given the overhead and the numerous instances (npc allocated or otherwise) wouldn't it be beneficial to have it use ERS? [Ind] */ - cd = (struct chat_data *) aMalloc(sizeof(struct chat_data)); + CREATE(cd, struct chat_data, 1); safestrncpy(cd->title, title, sizeof(cd->title)); safestrncpy(cd->pass, pass, sizeof(cd->pass)); @@ -140,7 +140,7 @@ bool chat_joinchat(struct map_session_data* sd, int chatid, const char* pass) { nullpo_ret(sd); nullpo_ret(pass); - cd = (struct chat_data*)map->id2bl(chatid); + cd = map->id2cd(chatid); if( cd == NULL || cd->bl.type != BL_CHAT || cd->bl.m != sd->bl.m || sd->state.vending || sd->state.buyingstore || sd->chatID || ((cd->owner->type == BL_NPC) ? cd->users+1 : cd->users) >= cd->limit ) { @@ -204,7 +204,7 @@ int chat_leavechat(struct map_session_data* sd, bool kicked) { nullpo_retr(0, sd); - cd = (struct chat_data*)map->id2bl(sd->chatID); + cd = map->id2cd(sd->chatID); if( cd == NULL ) { pc_setchatid(sd, 0); return 0; @@ -247,14 +247,14 @@ int chat_leavechat(struct map_session_data* sd, bool kicked) { if( leavechar == 0 && cd->owner->type == BL_PC ) { // Set and announce new owner - cd->owner = (struct block_list*) cd->usersd[0]; + cd->owner = &cd->usersd[0]->bl; clif->changechatowner(cd, cd->usersd[0]); clif->clearchat(cd, 0); //Adjust Chat location after owner has been changed. map->delblock( &cd->bl ); - cd->bl.x=cd->usersd[0]->bl.x; - cd->bl.y=cd->usersd[0]->bl.y; + cd->bl.x = cd->owner->x; + cd->bl.y = cd->owner->y; map->addblock( &cd->bl ); clif->dispchat(cd,0); @@ -279,8 +279,8 @@ bool chat_changechatowner(struct map_session_data* sd, const char* nextownername nullpo_ret(sd); nullpo_ret(nextownername); - cd = (struct chat_data*)map->id2bl(sd->chatID); - if( cd == NULL || (struct block_list*) sd != cd->owner ) + cd = map->id2cd(sd->chatID); + if (cd == NULL || &sd->bl != cd->owner) return false; ARR_FIND( 1, cd->users, i, strncmp(cd->usersd[i]->status.name, nextownername, NAME_LENGTH) == 0 ); @@ -291,7 +291,7 @@ bool chat_changechatowner(struct map_session_data* sd, const char* nextownername clif->clearchat(cd,0); // set new owner - cd->owner = (struct block_list*) cd->usersd[i]; + cd->owner = &cd->usersd[i]->bl; clif->changechatowner(cd,cd->usersd[i]); // swap the old and new owners' positions @@ -324,8 +324,8 @@ bool chat_changechatstatus(struct map_session_data* sd, const char* title, const nullpo_ret(title); nullpo_ret(pass); - cd = (struct chat_data*)map->id2bl(sd->chatID); - if( cd==NULL || (struct block_list *)sd != cd->owner ) + cd = map->id2cd(sd->chatID); + if (cd == NULL || &sd->bl != cd->owner) return false; safestrncpy(cd->title, title, CHATROOM_TITLE_SIZE); @@ -352,9 +352,9 @@ bool chat_kickchat(struct map_session_data* sd, const char* kickusername) { nullpo_ret(sd); nullpo_ret(kickusername); - cd = (struct chat_data *)map->id2bl(sd->chatID); + cd = map->id2cd(sd->chatID); - if( cd==NULL || (struct block_list *)sd != cd->owner ) + if (cd == NULL || &sd->bl != cd->owner) return false; ARR_FIND( 0, cd->users, i, strncmp(cd->usersd[i]->status.name, kickusername, NAME_LENGTH) == 0 ); @@ -409,8 +409,8 @@ bool chat_deletenpcchat(struct npc_data* nd) { struct chat_data *cd; nullpo_ret(nd); - cd = (struct chat_data*)map->id2bl(nd->chat_id); - if( cd == NULL ) + cd = map->id2cd(nd->chat_id); + if (cd == NULL) return false; chat->npc_kick_all(cd); diff --git a/src/map/chrif.c b/src/map/chrif.c index e9227db73..1f7fbe96e 100644 --- a/src/map/chrif.c +++ b/src/map/chrif.c @@ -163,7 +163,8 @@ bool chrif_auth_delete(int account_id, int char_id, enum sd_state state) { } //Moves the sd character to the auth_db structure. -bool chrif_sd_to_auth(TBL_PC* sd, enum sd_state state) { +bool chrif_sd_to_auth(struct map_session_data *sd, enum sd_state state) +{ struct auth_node *node; nullpo_retr(false, sd); @@ -191,7 +192,7 @@ bool chrif_sd_to_auth(TBL_PC* sd, enum sd_state state) { return true; } -bool chrif_auth_logout(TBL_PC* sd, enum sd_state state) +bool chrif_auth_logout(struct map_session_data *sd, enum sd_state state) { nullpo_retr(false, sd); if(sd->fd && state == ST_LOGOUT) { //Disassociate player, and free it after saving ack returns. [Skotlex] @@ -204,7 +205,8 @@ bool chrif_auth_logout(TBL_PC* sd, enum sd_state state) return chrif->sd_to_auth(sd, state); } -bool chrif_auth_finished(TBL_PC* sd) { +bool chrif_auth_finished(struct map_session_data *sd) +{ struct auth_node *node; nullpo_retr(false, sd); @@ -593,7 +595,7 @@ void chrif_authok(int fd) { struct mmo_charstatus* charstatus; struct auth_node *node; bool changing_mapservers; - TBL_PC* sd; + struct map_session_data *sd = NULL; //Check if both servers agree on the struct's size if( RFIFOW(fd,2) - 25 != sizeof(struct mmo_charstatus) ) { @@ -1476,8 +1478,8 @@ int send_usercount_tochar(int tid, int64 tick, int id, intptr_t data) { *------------------------------------------*/ bool send_users_tochar(void) { int users = 0, i = 0; - struct map_session_data* sd; - struct s_mapiterator* iter; + const struct map_session_data *sd; + struct s_mapiterator *iter; chrif_check(false); @@ -1487,7 +1489,7 @@ bool send_users_tochar(void) { WFIFOW(chrif->fd,0) = 0x2aff; iter = mapit_getallusers(); - for( sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); sd = (TBL_PC*)mapit->next(iter) ) { + for (sd = BL_UCCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); sd = BL_UCCAST(BL_PC, mapit->next(iter))) { WFIFOL(chrif->fd,6+8*i) = sd->status.account_id; WFIFOL(chrif->fd,6+8*i+4) = sd->status.char_id; i++; diff --git a/src/map/chrif.h b/src/map/chrif.h index d57d4d42c..6a5ec36b6 100644 --- a/src/map/chrif.h +++ b/src/map/chrif.h @@ -21,9 +21,9 @@ #ifndef MAP_CHRIF_H #define MAP_CHRIF_H -#include "map/map.h" //TBL_PC #include "common/hercules.h" #include "common/db.h" +#include "common/mmo.h" struct eri; struct map_session_data; @@ -129,9 +129,9 @@ struct chrif_interface { bool (*flush) (void); void (*skillid2idx) (int fd); - bool (*sd_to_auth) (TBL_PC* sd, enum sd_state state); + bool (*sd_to_auth) (struct map_session_data *sd, enum sd_state state); int (*check_connect_char_server) (int tid, int64 tick, int id, intptr_t data); - bool (*auth_logout) (TBL_PC* sd, enum sd_state state); + bool (*auth_logout) (struct map_session_data *sd, enum sd_state state); void (*save_ack) (int fd); int (*reconnect) (DBKey key, DBData *data, va_list ap); int (*auth_db_cleanup_sub) (DBKey key, DBData *data, va_list ap); diff --git a/src/map/clif.c b/src/map/clif.c index 053017a4a..827f57c45 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -190,8 +190,12 @@ static inline void RFIFOPOS2(int fd, unsigned short pos, short* x0, short* y0, s #endif // 0 //To identify disguised characters. -static inline bool disguised(struct block_list* bl) { - return (bool)( bl->type == BL_PC && ((TBL_PC*)bl)->disguise != -1 ); +static inline bool disguised(struct block_list* bl) +{ + struct map_session_data *sd = BL_CAST(BL_PC, bl); + if (sd == NULL || sd->disguise == -1) + return false; + return true; } //Guarantees that the given string does not exceeds the allowed size, as well as making sure it's null terminated. [Skotlex] @@ -313,7 +317,8 @@ int clif_send_sub(struct block_list *bl, va_list ap) { int len, type, fd; nullpo_ret(bl); - nullpo_ret(sd = (struct map_session_data *)bl); + Assert_ret(bl->type == BL_PC); + sd = BL_UCAST(BL_PC, bl); fd = sd->fd; if (!fd || sockt->session[fd] == NULL) //Don't send to disconnected clients. @@ -334,15 +339,14 @@ int clif_send_sub(struct block_list *bl, va_list ap) { return 0; break; case AREA_WOSC: { - if(src_bl->type == BL_PC){ - struct map_session_data *ssd = (struct map_session_data *)src_bl; - if (ssd && sd->chatID && (sd->chatID == ssd->chatID)) - return 0; - } - else if(src_bl->type == BL_NPC) { - struct npc_data *nd = (struct npc_data *)src_bl; - if (nd && sd->chatID && (sd->chatID == nd->chat_id)) - return 0; + if (src_bl->type == BL_PC) { + const struct map_session_data *ssd = BL_UCCAST(BL_PC, src_bl); + if (ssd != NULL && sd->chatID != 0 && (sd->chatID == ssd->chatID)) + return 0; + } else if (src_bl->type == BL_NPC) { + const struct npc_data *nd = BL_UCCAST(BL_NPC, src_bl); + if (nd != NULL && sd->chatID != 0 && (sd->chatID == nd->chat_id)) + return 0; } } break; @@ -404,7 +408,7 @@ bool clif_send(const void* buf, int len, struct block_list* bl, enum send_target case ALL_CLIENT: //All player clients. iter = mapit_getallusers(); - while( (tsd = (TBL_PC*)mapit->next(iter)) != NULL ) { + while ((tsd = BL_UCAST(BL_PC, mapit->next(iter))) != NULL) { WFIFOHEAD(tsd->fd, len); memcpy(WFIFOP(tsd->fd,0), buf, len); WFIFOSET(tsd->fd,len); @@ -414,7 +418,7 @@ bool clif_send(const void* buf, int len, struct block_list* bl, enum send_target case ALL_SAMEMAP: //All players on the same map iter = mapit_getallusers(); - while ((tsd = (TBL_PC*)mapit->next(iter)) != NULL) { + while ((tsd = BL_UCAST(BL_PC, mapit->next(iter))) != NULL) { if (bl && bl->m == tsd->bl.m) { WFIFOHEAD(tsd->fd, len); memcpy(WFIFOP(tsd->fd,0), buf, len); @@ -445,12 +449,12 @@ bool clif_send(const void* buf, int len, struct block_list* bl, enum send_target case CHAT_WOS: nullpo_retr(true, bl); { - struct chat_data *cd; - if (sd) { - cd = (struct chat_data*)map->id2bl(sd->chatID); - } else if (bl->type == BL_CHAT) { - cd = (struct chat_data*)bl; - } else break; + const struct chat_data *cd = NULL; + if (sd != NULL) { + cd = map->id2cd(sd->chatID); + } else { + cd = BL_CCAST(BL_CHAT, bl); + } if (cd == NULL) break; for(i = 0; i < cd->users; i++) { @@ -505,7 +509,7 @@ bool clif_send(const void* buf, int len, struct block_list* bl, enum send_target break; iter = mapit_getallusers(); - while( (tsd = (TBL_PC*)mapit->next(iter)) != NULL ) { + while ((tsd = BL_UCAST(BL_PC, mapit->next(iter))) != NULL) { if( tsd->partyspy == p->party.party_id ) { WFIFOHEAD(tsd->fd, len); memcpy(WFIFOP(tsd->fd,0), buf, len); @@ -521,7 +525,7 @@ bool clif_send(const void* buf, int len, struct block_list* bl, enum send_target if (!sd || !sd->duel_group) break; //Invalid usage. iter = mapit_getallusers(); - while( (tsd = (TBL_PC*)mapit->next(iter)) != NULL ) { + while ((tsd = BL_UCAST(BL_PC, mapit->next(iter))) != NULL) { if( type == DUEL_WOS && bl->id == tsd->bl.id ) continue; if( sd->duel_group == tsd->duel_group ) { @@ -584,7 +588,7 @@ bool clif_send(const void* buf, int len, struct block_list* bl, enum send_target break; iter = mapit_getallusers(); - while( (tsd = (TBL_PC*)mapit->next(iter)) != NULL ) { + while ((tsd = BL_UCAST(BL_PC, mapit->next(iter))) != NULL) { if( tsd->guildspy == g->guild_id ) { WFIFOHEAD(tsd->fd, len); memcpy(WFIFOP(tsd->fd,0), buf, len); @@ -946,7 +950,7 @@ void clif_set_unit_idle2(struct block_list* bl, struct map_session_data *tsd, en p.speed = status->get_speed(bl); p.bodyState = (sc) ? sc->opt1 : 0; p.healthState = (sc) ? sc->opt2 : 0; - p.effectState = (sc) ? sc->option : bl->type == BL_NPC ? ((TBL_NPC*)bl)->option : 0; + p.effectState = (sc != NULL) ? sc->option : ((bl->type == BL_NPC) ? BL_UCCAST(BL_NPC, bl)->option : 0); p.job = vd->class_; p.head = vd->hair_style; p.weapon = vd->weapon; @@ -1013,7 +1017,7 @@ void clif_set_unit_idle(struct block_list* bl, struct map_session_data *tsd, enu p.speed = status->get_speed(bl); p.bodyState = (sc) ? sc->opt1 : 0; p.healthState = (sc) ? sc->opt2 : 0; - p.effectState = (sc) ? sc->option : bl->type == BL_NPC ? ((TBL_NPC*)bl)->option : 0; + p.effectState = (sc != NULL) ? sc->option : ((bl->type == BL_NPC) ? BL_UCCAST(BL_NPC, bl)->option : 0); p.job = vd->class_; p.head = vd->hair_style; p.weapon = vd->weapon; @@ -1049,9 +1053,10 @@ void clif_set_unit_idle(struct block_list* bl, struct map_session_data *tsd, enu #endif #if PACKETVER >= 20120221 if (battle_config.show_monster_hp_bar && bl->type == BL_MOB && status_get_hp(bl) < status_get_max_hp(bl)) { + const struct mob_data *md = BL_UCCAST(BL_MOB, bl); p.maxHP = status_get_max_hp(bl); p.HP = status_get_hp(bl); - p.isBoss = ( ((TBL_MOB*)bl)->spawn && ((TBL_MOB*)bl)->spawn->state.boss ) ? 1 : 0; + p.isBoss = (md->spawn != NULL && md->spawn->state.boss) ? 1 : 0; } else { p.maxHP = -1; p.HP = -1; @@ -1095,7 +1100,7 @@ void clif_spawn_unit2(struct block_list* bl, enum send_target target) { p.speed = status->get_speed(bl); p.bodyState = (sc) ? sc->opt1 : 0; p.healthState = (sc) ? sc->opt2 : 0; - p.effectState = (sc) ? sc->option : bl->type == BL_NPC ? ((TBL_NPC*)bl)->option : 0; + p.effectState = (sc != NULL) ? sc->option : ((bl->type == BL_NPC) ? BL_UCCAST(BL_NPC, bl)->option : 0); p.head = vd->hair_style; p.weapon = vd->weapon; p.accessory = vd->head_bottom; @@ -1153,7 +1158,7 @@ void clif_spawn_unit(struct block_list* bl, enum send_target target) { p.speed = status->get_speed(bl); p.bodyState = (sc) ? sc->opt1 : 0; p.healthState = (sc) ? sc->opt2 : 0; - p.effectState = (sc) ? sc->option : bl->type == BL_NPC ? ((TBL_NPC*)bl)->option : 0; + p.effectState = (sc != NULL) ? sc->option : ((bl->type == BL_NPC) ? BL_UCCAST(BL_NPC, bl)->option : 0); p.job = vd->class_; p.head = vd->hair_style; p.weapon = vd->weapon; @@ -1188,9 +1193,10 @@ void clif_spawn_unit(struct block_list* bl, enum send_target target) { #endif #if PACKETVER >= 20120221 if (battle_config.show_monster_hp_bar && bl->type == BL_MOB && status_get_hp(bl) < status_get_max_hp(bl)) { + const struct mob_data *md = BL_UCCAST(BL_MOB, bl); p.maxHP = status_get_max_hp(bl); p.HP = status_get_hp(bl); - p.isBoss = ( ((TBL_MOB*)bl)->spawn && ((TBL_MOB*)bl)->spawn->state.boss ) ? 1 : 0; + p.isBoss = (md->spawn != NULL && md->spawn->state.boss) ? 1 : 0; } else { p.maxHP = -1; p.HP = -1; @@ -1247,7 +1253,7 @@ void clif_set_unit_walking(struct block_list* bl, struct map_session_data *tsd, p.speed = status->get_speed(bl); p.bodyState = (sc) ? sc->opt1 : 0; p.healthState = (sc) ? sc->opt2 : 0; - p.effectState = (sc) ? sc->option : bl->type == BL_NPC ? ((TBL_NPC*)bl)->option : 0; + p.effectState = (sc != NULL) ? sc->option : ((bl->type == BL_NPC) ? BL_UCCAST(BL_NPC, bl)->option : 0); p.job = vd->class_; p.head = vd->hair_style; p.weapon = vd->weapon; @@ -1278,9 +1284,10 @@ void clif_set_unit_walking(struct block_list* bl, struct map_session_data *tsd, #endif #if PACKETVER >= 20120221 if (battle_config.show_monster_hp_bar && bl->type == BL_MOB && status_get_hp(bl) < status_get_max_hp(bl)) { + const struct mob_data *md = BL_UCCAST(BL_MOB, bl); p.maxHP = status_get_max_hp(bl); p.HP = status_get_hp(bl); - p.isBoss = ( ((TBL_MOB*)bl)->spawn && ((TBL_MOB*)bl)->spawn->state.boss ) ? 1 : 0; + p.isBoss = (md->spawn != NULL && md->spawn->state.boss) ? 1 : 0; } else { p.maxHP = -1; p.HP = -1; @@ -1387,8 +1394,7 @@ void clif_weather(int16 m) struct map_session_data *sd=NULL; iter = mapit_getallusers(); - for( sd = (struct map_session_data*)mapit->first(iter); mapit->exists(iter); sd = (struct map_session_data*)mapit->next(iter) ) - { + for (sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); sd = BL_UCAST(BL_PC, mapit->next(iter))) { if( sd->bl.m == m ) clif->weather_check(sd); } @@ -1406,13 +1412,15 @@ bool clif_spawn(struct block_list *bl) if( !vd ) return false; - if( ( bl->type == BL_NPC - && !((TBL_NPC*)bl)->chat_id - && (((TBL_NPC*)bl)->option&OPTION_INVISIBLE) ) // Hide NPC from maya purple card. - || ( vd->class_ == INVISIBLE_CLASS ) - ) + if (vd->class_ == INVISIBLE_CLASS) return true; // Doesn't need to be spawned, so everything is alright + if (bl->type == BL_NPC) { + struct npc_data *nd = BL_UCAST(BL_NPC, bl); + if (nd->chat_id == 0 && (nd->option&OPTION_INVISIBLE)) // Hide NPC from maya purple card. + return true; // Doesn't need to be spawned, so everything is alright + } + clif->spawn_unit(bl,AREA_WOS); if (vd->cloth_color) @@ -1422,47 +1430,47 @@ bool clif_spawn(struct block_list *bl) switch (bl->type) { case BL_PC: - { - TBL_PC *sd = ((TBL_PC*)bl); - int i; - if (sd->spiritball > 0) - clif->spiritball(&sd->bl); - if(sd->state.size==SZ_BIG) // tiny/big players [Valaris] - clif->specialeffect(bl,423,AREA); - else if(sd->state.size==SZ_MEDIUM) - clif->specialeffect(bl,421,AREA); - if( sd->bg_id && map->list[sd->bl.m].flag.battleground ) - clif->sendbgemblem_area(sd); - for( i = 0; i < sd->sc_display_count; i++ ) { - clif->sc_load(&sd->bl, sd->bl.id,AREA,status->dbs->IconChangeTable[sd->sc_display[i]->type],sd->sc_display[i]->val1,sd->sc_display[i]->val2,sd->sc_display[i]->val3); - } - if (sd->charm_type != CHARM_TYPE_NONE && sd->charm_count > 0) - clif->spiritcharm(sd); - if (sd->status.robe) - clif->refreshlook(bl,bl->id,LOOK_ROBE,sd->status.robe,AREA); + { + struct map_session_data *sd = BL_UCAST(BL_PC, bl); + int i; + if (sd->spiritball > 0) + clif->spiritball(&sd->bl); + if (sd->state.size == SZ_BIG) // tiny/big players [Valaris] + clif->specialeffect(bl,423,AREA); + else if (sd->state.size == SZ_MEDIUM) + clif->specialeffect(bl,421,AREA); + if (sd->bg_id != 0 && map->list[sd->bl.m].flag.battleground) + clif->sendbgemblem_area(sd); + for (i = 0; i < sd->sc_display_count; i++) { + clif->sc_load(&sd->bl, sd->bl.id,AREA,status->dbs->IconChangeTable[sd->sc_display[i]->type],sd->sc_display[i]->val1,sd->sc_display[i]->val2,sd->sc_display[i]->val3); } + if (sd->charm_type != CHARM_TYPE_NONE && sd->charm_count > 0) + clif->spiritcharm(sd); + if (sd->status.robe) + clif->refreshlook(bl,bl->id,LOOK_ROBE,sd->status.robe,AREA); + } break; case BL_MOB: - { - TBL_MOB *md = ((TBL_MOB*)bl); - if(md->special_state.size==SZ_BIG) // tiny/big mobs [Valaris] - clif->specialeffect(&md->bl,423,AREA); - else if(md->special_state.size==SZ_MEDIUM) - clif->specialeffect(&md->bl,421,AREA); - } + { + struct mob_data *md = BL_UCAST(BL_MOB, bl); + if (md->special_state.size==SZ_BIG) // tiny/big mobs [Valaris] + clif->specialeffect(&md->bl,423,AREA); + else if (md->special_state.size==SZ_MEDIUM) + clif->specialeffect(&md->bl,421,AREA); + } break; case BL_NPC: - { - TBL_NPC *nd = ((TBL_NPC*)bl); - if( nd->size == SZ_BIG ) - clif->specialeffect(&nd->bl,423,AREA); - else if( nd->size == SZ_MEDIUM ) - clif->specialeffect(&nd->bl,421,AREA); - } + { + struct npc_data *nd = BL_UCAST(BL_NPC, bl); + if (nd->size == SZ_BIG) + clif->specialeffect(&nd->bl,423,AREA); + else if (nd->size == SZ_MEDIUM) + clif->specialeffect(&nd->bl,421,AREA); + } break; case BL_PET: if (vd->head_bottom) - clif->send_petdata(NULL, (TBL_PET*)bl, 3, vd->head_bottom); // needed to display pet equip properly + clif->send_petdata(NULL, BL_UCAST(BL_PET, bl), 3, vd->head_bottom); // needed to display pet equip properly break; } return true; @@ -1688,27 +1696,27 @@ void clif_move2(struct block_list *bl, struct view_data *vd, struct unit_data *u switch(bl->type) { case BL_PC: - { - TBL_PC *sd = ((TBL_PC*)bl); - //clif_movepc(sd); - if(sd->state.size==SZ_BIG) // tiny/big players [Valaris] - clif->specialeffect(&sd->bl,423,AREA); - else if(sd->state.size==SZ_MEDIUM) - clif->specialeffect(&sd->bl,421,AREA); - } + { + struct map_session_data *sd = BL_UCAST(BL_PC, bl); + //clif_movepc(sd); + if(sd->state.size==SZ_BIG) // tiny/big players [Valaris] + clif->specialeffect(&sd->bl,423,AREA); + else if(sd->state.size==SZ_MEDIUM) + clif->specialeffect(&sd->bl,421,AREA); + } break; case BL_MOB: - { - TBL_MOB *md = ((TBL_MOB*)bl); - if(md->special_state.size==SZ_BIG) // tiny/big mobs [Valaris] - clif->specialeffect(&md->bl,423,AREA); - else if(md->special_state.size==SZ_MEDIUM) - clif->specialeffect(&md->bl,421,AREA); - } + { + struct mob_data *md = BL_UCAST(BL_MOB, bl); + if (md->special_state.size == SZ_BIG) // tiny/big mobs [Valaris] + clif->specialeffect(&md->bl,423,AREA); + else if (md->special_state.size == SZ_MEDIUM) + clif->specialeffect(&md->bl,421,AREA); + } break; case BL_PET: if( vd->head_bottom ) // needed to display pet equip properly - clif->send_petdata(NULL, (TBL_PET*)bl, 3, vd->head_bottom); + clif->send_petdata(NULL, BL_UCAST(BL_PET, bl), 3, vd->head_bottom); break; } #ifdef ANTI_MAYAP_CHEAT @@ -1735,11 +1743,12 @@ void clif_move(struct unit_data *ud) if (!vd || vd->class_ == INVISIBLE_CLASS) return; //This performance check is needed to keep GM-hidden objects from being notified to bots. - /** - * Hide NPC from maya purple card. - **/ - if(bl->type == BL_NPC && !((TBL_NPC*)bl)->chat_id && (((TBL_NPC*)bl)->option&OPTION_INVISIBLE)) - return; + if (bl->type == BL_NPC) { + // Hide NPC from maya purple card. + struct npc_data *nd = BL_UCAST(BL_NPC, bl); + if (nd->chat_id == 0 && (nd->option&OPTION_INVISIBLE)) + return; + } if (ud->state.speed_changed) { // Since we don't know how to update the speed of other objects, @@ -2765,16 +2774,15 @@ void clif_guild_xy_remove(struct map_session_data *sd) /*========================================== * *------------------------------------------*/ -int clif_hpmeter_sub(struct block_list *bl, va_list ap) { - struct map_session_data *sd, *tsd; +int clif_hpmeter_sub(struct block_list *bl, va_list ap) +{ #if PACKETVER < 20100126 const int cmd = 0x106; #else const int cmd = 0x80e; #endif - - sd = va_arg(ap, struct map_session_data *); - tsd = (TBL_PC *)bl; + struct map_session_data *sd = va_arg(ap, struct map_session_data *); + struct map_session_data *tsd = BL_CAST(BL_PC, bl); nullpo_ret(sd); nullpo_ret(tsd); @@ -3491,7 +3499,7 @@ void clif_changeoption(struct block_list* bl) WBUFL(buf,2) = bl->id; WBUFW(buf,6) = (sc) ? sc->opt1 : 0; WBUFW(buf,8) = (sc) ? sc->opt2 : 0; - WBUFL(buf,10) = (sc) ? sc->option : bl->type == BL_NPC ? ((TBL_NPC*)bl)->option : 0; + WBUFL(buf,10) = (sc != NULL) ? sc->option : ((bl->type == BL_NPC) ? BL_UCCAST(BL_NPC, bl)->option : 0); WBUFB(buf,14) = (sd)? sd->status.karma : 0; if(disguised(bl)) { clif->send(buf,packet_len(0x229),bl,AREA_WOS); @@ -3507,7 +3515,7 @@ void clif_changeoption(struct block_list* bl) WBUFL(buf,2) = bl->id; WBUFW(buf,6) = (sc) ? sc->opt1 : 0; WBUFW(buf,8) = (sc) ? sc->opt2 : 0; - WBUFL(buf,10) = (sc) ? sc->option : bl->type == BL_NPC ? ((TBL_NPC*)bl)->option : 0; + WBUFL(buf,10) = (sc != NULL) ? sc->option : ((bl->type == BL_NPC) ? BL_UCCAST(BL_NPC, bl)->option : 0); WBUFB(buf,12) = (sd)? sd->status.karma : 0; if(disguised(bl)) { clif->send(buf,packet_len(0x119),bl,AREA_WOS); @@ -3532,7 +3540,7 @@ void clif_changeoption2(struct block_list* bl) { WBUFW(buf,0) = 0x28a; WBUFL(buf,2) = bl->id; - WBUFL(buf,6) = (sc) ? sc->option : bl->type == BL_NPC ? ((TBL_NPC*)bl)->option : 0; + WBUFL(buf,6) = (sc != NULL) ? sc->option : ((bl->type == BL_NPC) ? BL_UCCAST(BL_NPC, bl)->option : 0); WBUFL(buf,10) = clif_setlevel(bl); WBUFL(buf,14) = (sc) ? sc->opt3 : 0; if(disguised(bl)) { @@ -3742,10 +3750,11 @@ void clif_joinchatok(struct map_session_data *sd,struct chat_data* cd) WFIFOW(fd, 2) = 8 + (28*(cd->users+t)); WFIFOL(fd, 4) = cd->bl.id; - if(cd->owner->type == BL_NPC){ + if(cd->owner->type == BL_NPC) { + const struct npc_data *nd = BL_UCCAST(BL_NPC, cd->owner); WFIFOL(fd, 30) = 1; WFIFOL(fd, 8) = 0; - memcpy(WFIFOP(fd, 12), ((struct npc_data *)cd->owner)->name, NAME_LENGTH); + memcpy(WFIFOP(fd, 12), nd->name, NAME_LENGTH); for (i = 0; i < cd->users; i++) { WFIFOL(fd, 8+(i+1)*28) = 1; memcpy(WFIFOP(fd, 8+(i+t)*28+4), cd->usersd[i]->status.name, NAME_LENGTH); @@ -4120,8 +4129,8 @@ void clif_getareachar_pc(struct map_session_data* sd,struct map_session_data* ds nullpo_retv(sd); nullpo_retv(dstsd); if( dstsd->chatID ) { - struct chat_data *cd = NULL; - if( (cd = (struct chat_data*)map->id2bl(dstsd->chatID)) && cd->usersd[0]==dstsd) + struct chat_data *cd = map->id2cd(dstsd->chatID); + if (cd != NULL && cd->usersd[0] == dstsd) clif->dispchat(cd,sd->fd); } else if( dstsd->state.vending ) clif->showvendingboard(&dstsd->bl,dstsd->message,sd->fd); @@ -4164,11 +4173,12 @@ void clif_getareachar_unit(struct map_session_data* sd,struct block_list *bl) { if (!vd || vd->class_ == INVISIBLE_CLASS) return; - /** - * Hide NPC from maya purple card. - **/ - if(bl->type == BL_NPC && !((TBL_NPC*)bl)->chat_id && (((TBL_NPC*)bl)->option&OPTION_INVISIBLE)) - return; + if (bl->type == BL_NPC) { + // Hide NPC from maya purple card. + struct npc_data *nd = BL_UCAST(BL_NPC, bl); + if (nd->chat_id == 0 && (nd->option&OPTION_INVISIBLE)) + return; + } if ( ( ud = unit->bl2ud(bl) ) && ud->walktimer != INVALID_TIMER ) clif->set_unit_walking(bl,sd,ud,SELF); @@ -4182,57 +4192,60 @@ void clif_getareachar_unit(struct map_session_data* sd,struct block_list *bl) { switch (bl->type) { case BL_PC: - { - TBL_PC* tsd = (TBL_PC*)bl; - clif->getareachar_pc(sd, tsd); - if(tsd->state.size==SZ_BIG) // tiny/big players [Valaris] - clif->specialeffect_single(bl,423,sd->fd); - else if(tsd->state.size==SZ_MEDIUM) - clif->specialeffect_single(bl,421,sd->fd); - if( tsd->bg_id && map->list[tsd->bl.m].flag.battleground ) - clif->sendbgemblem_single(sd->fd,tsd); - if ( tsd->status.robe ) - clif->refreshlook(&sd->bl,bl->id,LOOK_ROBE,tsd->status.robe,SELF); - } + { + struct map_session_data *tsd = BL_UCAST(BL_PC, bl); + clif->getareachar_pc(sd, tsd); + if (tsd->state.size == SZ_BIG) // tiny/big players [Valaris] + clif->specialeffect_single(bl,423,sd->fd); + else if (tsd->state.size == SZ_MEDIUM) + clif->specialeffect_single(bl,421,sd->fd); + if (tsd->bg_id != 0 && map->list[tsd->bl.m].flag.battleground) + clif->sendbgemblem_single(sd->fd,tsd); + if (tsd->status.robe) + clif->refreshlook(&sd->bl,bl->id,LOOK_ROBE,tsd->status.robe,SELF); + } break; case BL_MER: // Devotion Effects - if( ((TBL_MER*)bl)->devotion_flag ) + { + struct mercenary_data *md = BL_UCAST(BL_MER, bl); + if (md->devotion_flag) clif->devotion(bl, sd); + } break; case BL_NPC: - { - TBL_NPC* nd = (TBL_NPC*)bl; - if( nd->chat_id ) - clif->dispchat((struct chat_data*)map->id2bl(nd->chat_id),sd->fd); - if( nd->size == SZ_BIG ) - clif->specialeffect_single(bl,423,sd->fd); - else if( nd->size == SZ_MEDIUM ) - clif->specialeffect_single(bl,421,sd->fd); - } + { + struct npc_data *nd = BL_UCAST(BL_NPC, bl); + if (nd->chat_id != 0) + clif->dispchat(map->id2cd(nd->chat_id), sd->fd); + if (nd->size == SZ_BIG) + clif->specialeffect_single(bl,423,sd->fd); + else if (nd->size == SZ_MEDIUM) + clif->specialeffect_single(bl,421,sd->fd); + } break; case BL_MOB: - { - TBL_MOB* md = (TBL_MOB*)bl; - if(md->special_state.size==SZ_BIG) // tiny/big mobs [Valaris] - clif->specialeffect_single(bl,423,sd->fd); - else if(md->special_state.size==SZ_MEDIUM) - clif->specialeffect_single(bl,421,sd->fd); + { + struct mob_data *md = BL_UCAST(BL_MOB, bl); + if (md->special_state.size == SZ_BIG) // tiny/big mobs [Valaris] + clif->specialeffect_single(bl,423,sd->fd); + else if (md->special_state.size == SZ_MEDIUM) + clif->specialeffect_single(bl,421,sd->fd); #if (PACKETVER >= 20120404 && PACKETVER < 20131223) - if (battle_config.show_monster_hp_bar && !(md->status.mode&MD_BOSS)) { - int i; - for(i = 0; i < DAMAGELOG_SIZE; i++) {// must show hp bar to all char who already hit the mob. - if (md->dmglog[i].id == sd->status.char_id) { - clif->monster_hp_bar(md, sd); - break; - } + if (battle_config.show_monster_hp_bar && !(md->status.mode&MD_BOSS)) { + int i; + for (i = 0; i < DAMAGELOG_SIZE; i++) {// must show hp bar to all char who already hit the mob. + if (md->dmglog[i].id == sd->status.char_id) { + clif->monster_hp_bar(md, sd); + break; } } -#endif } +#endif + } break; case BL_PET: if (vd->head_bottom) - clif->send_petdata(NULL, (TBL_PET*)bl, 3, vd->head_bottom); // needed to display pet equip properly + clif->send_petdata(NULL, BL_UCAST(BL_PET, bl), 3, vd->head_bottom); // needed to display pet equip properly break; } } @@ -4522,8 +4535,10 @@ void clif_getareachar_skillunit(struct block_list *bl, struct skill_unit *su, en clif->send(&p,sizeof(p),bl,target); - if(su->group->skill_id == WZ_ICEWALL) - clif->changemapcell(bl->type == BL_PC ? ((TBL_PC*)bl)->fd : 0,su->bl.m,su->bl.x,su->bl.y,5,SELF); + if (su->group->skill_id == WZ_ICEWALL) { + struct map_session_data *sd = BL_CAST(BL_PC, bl); + clif->changemapcell(sd != NULL ? sd->fd : 0, su->bl.m, su->bl.x, su->bl.y, 5, SELF); + } } /*========================================== @@ -4582,10 +4597,10 @@ int clif_getareachar(struct block_list* bl,va_list ap) { switch(bl->type){ case BL_ITEM: - clif->getareachar_item(sd,(struct flooritem_data*) bl); + clif->getareachar_item(sd, BL_UCAST(BL_ITEM, bl)); break; case BL_SKILL: - clif->getareachar_skillunit(&sd->bl,(TBL_SKILL*)bl,SELF); + clif->getareachar_skillunit(&sd->bl, BL_UCAST(BL_SKILL, bl), SELF); break; default: if(&sd->bl == bl) @@ -4603,7 +4618,7 @@ int clif_outsight(struct block_list *bl,va_list ap) { struct block_list *tbl; struct view_data *vd; - TBL_PC *sd, *tsd; + struct map_session_data *sd, *tsd; tbl=va_arg(ap,struct block_list*); if(bl == tbl) return 0; // bl can be null pointer? and after if BL_PC, sd will be null pointer too @@ -4616,9 +4631,8 @@ int clif_outsight(struct block_list *bl,va_list ap) case BL_PC: if (sd->vd.class_ != INVISIBLE_CLASS) clif->clearunit_single(bl->id,CLR_OUTSIGHT,tsd->fd); - if(sd->chatID){ - struct chat_data *cd; - cd=(struct chat_data*)map->id2bl(sd->chatID); + if (sd->chatID) { + struct chat_data *cd = map->id2cd(sd->chatID); if(cd->usersd[0]==sd) clif->dispchat(cd,tsd->fd); } @@ -4628,13 +4642,13 @@ int clif_outsight(struct block_list *bl,va_list ap) clif->buyingstore_disappear_entry_single(tsd, sd); break; case BL_ITEM: - clif->clearflooritem((struct flooritem_data*)bl,tsd->fd); + clif->clearflooritem(BL_UCAST(BL_ITEM, bl), tsd->fd); break; case BL_SKILL: - clif->clearchar_skillunit((struct skill_unit *)bl,tsd->fd); + clif->clearchar_skillunit(BL_UCAST(BL_SKILL, bl), tsd->fd); break; case BL_NPC: - if( !(((TBL_NPC*)bl)->option&OPTION_INVISIBLE) ) + if (!(BL_UCAST(BL_NPC, bl)->option&OPTION_INVISIBLE)) clif->clearunit_single(bl->id,CLR_OUTSIGHT,tsd->fd); break; default: @@ -4645,10 +4659,10 @@ int clif_outsight(struct block_list *bl,va_list ap) } if (sd && sd->fd) { //sd is watching tbl go out of view. nullpo_ret(tbl); - if(tbl->type == BL_SKILL) //Trap knocked out of sight - clif->clearchar_skillunit((struct skill_unit *)tbl,sd->fd); - else if (((vd=status->get_viewdata(tbl)) && vd->class_ != INVISIBLE_CLASS) && - !(tbl->type == BL_NPC && (((TBL_NPC*)tbl)->option&OPTION_INVISIBLE))) + if (tbl->type == BL_SKILL) //Trap knocked out of sight + clif->clearchar_skillunit(BL_UCAST(BL_SKILL, tbl), sd->fd); + else if ((vd = status->get_viewdata(tbl)) && vd->class_ != INVISIBLE_CLASS + && !(tbl->type == BL_NPC && (BL_UCAST(BL_NPC, tbl)->option&OPTION_INVISIBLE))) clif->clearunit_single(tbl->id,CLR_OUTSIGHT,sd->fd); } return 0; @@ -4660,7 +4674,7 @@ int clif_outsight(struct block_list *bl,va_list ap) int clif_insight(struct block_list *bl,va_list ap) { struct block_list *tbl; - TBL_PC *sd, *tsd; + struct map_session_data *sd, *tsd; tbl=va_arg(ap,struct block_list*); if (bl == tbl) return 0; @@ -4672,10 +4686,10 @@ int clif_insight(struct block_list *bl,va_list ap) nullpo_ret(bl); switch(bl->type) { case BL_ITEM: - clif->getareachar_item(tsd,(struct flooritem_data*)bl); + clif->getareachar_item(tsd, BL_UCAST(BL_ITEM, bl)); break; case BL_SKILL: - clif->getareachar_skillunit(&tsd->bl,(TBL_SKILL*)bl,SELF); + clif->getareachar_skillunit(&tsd->bl, BL_UCAST(BL_SKILL, bl), SELF); break; default: clif->getareachar_unit(tsd,bl); @@ -5669,11 +5683,13 @@ void clif_resurrection(struct block_list *bl,int type) clif->send(buf,packet_len(0x148),bl, type == 1 ? AREA : AREA_WOS); if (disguised(bl)) { - if( ((TBL_PC*)bl)->fontcolor ) { + struct map_session_data *sd = BL_UCAST(BL_PC, bl); + if (sd->fontcolor) { WBUFL(buf,2)=-bl->id; clif->send(buf,packet_len(0x148),bl, SELF); - } else + } else { clif->spawn(bl); + } } } @@ -7013,8 +7029,8 @@ void clif_devotion(struct block_list *src, struct map_session_data *tsd) *------------------------------------------*/ void clif_spiritball(struct block_list *bl) { unsigned char buf[16]; - TBL_PC *sd = BL_CAST(BL_PC,bl); - TBL_HOM *hd = BL_CAST(BL_HOM,bl); + struct map_session_data *sd = BL_CAST(BL_PC,bl); + struct homun_data *hd = BL_CAST(BL_HOM,bl); nullpo_retv(bl); @@ -8353,114 +8369,110 @@ void clif_charnameack (int fd, struct block_list *bl) switch( bl->type ) { case BL_PC: - { - struct map_session_data *ssd = (struct map_session_data *)bl; - struct party_data *p = NULL; - struct guild *g = NULL; - int ps = -1; - - //Requesting your own "shadow" name. [Skotlex] - if (ssd->fd == fd && ssd->disguise != -1) - WBUFL(buf,2) = -bl->id; - - if( ssd->fakename[0] ) { - WBUFW(buf, 0) = cmd = 0x195; - memcpy(WBUFP(buf,6), ssd->fakename, NAME_LENGTH); - WBUFB(buf,30) = WBUFB(buf,54) = WBUFB(buf,78) = 0; - break; - } - memcpy(WBUFP(buf,6), ssd->status.name, NAME_LENGTH); + { + const struct map_session_data *ssd = BL_UCCAST(BL_PC, bl); + const struct party_data *p = NULL; + const struct guild *g = NULL; + int ps = -1; - if( ssd->status.party_id ) { - p = party->search(ssd->status.party_id); - } - if( ssd->status.guild_id ) { - if ((g = ssd->guild ) != NULL) { - int i; - ARR_FIND(0, g->max_member, i, g->member[i].account_id == ssd->status.account_id && g->member[i].char_id == ssd->status.char_id); - if( i < g->max_member ) ps = g->member[i].position; - } - } + //Requesting your own "shadow" name. [Skotlex] + if (ssd->fd == fd && ssd->disguise != -1) + WBUFL(buf,2) = -bl->id; + + if (ssd->fakename[0] != '\0') { + WBUFW(buf, 0) = cmd = 0x195; + memcpy(WBUFP(buf,6), ssd->fakename, NAME_LENGTH); + WBUFB(buf,30) = WBUFB(buf,54) = WBUFB(buf,78) = 0; + break; + } + memcpy(WBUFP(buf,6), ssd->status.name, NAME_LENGTH); - if( !battle_config.display_party_name && g == NULL ) {// do not display party unless the player is also in a guild - p = NULL; + if (ssd->status.party_id != 0) { + p = party->search(ssd->status.party_id); + } + if (ssd->status.guild_id != 0) { + if ((g = ssd->guild) != NULL) { + int i; + ARR_FIND(0, g->max_member, i, g->member[i].account_id == ssd->status.account_id && g->member[i].char_id == ssd->status.char_id); + if (i < g->max_member) + ps = g->member[i].position; } + } - if (p == NULL && g == NULL) - break; + if (!battle_config.display_party_name && g == NULL) { + // do not display party unless the player is also in a guild + p = NULL; + } - WBUFW(buf, 0) = cmd = 0x195; - if (p) - memcpy(WBUFP(buf,30), p->party.name, NAME_LENGTH); - else - WBUFB(buf,30) = 0; + if (p == NULL && g == NULL) + break; - if (g && ps >= 0 && ps < MAX_GUILDPOSITION) - { - memcpy(WBUFP(buf,54), g->name,NAME_LENGTH); - memcpy(WBUFP(buf,78), g->position[ps].name, NAME_LENGTH); - } else { //Assume no guild. - WBUFB(buf,54) = 0; - WBUFB(buf,78) = 0; - } + WBUFW(buf, 0) = cmd = 0x195; + if (p != NULL) + memcpy(WBUFP(buf,30), p->party.name, NAME_LENGTH); + else + WBUFB(buf,30) = 0; + + if (g != NULL && ps >= 0 && ps < MAX_GUILDPOSITION) { + memcpy(WBUFP(buf,54), g->name,NAME_LENGTH); + memcpy(WBUFP(buf,78), g->position[ps].name, NAME_LENGTH); + } else { //Assume no guild. + WBUFB(buf,54) = 0; + WBUFB(buf,78) = 0; } + } break; //[blackhole89] case BL_HOM: - memcpy(WBUFP(buf,6), ((TBL_HOM*)bl)->homunculus.name, NAME_LENGTH); + memcpy(WBUFP(buf,6), BL_UCCAST(BL_HOM, bl)->homunculus.name, NAME_LENGTH); break; case BL_MER: - memcpy(WBUFP(buf,6), ((TBL_MER*)bl)->db->name, NAME_LENGTH); + memcpy(WBUFP(buf,6), BL_UCCAST(BL_MER, bl)->db->name, NAME_LENGTH); break; case BL_PET: - memcpy(WBUFP(buf,6), ((TBL_PET*)bl)->pet.name, NAME_LENGTH); + memcpy(WBUFP(buf,6), BL_UCCAST(BL_PET, bl)->pet.name, NAME_LENGTH); break; case BL_NPC: - memcpy(WBUFP(buf,6), ((TBL_NPC*)bl)->name, NAME_LENGTH); + memcpy(WBUFP(buf,6), BL_UCCAST(BL_NPC, bl)->name, NAME_LENGTH); break; case BL_MOB: - { - struct mob_data *md = (struct mob_data *)bl; - nullpo_retv(md); - - memcpy(WBUFP(buf,6), md->name, NAME_LENGTH); - if( md->guardian_data && md->guardian_data->g ) - { - WBUFW(buf, 0) = cmd = 0x195; - WBUFB(buf,30) = 0; - memcpy(WBUFP(buf,54), md->guardian_data->g->name, NAME_LENGTH); - memcpy(WBUFP(buf,78), md->guardian_data->castle->castle_name, NAME_LENGTH); - } - else if( battle_config.show_mob_info ) - { - char mobhp[50], *str_p = mobhp; - WBUFW(buf, 0) = cmd = 0x195; - if( battle_config.show_mob_info&4 ) - str_p += sprintf(str_p, "Lv. %d | ", md->level); - if( battle_config.show_mob_info&1 ) - str_p += sprintf(str_p, "HP: %u/%u | ", md->status.hp, md->status.max_hp); - if( battle_config.show_mob_info&2 ) - str_p += sprintf(str_p, "HP: %u%% | ", get_percentage(md->status.hp, md->status.max_hp)); - //Even thought mobhp ain't a name, we send it as one so the client - //can parse it. [Skotlex] - if( str_p != mobhp ) - { - *(str_p-3) = '\0'; //Remove trailing space + pipe. - memcpy(WBUFP(buf,30), mobhp, NAME_LENGTH); - WBUFB(buf,54) = 0; - WBUFB(buf,78) = 0; - } + { + const struct mob_data *md = BL_UCCAST(BL_MOB, bl); + + memcpy(WBUFP(buf,6), md->name, NAME_LENGTH); + if (md->guardian_data && md->guardian_data->g) { + WBUFW(buf, 0) = cmd = 0x195; + WBUFB(buf,30) = 0; + memcpy(WBUFP(buf,54), md->guardian_data->g->name, NAME_LENGTH); + memcpy(WBUFP(buf,78), md->guardian_data->castle->castle_name, NAME_LENGTH); + } else if (battle_config.show_mob_info) { + char mobhp[50], *str_p = mobhp; + WBUFW(buf, 0) = cmd = 0x195; + if (battle_config.show_mob_info&4) + str_p += sprintf(str_p, "Lv. %d | ", md->level); + if (battle_config.show_mob_info&1) + str_p += sprintf(str_p, "HP: %u/%u | ", md->status.hp, md->status.max_hp); + if (battle_config.show_mob_info&2) + str_p += sprintf(str_p, "HP: %u%% | ", get_percentage(md->status.hp, md->status.max_hp)); + //Even thought mobhp ain't a name, we send it as one so the client + //can parse it. [Skotlex] + if (str_p != mobhp) { + *(str_p-3) = '\0'; //Remove trailing space + pipe. + memcpy(WBUFP(buf,30), mobhp, NAME_LENGTH); + WBUFB(buf,54) = 0; + WBUFB(buf,78) = 0; } } + } break; case BL_CHAT: #if 0 //FIXME: Clients DO request this... what should be done about it? The chat's title may not fit... [Skotlex] - memcpy(WBUFP(buf,6), (struct chat*)->title, NAME_LENGTH); + memcpy(WBUFP(buf,6), BL_UCCAST(BL_CHAT, bl)->title, NAME_LENGTH); break; #endif return; case BL_ELEM: - memcpy(WBUFP(buf,6), ((TBL_ELEM*)bl)->db->name, NAME_LENGTH); + memcpy(WBUFP(buf,6), BL_UCCAST(BL_ELEM, bl)->db->name, NAME_LENGTH); break; default: ShowError("clif_charnameack: bad type %d(%d)\n", bl->type, bl->id); @@ -8468,9 +8480,9 @@ void clif_charnameack (int fd, struct block_list *bl) } // if no recipient specified just update nearby clients - if (fd == 0) + if (fd == 0) { clif->send(buf, packet_len(cmd), bl, AREA); - else { + } else { WFIFOHEAD(fd, packet_len(cmd)); memcpy(WFIFOP(fd, 0), buf, packet_len(cmd)); WFIFOSET(fd, packet_len(cmd)); @@ -9087,7 +9099,7 @@ void clif_parse_WantToConnection(int fd, struct map_session_data* sd) { return; } - CREATE(sd, TBL_PC, 1); + CREATE(sd, struct map_session_data, 1); sd->fd = fd; sd->cryptKey = (( ((( clif->cryptKey[0] * clif->cryptKey[1] ) + clif->cryptKey[2]) & 0xFFFFFFFF) @@ -9890,7 +9902,7 @@ void clif_changed_dir(struct block_list *bl, enum send_target target) nullpo_retv(bl); WBUFW(buf,0) = 0x9c; WBUFL(buf,2) = bl->id; - WBUFW(buf,6) = bl->type==BL_PC?((TBL_PC*)bl)->head_dir:0; + WBUFW(buf,6) = bl->type == BL_PC ? BL_UCCAST(BL_PC, bl)->head_dir : 0; WBUFB(buf,8) = unit->getdir(bl); clif->send(buf, packet_len(0x9c), bl, target); @@ -9973,9 +9985,8 @@ void clif_parse_HowManyConnections(int fd, struct map_session_data *sd) { clif->user_count(sd, map->getusers()); } -void clif_parse_ActionRequest_sub(struct map_session_data *sd, int action_type, int target_id, int64 tick) { - struct block_list *target = NULL; - +void clif_parse_ActionRequest_sub(struct map_session_data *sd, int action_type, int target_id, int64 tick) +{ nullpo_retv(sd); if (pc_isdead(sd)) { clif->clearunit_area(&sd->bl, CLR_DEAD); @@ -10002,8 +10013,10 @@ void clif_parse_ActionRequest_sub(struct map_session_data *sd, int action_type, switch(action_type) { case 0x00: // once attack case 0x07: // continuous attack - if( (target = map->id2bl(target_id)) && target->type == BL_NPC ) { - npc->click(sd,(TBL_NPC*)target); + { + struct npc_data *nd = map->id2nd(target_id); + if (nd != NULL) { + npc->click(sd, nd); return; } @@ -10023,6 +10036,7 @@ void clif_parse_ActionRequest_sub(struct map_session_data *sd, int action_type, pc->delinvincibletimer(sd); pc->update_idle_time(sd, BCIDLE_ATTACK); unit->attack(&sd->bl, target_id, action_type != 0); + } break; case 0x02: // sitdown if (battle_config.basic_skill_check && pc->checkskill(sd, NV_BASIC) < 3) { @@ -10280,13 +10294,10 @@ void clif_parse_TakeItem(int fd, struct map_session_data *sd) __attribute__((non /// 009f <id>.L (CZ_ITEM_PICKUP) /// 0362 <id>.L (CZ_ITEM_PICKUP2) /// There are various variants of this packet, some of them have padding between fields. -void clif_parse_TakeItem(int fd, struct map_session_data *sd) { - struct flooritem_data *fitem; - int map_object_id; - - map_object_id = RFIFOL(fd,packet_db[RFIFOW(fd,0)].pos[0]); - - fitem = (struct flooritem_data*)map->id2bl(map_object_id); +void clif_parse_TakeItem(int fd, struct map_session_data *sd) +{ + int map_object_id = RFIFOL(fd,packet_db[RFIFOW(fd,0)].pos[0]); + struct flooritem_data *fitem = map->id2fi(map_object_id); do { if (pc_isdead(sd)) { @@ -10294,7 +10305,7 @@ void clif_parse_TakeItem(int fd, struct map_session_data *sd) { break; } - if (fitem == NULL || fitem->bl.type != BL_ITEM || fitem->bl.m != sd->bl.m) + if (fitem == NULL || fitem->bl.m != sd->bl.m) break; if( sd->sc.count && ( @@ -10490,7 +10501,7 @@ void clif_parse_NpcClicked(int fd,struct map_session_data *sd) break; } if( bl->m != -1 )// the user can't click floating npcs directly (hack attempt) - npc->click(sd,(TBL_NPC*)bl); + npc->click(sd, BL_UCAST(BL_NPC, bl)); break; } } @@ -11370,7 +11381,7 @@ void clif_parse_NpcSelectMenu(int fd,struct map_session_data *sd) #ifdef SECURE_NPCTIMEOUT if( sd->npc_idle_timer != INVALID_TIMER ) { #endif - TBL_NPC* nd = map->id2nd(npc_id); + struct npc_data *nd = map->id2nd(npc_id); ShowWarning("Invalid menu selection on npc %d:'%s' - got %d, valid range is [%d..%d] (player AID:%d, CID:%d, name:'%s')!\n", npc_id, (nd)?nd->name:"invalid npc id", select, 1, sd->npc_menu, sd->bl.id, sd->status.char_id, sd->status.name); clif->GM_kick(NULL,sd); #ifdef SECURE_NPCTIMEOUT @@ -13220,7 +13231,7 @@ void clif_parse_GMKick(int fd, struct map_session_data *sd) { case BL_NPC: { - struct npc_data* nd = (struct npc_data *)target; + struct npc_data *nd = BL_UCAST(BL_NPC, target); if( !pc->can_use_command(sd, "@unloadnpc")) { clif->GM_kickack(sd, 0); return; @@ -17604,7 +17615,7 @@ void clif_status_change_end(struct block_list *bl, int tid, enum send_target tar nullpo_retv(bl); - if( bl->type == BL_PC && !((TBL_PC*)bl)->state.active ) + if (bl->type == BL_PC && !BL_UCAST(BL_PC, bl)->state.active) return; p.PacketType = status_change_endType; @@ -18638,7 +18649,7 @@ unsigned short clif_parse_cmd_optional( int fd, struct map_session_data *sd ) { *------------------------------------------*/ int clif_parse(int fd) { int cmd, packet_len; - TBL_PC* sd; + struct map_session_data *sd; int pnum; //TODO apply delays or disconnect based on packet throughput [FlavioJS] @@ -18648,7 +18659,7 @@ int clif_parse(int fd) { unsigned short (*parse_cmd_func)(int fd, struct map_session_data *sd); // begin main client packet processing loop - sd = (TBL_PC *)sockt->session[fd]->session_data; + sd = sockt->session[fd]->session_data; if (sockt->session[fd]->flag.eof) { if (sd) { diff --git a/src/map/duel.c b/src/map/duel.c index 8f309abe4..c658ea3e3 100644 --- a/src/map/duel.c +++ b/src/map/duel.c @@ -134,7 +134,7 @@ void duel_invite(const unsigned int did, struct map_session_data* sd, struct map // "Blue -- Player %s invites you to PVP duel (@accept/@reject) --" sprintf(output, msg_sd(target_sd,374), sd->status.name); - clif->broadcast((struct block_list *)target_sd, output, strlen(output)+1, BC_BLUE, SELF); + clif->broadcast(&target_sd->bl, output, strlen(output)+1, BC_BLUE, SELF); } static int duel_leave_sub(struct map_session_data* sd, va_list va) diff --git a/src/map/elemental.c b/src/map/elemental.c index a6fe94ab2..a87deb7d7 100644 --- a/src/map/elemental.c +++ b/src/map/elemental.c @@ -273,9 +273,10 @@ int elemental_data_received(struct s_elemental *ele, bool flag) { db = &elemental->db[i]; if( !sd->ed ) { // Initialize it after first summon. - sd->ed = ed = (struct elemental_data*)aCalloc(1,sizeof(struct elemental_data)); + CREATE(ed, struct elemental_data, 1); ed->bl.type = BL_ELEM; ed->bl.id = npc->get_new_npc_id(); + sd->ed = ed; ed->master = sd; ed->db = db; memcpy(&ed->elemental, ele, sizeof(struct s_elemental)); diff --git a/src/map/guild.c b/src/map/guild.c index 10511067a..cba05638f 100644 --- a/src/map/guild.c +++ b/src/map/guild.c @@ -57,8 +57,9 @@ struct guild_interface *guild; /*========================================== * Retrieves and validates the sd pointer for this guild member [Skotlex] *------------------------------------------*/ -TBL_PC* guild_sd_check(int guild_id, int account_id, int char_id) { - TBL_PC* sd = map->id2sd(account_id); +struct map_session_data *guild_sd_check(int guild_id, int account_id, int char_id) +{ + struct map_session_data *sd = map->id2sd(account_id); if (!(sd && sd->status.char_id == char_id)) return NULL; @@ -441,8 +442,7 @@ int guild_check_member(struct guild *g) nullpo_ret(g); iter = mapit_getallusers(); - for( sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); sd = (TBL_PC*)mapit->next(iter) ) - { + for (sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); sd = BL_UCAST(BL_PC, mapit->next(iter))) { if( sd->status.guild_id != g->guild_id ) continue; @@ -465,7 +465,7 @@ int guild_recv_noinfo(int guild_id) struct s_mapiterator* iter; iter = mapit_getallusers(); - for( sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); sd = (TBL_PC*)mapit->next(iter) ) { + for (sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); sd = BL_UCAST(BL_PC, mapit->next(iter))) { if( sd->status.guild_id == guild_id ) sd->status.guild_id = 0; // erase guild } @@ -505,7 +505,7 @@ int guild_recv_info(struct guild *sg) { tg[i] = guild->search(sg->alliance[i].guild_id); } - for( sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); sd = (TBL_PC*)mapit->next(iter) ) { + for (sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); sd = BL_UCAST(BL_PC, mapit->next(iter))) { if (!sd->status.guild_id) continue; // Not interested in guildless users @@ -939,14 +939,14 @@ int guild_member_withdraw(int guild_id, int account_id, int char_id, int flag, c void guild_retrieveitembound(int char_id,int aid,int guild_id) { #ifdef GP_BOUND_ITEMS - TBL_PC *sd = map->charid2sd(char_id); - if(sd){ //Character is online + struct map_session_data *sd = map->charid2sd(char_id); + if (sd != NULL) { //Character is online pc->bound_clear(sd,IBT_GUILD); } else { //Character is offline, ask char server to do the job struct guild_storage *gstor = idb_get(gstorage->db,guild_id); if(gstor && gstor->storage_status == 1) { //Someone is in guild storage, close them struct s_mapiterator* iter = mapit_getallusers(); - for( sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); sd = (TBL_PC*)mapit->next(iter) ) { + for (sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); sd = BL_UCAST(BL_PC, mapit->next(iter))) { if(sd->status.guild_id == guild_id && sd->state.storage_flag == STORAGE_FLAG_GUILD) { gstorage->close(sd); break; @@ -1229,7 +1229,7 @@ int guild_emblem_changed(int len,int guild_id,int emblem_id,const char *data) continue; // update permanent guardians for( i = 0; i < ARRAYLENGTH(gc->guardian); ++i ) { - TBL_MOB* md = (gc->guardian[i].id ? map->id2md(gc->guardian[i].id) : NULL); + struct mob_data *md = gc->guardian[i].id ? map->id2md(gc->guardian[i].id) : NULL; if( md == NULL || md->guardian_data == NULL ) continue; @@ -1237,7 +1237,7 @@ int guild_emblem_changed(int len,int guild_id,int emblem_id,const char *data) } // update temporary guardians for( i = 0; i < gc->temp_guardians_max; ++i ) { - TBL_MOB* md = (gc->temp_guardians[i] ? map->id2md(gc->temp_guardians[i]) : NULL); + struct mob_data *md = gc->temp_guardians[i] ? map->id2md(gc->temp_guardians[i]) : NULL; if( md == NULL || md->guardian_data == NULL ) continue; @@ -1328,7 +1328,7 @@ int guild_getexp(struct map_session_data *sd,int exp) /*==================================================== * Ask to increase guildskill skill_id *---------------------------------------------------*/ -int guild_skillup(TBL_PC* sd, uint16 skill_id) +int guild_skillup(struct map_session_data *sd, uint16 skill_id) { struct guild* g; int idx = skill_id - GD_SKILLBASE; @@ -2208,7 +2208,7 @@ void guild_flag_remove(struct npc_data *nd) { continue; if( cursor != i ) { - memmove(&guild->flags[cursor], &guild->flags[i], sizeof(struct npc_data*)); + memmove(&guild->flags[cursor], &guild->flags[i], sizeof(guild->flags[0])); } cursor++; } diff --git a/src/map/guild.h b/src/map/guild.h index 4b6e860d8..10749f8ad 100644 --- a/src/map/guild.h +++ b/src/map/guild.h @@ -21,11 +21,13 @@ #ifndef MAP_GUILD_H #define MAP_GUILD_H -#include "map/map.h" // EVENT_NAME_LENGTH, TBL_PC +#include "map/map.h" // EVENT_NAME_LENGTH #include "common/hercules.h" #include "common/db.h" #include "common/mmo.h" +struct map_session_data; + /** * Defines **/ @@ -161,7 +163,7 @@ struct guild_interface { void (*retrieveitembound) (int char_id,int aid,int guild_id); /* */ int (*payexp_timer) (int tid, int64 tick, int id, intptr_t data); - TBL_PC* (*sd_check) (int guild_id, int account_id, int char_id); + struct map_session_data *(*sd_check) (int guild_id, int account_id, int char_id); bool (*read_guildskill_tree_db) (char* split[], int columns, int current); bool (*read_castledb) (char* str[], int columns, int current); int (*payexp_timer_sub) (DBKey key, DBData *data, va_list ap); diff --git a/src/map/homunculus.c b/src/map/homunculus.c index d81eeb2da..b642c197f 100644 --- a/src/map/homunculus.c +++ b/src/map/homunculus.c @@ -580,7 +580,7 @@ void homunculus_healed (struct homun_data *hd) { void homunculus_save(struct homun_data *hd) { // copy data that must be saved in homunculus struct ( hp / sp ) - TBL_PC * sd; + struct map_session_data *sd = NULL; //Do not check for max_hp/max_sp caps as current could be higher to max due //to status changes/skills (they will be capped as needed upon stat //calculation on login) @@ -786,9 +786,10 @@ bool homunculus_create(struct map_session_data *sd, struct s_homunculus *hom) { intif->homunculus_requestdelete(hom->hom_id); return false; } - sd->hd = hd = (struct homun_data*)aCalloc(1,sizeof(struct homun_data)); + CREATE(hd, struct homun_data, 1); hd->bl.type = BL_HOM; hd->bl.id = npc->get_new_npc_id(); + sd->hd = hd; hd->master = sd; hd->homunculusDB = &homun->dbs->db[i]; diff --git a/src/map/instance.c b/src/map/instance.c index ff6f8bdab..5e8256c88 100644 --- a/src/map/instance.c +++ b/src/map/instance.c @@ -369,21 +369,31 @@ int instance_mapid2imapid(int16 m, int instance_id) { /*-------------------------------------- * Used on Init instance. Duplicates each script on source map *--------------------------------------*/ -int instance_map_npcsub(struct block_list* bl, va_list args) { - struct npc_data* nd = (struct npc_data*)bl; +int instance_map_npcsub(struct block_list* bl, va_list args) +{ + struct npc_data *nd = NULL; int16 m = va_arg(args, int); // Destination Map - if ( npc->duplicate4instance(nd, m) ) + nullpo_ret(bl); + Assert_ret(bl->type == BL_NPC); + nd = BL_UCAST(BL_NPC, bl); + + if (npc->duplicate4instance(nd, m)) ShowDebug("instance_map_npcsub:npc_duplicate4instance failed (%s/%d)\n",nd->name,m); return 1; } -int instance_init_npc(struct block_list* bl, va_list args) { - struct npc_data *nd = (struct npc_data*)bl; +int instance_init_npc(struct block_list* bl, va_list args) +{ + struct npc_data *nd = NULL; struct event_data *ev; char evname[EVENT_NAME_LENGTH]; + nullpo_ret(bl); + Assert_ret(bl->type == BL_NPC); + nd = BL_UCAST(BL_NPC, bl); + snprintf(evname, EVENT_NAME_LENGTH, "%s::OnInstanceInit", nd->exname); if( ( ev = strdb_get(npc->ev_db, evname) ) ) @@ -430,10 +440,10 @@ int instance_cleanup_sub(struct block_list *bl, va_list ap) { switch(bl->type) { case BL_PC: - map->quit((struct map_session_data *) bl); + map->quit(BL_UCAST(BL_PC, bl)); break; case BL_NPC: - npc->unload((struct npc_data *)bl,true); + npc->unload(BL_UCAST(BL_NPC, bl), true); break; case BL_MOB: unit->free(bl,CLR_OUTSIGHT); @@ -445,7 +455,7 @@ int instance_cleanup_sub(struct block_list *bl, va_list ap) { map->clearflooritem(bl); break; case BL_SKILL: - skill->delunit((struct skill_unit *) bl); + skill->delunit(BL_UCAST(BL_SKILL, bl)); break; } @@ -724,7 +734,7 @@ void do_reload_instance(void) { } iter = mapit_getallusers(); - for( sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); sd = (TBL_PC*)mapit->next(iter) ) { + for (sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); sd = BL_UCAST(BL_PC, mapit->next(iter))) { if(sd && map->list[sd->bl.m].instance_id >= 0) { pc->setpos(sd,instance->list[map->list[sd->bl.m].instance_id].respawn.map,instance->list[map->list[sd->bl.m].instance_id].respawn.x,instance->list[map->list[sd->bl.m].instance_id].respawn.y,CLR_TELEPORT); } diff --git a/src/map/intif.c b/src/map/intif.c index 016b4f7d3..1968ebe67 100644 --- a/src/map/intif.c +++ b/src/map/intif.c @@ -995,7 +995,7 @@ void intif_parse_WisEnd(int fd) { if (battle_config.etc_log) ShowInfo("intif_parse_wisend: player: %s, flag: %d\n", RFIFOP(fd,2), RFIFOB(fd,26)); // flag: 0: success to send whisper, 1: target character is not logged in?, 2: ignored by target - sd = (struct map_session_data *)map->nick2sd((char *) RFIFOP(fd,2)); + sd = map->nick2sd((char *)RFIFOP(fd,2)); if (sd != NULL) clif->wis_end(sd->fd, RFIFOB(fd,26)); @@ -1496,7 +1496,8 @@ QUESTLOG SYSTEM FUNCTIONS * * @param sd Character's data */ -void intif_request_questlog(TBL_PC *sd) { +void intif_request_questlog(struct map_session_data *sd) +{ nullpo_retv(sd); WFIFOHEAD(inter_fd,6); WFIFOW(inter_fd,0) = 0x3060; @@ -1513,7 +1514,7 @@ void intif_request_questlog(TBL_PC *sd) { */ void intif_parse_QuestLog(int fd) { int char_id = RFIFOL(fd, 4), num_received = (RFIFOW(fd, 2)-8)/sizeof(struct quest); - TBL_PC *sd = map->charid2sd(char_id); + struct map_session_data *sd = map->charid2sd(char_id); if (!sd) // User not online anymore return; @@ -1568,7 +1569,7 @@ void intif_parse_QuestLog(int fd) { */ void intif_parse_QuestSave(int fd) { int cid = RFIFOL(fd, 2); - TBL_PC *sd = map->id2sd(cid); + struct map_session_data *sd = map->id2sd(cid); if( !RFIFOB(fd, 6) ) ShowError("intif_parse_QuestSave: Failed to save quest(s) for character %d!\n", cid); @@ -1582,7 +1583,8 @@ void intif_parse_QuestSave(int fd) { * @param sd Character's data * @return 0 in case of success, nonzero otherwise */ -int intif_quest_save(TBL_PC *sd) { +int intif_quest_save(struct map_session_data *sd) +{ int len = sizeof(struct quest)*sd->num_quests + 8; if(intif->CheckForCharServer()) diff --git a/src/map/itemdb.c b/src/map/itemdb.c index 2894463de..048efd636 100644 --- a/src/map/itemdb.c +++ b/src/map/itemdb.c @@ -2123,7 +2123,7 @@ void itemdb_reload(void) { // readjust itemdb pointer cache for each player iter = mapit_geteachpc(); - for( sd = (struct map_session_data*)mapit->first(iter); mapit->exists(iter); sd = (struct map_session_data*)mapit->next(iter) ) { + for (sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); sd = BL_UCAST(BL_PC, mapit->next(iter))) { memset(sd->item_delay, 0, sizeof(sd->item_delay)); // reset item delays pc->setinventorydata(sd); if( battle_config.item_check ) diff --git a/src/map/map.c b/src/map/map.c index dcbc3f6f5..ed171f4bd 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -332,8 +332,9 @@ int map_moveblock(struct block_list *bl, int x1, int y1, int64 tick) { if (sc && sc->data[SC_PROPERTYWALK] && sc->data[SC_PROPERTYWALK]->val3 >= skill->get_maxcount(sc->data[SC_PROPERTYWALK]->val1,sc->data[SC_PROPERTYWALK]->val2) ) status_change_end(bl,SC_PROPERTYWALK,INVALID_TIMER); - } else if (bl->type == BL_NPC) - npc->unsetcells((TBL_NPC*)bl); + } else if (bl->type == BL_NPC) { + npc->unsetcells(BL_UCAST(BL_NPC, bl)); + } if (moveblock) map->delblock(bl); #ifdef CELL_NOSTACK @@ -347,15 +348,17 @@ int map_moveblock(struct block_list *bl, int x1, int y1, int64 tick) { #endif if (bl->type&BL_CHAR) { + struct map_session_data *sd = BL_CAST(BL_PC, bl); skill->unit_move(bl,tick,3); - if( bl->type == BL_PC && ((TBL_PC*)bl)->shadowform_id ) {//Shadow Form Target Moving + if (sd != NULL && sd->shadowform_id != 0) { + //Shadow Form Target Moving struct block_list *d_bl; - if( (d_bl = map->id2bl(((TBL_PC*)bl)->shadowform_id)) == NULL || !check_distance_bl(bl,d_bl,10) ) { + if ((d_bl = map->id2bl(sd->shadowform_id)) == NULL || !check_distance_bl(bl,d_bl,10)) { if( d_bl ) status_change_end(d_bl,SC__SHADOWFORM,INVALID_TIMER); - ((TBL_PC*)bl)->shadowform_id = 0; + sd->shadowform_id = 0; } } @@ -391,7 +394,7 @@ int map_moveblock(struct block_list *bl, int x1, int y1, int64 tick) { } } /* Guild Aura Moving */ - if( bl->type == BL_PC && ((TBL_PC*)bl)->state.gmaster_flag ) { + if (sd != NULL && sd->state.gmaster_flag) { if (sc->data[SC_LEADERSHIP]) skill->unit_move_unit_group(skill->id2group(sc->data[SC_LEADERSHIP]->val4), bl->m, x1-x0, y1-y0); if (sc->data[SC_GLORYWOUNDS]) @@ -402,8 +405,9 @@ int map_moveblock(struct block_list *bl, int x1, int y1, int64 tick) { skill->unit_move_unit_group(skill->id2group(sc->data[SC_HAWKEYES]->val4), bl->m, x1-x0, y1-y0); } } - } else if (bl->type == BL_NPC) - npc->setcells((TBL_NPC*)bl); + } else if (bl->type == BL_NPC) { + npc->setcells(BL_UCAST(BL_NPC, bl)); + } return 0; } @@ -484,7 +488,7 @@ struct skill_unit* map_find_skill_unit_oncell(struct block_list* target,int16 x, if (bl->x != x || bl->y != y || bl->type != BL_SKILL) continue; - su = (struct skill_unit *) bl; + su = BL_UCAST(BL_SKILL, bl); if( su == out_unit || !su->alive || !su->group || su->group->skill_id != skill_id ) continue; if( !(flag&1) || battle->check_target(&su->bl,target,su->group->target_flag) > 0 ) @@ -1370,10 +1374,12 @@ int map_get_new_object_id(void) * Timered function to clear the floor (remove remaining item) * Called each flooritem_lifetime ms *------------------------------------------*/ -int map_clearflooritem_timer(int tid, int64 tick, int id, intptr_t data) { - struct flooritem_data* fitem = (struct flooritem_data*)idb_get(map->id_db, id); +int map_clearflooritem_timer(int tid, int64 tick, int id, intptr_t data) +{ + struct block_list *bl = idb_get(map->id_db, id); + struct flooritem_data *fitem = BL_CAST(BL_ITEM, bl); - if (fitem == NULL || fitem->bl.type != BL_ITEM || (fitem->cleartimer != tid)) { + if (fitem == NULL || fitem->cleartimer != tid) { ShowError("map_clearflooritem_timer : error\n"); return 1; } @@ -1391,8 +1397,11 @@ int map_clearflooritem_timer(int tid, int64 tick, int id, intptr_t data) { /* * clears a single bl item out of the bazooonga. */ -void map_clearflooritem(struct block_list *bl) { - struct flooritem_data* fitem = (struct flooritem_data*)bl; +void map_clearflooritem(struct block_list *bl) +{ + struct flooritem_data *fitem = BL_CAST(BL_ITEM, bl); + + nullpo_retv(fitem); if( fitem->cleartimer != INVALID_TIMER ) timer->delete(fitem->cleartimer,map->clearflooritem_timer); @@ -1738,15 +1747,12 @@ void map_addiddb(struct block_list *bl) { nullpo_retv(bl); - if( bl->type == BL_PC ) - { - TBL_PC* sd = (TBL_PC*)bl; + if (bl->type == BL_PC) { + struct map_session_data *sd = BL_UCAST(BL_PC, bl); idb_put(map->pc_db,sd->bl.id,sd); idb_put(map->charid_db,sd->status.char_id,sd); - } - else if( bl->type == BL_MOB ) - { - TBL_MOB* md = (TBL_MOB*)bl; + } else if (bl->type == BL_MOB) { + struct mob_data *md = BL_UCAST(BL_MOB, bl); idb_put(map->mobid_db,bl->id,bl); if( md->state.boss ) @@ -1766,14 +1772,11 @@ void map_deliddb(struct block_list *bl) { nullpo_retv(bl); - if( bl->type == BL_PC ) - { - TBL_PC* sd = (TBL_PC*)bl; + if (bl->type == BL_PC) { + struct map_session_data *sd = BL_UCAST(BL_PC, bl); idb_remove(map->pc_db,sd->bl.id); idb_remove(map->charid_db,sd->status.char_id); - } - else if( bl->type == BL_MOB ) - { + } else if (bl->type == BL_MOB) { idb_remove(map->mobid_db,bl->id); idb_remove(map->bossid_db,bl->id); } @@ -1901,42 +1904,185 @@ int map_quit(struct map_session_data *sd) { return 0; } -/*========================================== - * Lookup, id to session (player,mob,npc,homon,merc..) - *------------------------------------------*/ -struct map_session_data *map_id2sd(int id) { - if (id <= 0) return NULL; - return (struct map_session_data*)idb_get(map->pc_db,id); -} +/** + * Looks up a session data by ID. + * + * The search is performed using the pc_db. + * + * @param id The bl ID to search. + * @return The searched map_session_data, if it exists. + * @retval NULL if the ID is invalid or doesn't belong to a player unit. + */ +struct map_session_data *map_id2sd(int id) +{ + struct block_list *bl = NULL; + if (id <= 0) + return NULL; + + bl = idb_get(map->pc_db,id); -struct mob_data *map_id2md(int id) { - if (id <= 0) return NULL; - return (struct mob_data*)idb_get(map->mobid_db,id); + Assert_retr(NULL, bl->type == BL_PC); + return BL_UCAST(BL_PC, bl); } -struct npc_data *map_id2nd(int id) { +/** + * Looks up a NPC data by ID. + * + * @param id The bl ID to search. + * @return The searched npc_data, if it exists. + * @retval NULL if the ID is invalid or doesn't belong to a NPC. + */ +struct npc_data *map_id2nd(int id) +{ // just a id2bl lookup because there's no npc_db struct block_list* bl = map->id2bl(id); return BL_CAST(BL_NPC, bl); } -struct homun_data *map_id2hd(int id) { +/** + * Looks up a mob data by ID. + * + * The search is performed using the mobid_db. + * + * @param id The bl ID to search. + * @return The searched mob_data, if it exists. + * @retval NULL if the ID is invalid or doesn't belong to a mob unit. + */ +struct mob_data *map_id2md(int id) +{ + struct block_list *bl = NULL; + if (id <= 0) + return NULL; + + bl = idb_get(map->mobid_db,id); + + Assert_retr(NULL, bl->type == BL_MOB); + return BL_UCAST(BL_MOB, bl); +} + +/** + * Looks up a floor item data by ID. + * + * @param id The bl ID to search. + * @return The searched flooritem_data, if it exists. + * @retval NULL if the ID is invalid or doesn't belong to a floor item. + */ +struct flooritem_data *map_id2fi(int id) +{ + struct block_list* bl = map->id2bl(id); + + return BL_CAST(BL_ITEM, bl); +} + +/** + * Looks up a chat data by ID. + * + * @param id The bl ID to search. + * @return The searched chat_data, if it exists. + * @retval NULL if the ID is invalid or doesn't belong to a chat. + */ +struct chat_data *map_id2cd(int id) +{ + struct block_list* bl = map->id2bl(id); + + return BL_CAST(BL_CHAT, bl); +} + +/** + * Looks up a skill unit data by ID. + * + * @param id The bl ID to search. + * @return The searched skill_unit data, if it exists. + * @retval NULL if the ID is invalid or doesn't belong to a skill unit. + */ +struct skill_unit *map_id2su(int id) +{ + struct block_list* bl = map->id2bl(id); + + return BL_CAST(BL_SKILL, bl); +} + +/** + * Looks up a pet data by ID. + * + * @param id The bl ID to search. + * @return The searched pet_data, if it exists. + * @retval NULL if the ID is invalid or doesn't belong to a pet. + */ +struct pet_data *map_id2pd(int id) +{ + struct block_list* bl = map->id2bl(id); + + return BL_CAST(BL_PET, bl); +} + +/** + * Looks up a homunculus data by ID. + * + * @param id The bl ID to search. + * @return The searched homun_data, if it exists. + * @retval NULL if the ID is invalid or doesn't belong to a homunculus. + */ +struct homun_data *map_id2hd(int id) +{ struct block_list* bl = map->id2bl(id); return BL_CAST(BL_HOM, bl); } -struct mercenary_data *map_id2mc(int id) { +/** + * Looks up a mercenary data by ID. + * + * @param id The bl ID to search. + * @return The searched mercenary_data, if it exists. + * @retval NULL if the ID is invalid or doesn't belong to a mercenary. + */ +struct mercenary_data *map_id2mc(int id) +{ struct block_list* bl = map->id2bl(id); return BL_CAST(BL_MER, bl); } -struct chat_data *map_id2cd(int id) { +/** + * Looks up an elemental data by ID. + * + * @param id The bl ID to search. + * @return The searched elemental_data, if it exists. + * @retval NULL if the ID is invalid or doesn't belong to an elemental. + */ +struct elemental_data *map_id2ed(int id) +{ struct block_list* bl = map->id2bl(id); - return BL_CAST(BL_CHAT, bl); + return BL_CAST(BL_ELEM, bl); +} + +/** + * Looks up a block_list by ID. + * + * The search is performed using the id_db. + * + * @param id The bl ID to search. + * @return The searched block_list, if it exists. + * @retval NULL if the ID is invalid. + */ +struct block_list *map_id2bl(int id) +{ + return idb_get(map->id_db, id); +} + +/** + * Verifies whether a block list ID is valid. + * + * @param id The bl ID to search. + * @retval true if the ID exists and is valid. + * @retval false otherwise. + */ +bool map_blid_exists(int id) +{ + return (idb_exists(map->id_db,id)); } /// Returns the nick of the target charid or NULL if unknown (requests the nick to the char server). @@ -1959,7 +2105,9 @@ const char *map_charid2nick(int charid) { /// Returns the struct map_session_data of the charid or NULL if the char is not online. struct map_session_data* map_charid2sd(int charid) { - return (struct map_session_data*)idb_get(map->charid_db, charid); + struct block_list *bl = idb_get(map->charid_db, charid); + Assert_retr(NULL, bl->type == BL_PC); + return BL_UCAST(BL_PC, bl); } /*========================================== @@ -1982,8 +2130,7 @@ struct map_session_data * map_nick2sd(const char *nick) iter = mapit_getallusers(); found_sd = NULL; - for( sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); sd = (TBL_PC*)mapit->next(iter) ) - { + for (sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); sd = BL_UCAST(BL_PC, mapit->next(iter))) { if( battle_config.partial_name_scan ) {// partial name search if( strnicmp(sd->status.name, nick, nicklen) == 0 ) @@ -2014,20 +2161,6 @@ struct map_session_data * map_nick2sd(const char *nick) } /*========================================== - * Looksup id_db DBMap and returns BL pointer of 'id' or NULL if not found - *------------------------------------------*/ -struct block_list * map_id2bl(int id) { - return (struct block_list*)idb_get(map->id_db,id); -} - -/** - * Same as map->id2bl except it only checks for its existence - **/ -bool map_blid_exists( int id ) { - return (idb_exists(map->id_db,id)); -} - -/*========================================== * Convext Mirror *------------------------------------------*/ struct mob_data * map_getmob_boss(int16 m) @@ -2037,10 +2170,8 @@ struct mob_data * map_getmob_boss(int16 m) bool found = false; iter = db_iterator(map->bossid_db); - for( md = (struct mob_data*)dbi_first(iter); dbi_exists(iter); md = (struct mob_data*)dbi_next(iter) ) - { - if( md->bl.m == m ) - { + for (md = dbi_first(iter); dbi_exists(iter); md = dbi_next(iter)) { + if (md->bl.m == m) { found = true; break; } @@ -2050,10 +2181,14 @@ struct mob_data * map_getmob_boss(int16 m) return (found)? md : NULL; } -struct mob_data * map_id2boss(int id) +struct mob_data *map_id2boss(int id) { - if (id <= 0) return NULL; - return (struct mob_data*)idb_get(map->bossid_db,id); + struct block_list *bl = NULL; + if (id <= 0) + return NULL; + bl = idb_get(map->bossid_db,id); + Assert_retr(NULL, bl->type == BL_MOB); + return BL_UCAST(BL_MOB, bl); } /** @@ -2128,7 +2263,7 @@ void map_vforeachmob(int (*func)(struct mob_data* md, va_list args), va_list arg struct mob_data* md; iter = db_iterator(map->mobid_db); - for( md = (struct mob_data*)dbi_first(iter); dbi_exists(iter); md = (struct mob_data*)dbi_next(iter) ) { + for (md = dbi_first(iter); dbi_exists(iter); md = dbi_next(iter)) { va_list argscopy; int ret; @@ -2159,9 +2294,9 @@ void map_vforeachnpc(int (*func)(struct npc_data* nd, va_list args), va_list arg struct block_list* bl; iter = db_iterator(map->id_db); - for( bl = (struct block_list*)dbi_first(iter); dbi_exists(iter); bl = (struct block_list*)dbi_next(iter) ) { - if( bl->type == BL_NPC ) { - struct npc_data* nd = (struct npc_data*)bl; + for (bl = dbi_first(iter); dbi_exists(iter); bl = dbi_next(iter)) { + if (bl->type == BL_NPC) { + struct npc_data *nd = BL_UCAST(BL_NPC, bl); va_list argscopy; int ret; @@ -2193,7 +2328,7 @@ void map_vforeachregen(int (*func)(struct block_list* bl, va_list args), va_list struct block_list* bl; iter = db_iterator(map->regen_db); - for( bl = (struct block_list*)dbi_first(iter); dbi_exists(iter); bl = (struct block_list*)dbi_next(iter) ) { + for (bl = dbi_first(iter); dbi_exists(iter); bl = dbi_next(iter)) { va_list argscopy; int ret; @@ -2224,7 +2359,7 @@ void map_vforeachiddb(int (*func)(struct block_list* bl, va_list args), va_list struct block_list* bl; iter = db_iterator(map->id_db); - for( bl = (struct block_list*)dbi_first(iter); dbi_exists(iter); bl = (struct block_list*)dbi_next(iter) ) { + for (bl = dbi_first(iter); dbi_exists(iter); bl = dbi_next(iter)) { va_list argscopy; int ret; @@ -2305,7 +2440,7 @@ struct block_list* mapit_first(struct s_mapiterator* iter) { nullpo_retr(NULL,iter); - for( bl = (struct block_list*)dbi_first(iter->dbi); bl != NULL; bl = (struct block_list*)dbi_next(iter->dbi) ) { + for (bl = dbi_first(iter->dbi); bl != NULL; bl = dbi_next(iter->dbi) ) { if( MAPIT_MATCHES(iter,bl) ) break;// found match } @@ -2322,7 +2457,7 @@ struct block_list* mapit_last(struct s_mapiterator* iter) { nullpo_retr(NULL,iter); - for( bl = (struct block_list*)dbi_last(iter->dbi); bl != NULL; bl = (struct block_list*)dbi_prev(iter->dbi) ) { + for (bl = dbi_last(iter->dbi); bl != NULL; bl = dbi_prev(iter->dbi)) { if( MAPIT_MATCHES(iter,bl) ) break;// found match } @@ -2340,7 +2475,7 @@ struct block_list* mapit_next(struct s_mapiterator* iter) { nullpo_retr(NULL,iter); for( ; ; ) { - bl = (struct block_list*)dbi_next(iter->dbi); + bl = dbi_next(iter->dbi); if( bl == NULL ) break;// end if( MAPIT_MATCHES(iter,bl) ) @@ -2361,7 +2496,7 @@ struct block_list* mapit_prev(struct s_mapiterator* iter) { nullpo_retr(NULL,iter); for( ; ; ) { - bl = (struct block_list*)dbi_prev(iter->dbi); + bl = dbi_prev(iter->dbi); if( bl == NULL ) break;// end if( MAPIT_MATCHES(iter,bl) ) @@ -2437,8 +2572,10 @@ void map_spawnmobs(int16 m) { int map_removemobs_sub(struct block_list *bl, va_list ap) { - struct mob_data *md = (struct mob_data *)bl; - nullpo_ret(md); + struct mob_data *md = NULL; + nullpo_ret(bl); + Assert_ret(bl->type == BL_MOB); + md = BL_UCAST(BL_MOB, bl); //When not to remove mob: // doesn't respawn and is not a slave @@ -5338,10 +5475,10 @@ int cleanup_sub(struct block_list *bl, va_list ap) { switch(bl->type) { case BL_PC: - map->quit((struct map_session_data *) bl); + map->quit(BL_UCAST(BL_PC, bl)); break; case BL_NPC: - npc->unload((struct npc_data *)bl,false); + npc->unload(BL_UCAST(BL_NPC, bl), false); break; case BL_MOB: unit->free(bl,CLR_OUTSIGHT); @@ -5353,7 +5490,7 @@ int cleanup_sub(struct block_list *bl, va_list ap) { map->clearflooritem(bl); break; case BL_SKILL: - skill->delunit((struct skill_unit *) bl); + skill->delunit(BL_UCAST(BL_SKILL, bl)); break; } @@ -5384,7 +5521,7 @@ int do_final(void) { //Ladies and babies first. iter = mapit_getallusers(); - for( sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); sd = (TBL_PC*)mapit->next(iter) ) + for (sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); sd = BL_UCAST(BL_PC, mapit->next(iter))) map->quit(sd); mapit->free(iter); @@ -5528,7 +5665,7 @@ void do_shutdown(void) { struct map_session_data* sd; struct s_mapiterator* iter = mapit_getallusers(); - for( sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); sd = (TBL_PC*)mapit->next(iter) ) + for (sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); sd = BL_UCAST(BL_PC, mapit->next(iter))) clif->GM_kick(NULL, sd); mapit->free(iter); sockt->flush_fifos(); @@ -6163,11 +6300,15 @@ void map_defaults(void) { map->foreachininstance = map_foreachininstance; map->id2sd = map_id2sd; - map->id2md = map_id2md; map->id2nd = map_id2nd; + map->id2md = map_id2md; + map->id2fi = map_id2fi; + map->id2cd = map_id2cd; + map->id2su = map_id2su; + map->id2pd = map_id2pd; map->id2hd = map_id2hd; map->id2mc = map_id2mc; - map->id2cd = map_id2cd; + map->id2ed = map_id2ed; map->id2bl = map_id2bl; map->blid_exists = map_blid_exists; map->mapindex2mapid = map_mapindex2mapid; diff --git a/src/map/map.h b/src/map/map.h index 7047feab6..4c74d352c 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -828,8 +828,89 @@ typedef struct homun_data TBL_HOM; typedef struct mercenary_data TBL_MER; typedef struct elemental_data TBL_ELEM; +/** + * Casts a block list to a specific type. + * + * @remark + * The `bl` argument may be evaluated more than once. + * + * @param type_ The block list type (using symbols from enum bl_type). + * @param bl The source block list to cast. + * @return The block list, cast to the correct type. + * @retval NULL if bl is the wrong type or NULL. + */ #define BL_CAST(type_, bl) \ - ( ((bl) == (struct block_list*)NULL || (bl)->type != (type_)) ? (T ## type_ *)NULL : (T ## type_ *)(bl) ) + ( ((bl) == (struct block_list *)NULL || (bl)->type != (type_)) ? (T ## type_ *)NULL : (T ## type_ *)(bl) ) + +/** + * Casts a const block list to a specific type. + * + * @remark + * The `bl` argument may be evaluated more than once. + * + * @param type_ The block list type (using symbols from enum bl_type). + * @param bl The source block list to cast. + * @return The block list, cast to the correct type. + * @retval NULL if bl is the wrong type or NULL. + */ +#define BL_CCAST(type_, bl) \ + ( ((bl) == (const struct block_list *)NULL || (bl)->type != (type_)) ? (const T ## type_ *)NULL : (const T ## type_ *)(bl) ) + +/** + * Helper function for `BL_UCAST`. + * + * @warning + * This function shouldn't be called on it own. + * + * The purpose of this function is to produce a compile-timer error if a non-bl + * object is passed to BL_UCAST. It's declared as static inline to let the + * compiler optimize out the function call overhead. + */ +static inline struct block_list *BL_UCAST_(struct block_list *bl) +{ + return bl; +} + +/** + * Casts a block list to a specific type, without performing any type checks. + * + * @remark + * The `bl` argument is guaranteed to be evaluated once and only once. + * + * @param type_ The block list type (using symbols from enum bl_type). + * @param bl The source block list to cast. + * @return The block list, cast to the correct type. + */ +#define BL_UCAST(type_, bl) \ + ((T ## type_ *)BL_UCAST_(bl)) + +/** + * Helper function for `BL_UCCAST`. + * + * @warning + * This function shouldn't be called on it own. + * + * The purpose of this function is to produce a compile-timer error if a non-bl + * object is passed to BL_UCAST. It's declared as static inline to let the + * compiler optimize out the function call overhead. + */ +static inline const struct block_list *BL_UCCAST_(const struct block_list *bl) +{ + return bl; +} + +/** + * Casts a const block list to a specific type, without performing any type checks. + * + * @remark + * The `bl` argument is guaranteed to be evaluated once and only once. + * + * @param type_ The block list type (using symbols from enum bl_type). + * @param bl The source block list to cast. + * @return The block list, cast to the correct type. + */ +#define BL_UCCAST(type_, bl) \ + ((const T ## type_ *)BL_UCCAST_(bl)) struct charid_request { struct charid_request* next; @@ -1029,13 +1110,17 @@ END_ZEROED_BLOCK; int (*vforeachininstance)(int (*func)(struct block_list*,va_list), int16 instance_id, int type, va_list ap); int (*foreachininstance)(int (*func)(struct block_list*,va_list), int16 instance_id, int type,...); - struct map_session_data * (*id2sd) (int id); - struct mob_data * (*id2md) (int id); - struct npc_data * (*id2nd) (int id); - struct homun_data* (*id2hd) (int id); - struct mercenary_data* (*id2mc) (int id); - struct chat_data* (*id2cd) (int id); - struct block_list * (*id2bl) (int id); + struct map_session_data *(*id2sd) (int id); + struct npc_data *(*id2nd) (int id); + struct mob_data *(*id2md) (int id); + struct flooritem_data *(*id2fi) (int id); + struct chat_data *(*id2cd) (int id); + struct skill_unit *(*id2su) (int id); + struct pet_data *(*id2pd) (int id); + struct homun_data *(*id2hd) (int id); + struct mercenary_data *(*id2mc) (int id); + struct elemental_data *(*id2ed) (int id); + struct block_list *(*id2bl) (int id); bool (*blid_exists) (int id); int16 (*mapindex2mapid) (unsigned short map_index); int16 (*mapname2mapid) (const char* name); diff --git a/src/map/mercenary.c b/src/map/mercenary.c index fb801a8da..e6c911ef6 100644 --- a/src/map/mercenary.c +++ b/src/map/mercenary.c @@ -317,10 +317,11 @@ int merc_data_received(struct s_mercenary *merc, bool flag) { db = &mercenary->db[i]; if( !sd->md ) { - sd->md = md = (struct mercenary_data*)aCalloc(1,sizeof(struct mercenary_data)); + CREATE(md, struct mercenary_data, 1); md->bl.type = BL_MER; md->bl.id = npc->get_new_npc_id(); md->devotion_flag = 0; + sd->md = md; md->master = sd; md->db = db; diff --git a/src/map/mob.c b/src/map/mob.c index 16b5417b9..37da81a15 100644 --- a/src/map/mob.c +++ b/src/map/mob.c @@ -274,7 +274,8 @@ int mob_parse_dataset(struct spawn_data *data) * Generates the basic mob data using the spawn_data provided. *------------------------------------------*/ struct mob_data* mob_spawn_dataset(struct spawn_data *data) { - struct mob_data *md = (struct mob_data*)aCalloc(1, sizeof(struct mob_data)); + struct mob_data *md = NULL; + CREATE(md, struct mob_data, 1); md->bl.id= npc->get_new_npc_id(); md->bl.type = BL_MOB; md->bl.m = data->m; @@ -591,12 +592,9 @@ int mob_spawn_guardian_sub(int tid, int64 tick, int id, intptr_t data) { if( bl == NULL ) //It is possible mob was already removed from map when the castle has no owner. [Skotlex] return 0; - if( bl->type != BL_MOB ) { - ShowError("mob_spawn_guardian_sub: Block error!\n"); - return 0; - } + Assert_ret(bl->type == BL_MOB); + md = BL_UCAST(BL_MOB, bl); - md = (struct mob_data*)bl; nullpo_ret(md->guardian_data); g = guild->search((int)data); @@ -684,11 +682,9 @@ int mob_spawn_guardian(const char* mapname, short x, short y, const char* mobnam if( has_index && gc->guardian[guardian].id ) { //Check if guardian already exists, refuse to spawn if so. - struct mob_data *md2 = (TBL_MOB*)map->id2bl(gc->guardian[guardian].id); - if (md2 && md2->bl.type == BL_MOB - && md2->guardian_data - && md2->guardian_data->number == guardian - ) { + struct block_list *bl2 = map->id2bl(gc->guardian[guardian].id); // TODO: Why does this not use map->id2md? + struct mob_data *md2 = BL_CAST(BL_MOB, bl2); + if (md2 != NULL && md2->guardian_data != NULL && md2->guardian_data->number == guardian) { ShowError("mob_spawn_guardian: Attempted to spawn guardian in position %d which already has a guardian (castle map %s)\n", guardian, map->list[m].name); return 0; } @@ -794,17 +790,16 @@ int mob_can_reach(struct mob_data *md,struct block_list *bl,int range, int state /*========================================== * Links nearby mobs (supportive mobs) *------------------------------------------*/ -int mob_linksearch(struct block_list *bl,va_list ap) { - struct mob_data *md; - int class_; - struct block_list *target; - int64 tick; +int mob_linksearch(struct block_list *bl,va_list ap) +{ + struct mob_data *md = NULL; + int class_ = va_arg(ap, int); + struct block_list *target = va_arg(ap, struct block_list *); + int64 tick = va_arg(ap, int64); nullpo_ret(bl); - md=(struct mob_data *)bl; - class_ = va_arg(ap, int); - target = va_arg(ap, struct block_list *); - tick = va_arg(ap, int64); + Assert_ret(bl->type == BL_MOB); + md = BL_UCAST(BL_MOB, bl); if (md->class_ == class_ && DIFF_TICK(md->last_linktime, tick) < MIN_MOBLINKTIME && !md->target_id) @@ -825,7 +820,7 @@ int mob_linksearch(struct block_list *bl,va_list ap) { * mob spawn with delay (timer function) *------------------------------------------*/ int mob_delayspawn(int tid, int64 tick, int id, intptr_t data) { - struct block_list* bl = map->id2bl(id); + struct block_list* bl = map->id2bl(id); // TODO: Why does this not use map->bl2md? struct mob_data* md = BL_CAST(BL_MOB, bl); if( md ) @@ -889,7 +884,7 @@ int mob_count_sub(struct block_list *bl, va_list ap) { int mobid[10] = { 0 }, i; ARR_FIND(0, 10, i, (mobid[i] = va_arg(ap, int)) == 0); //fetch till 0 if (mobid[0]) { //if there one let's check it otherwise go backward - TBL_MOB *md = BL_CAST(BL_MOB, bl); + struct mob_data *md = BL_CAST(BL_MOB, bl); nullpo_ret(md); ARR_FIND(0, 10, i, md->class_ == mobid[i]); return (i < 10) ? 1 : 0; @@ -1073,8 +1068,7 @@ int mob_ai_sub_hard_activesearch(struct block_list *bl,va_list ap) switch (bl->type) { case BL_PC: - if (((TBL_PC*)bl)->state.gangsterparadise && - !(status_get_mode(&md->bl)&MD_BOSS)) + if (BL_UCCAST(BL_PC, bl)->state.gangsterparadise && !(status_get_mode(&md->bl)&MD_BOSS)) return 0; //Gangster paradise protection. default: if (battle_config.hom_setting&0x4 && @@ -1174,17 +1168,15 @@ int mob_ai_sub_hard_lootsearch(struct block_list *bl,va_list ap) } int mob_warpchase_sub(struct block_list *bl,va_list ap) { - struct block_list *target; - struct npc_data **target_nd; - struct npc_data *nd; - int *min_distance; int cur_distance; + struct block_list *target = va_arg(ap, struct block_list *); + struct npc_data **target_nd = va_arg(ap, struct npc_data **); + int *min_distance = va_arg(ap, int *); + struct npc_data *nd = NULL; - target= va_arg(ap, struct block_list*); - target_nd= va_arg(ap, struct npc_data**); - min_distance= va_arg(ap, int*); - - nd = (TBL_NPC*) bl; + nullpo_ret(bl); + Assert_ret(bl->type == BL_NPC); + nd = BL_UCAST(BL_NPC, bl); if(nd->subtype != WARP) return 0; //Not a warp @@ -1440,14 +1432,13 @@ bool mob_ai_sub_hard(struct mob_data *md, int64 tick) { if (md->target_id) { //Check validity of current target. [Skotlex] + struct map_session_data *tsd = NULL; tbl = map->id2bl(md->target_id); - if (!tbl || tbl->m != md->bl.m + tsd = BL_CAST(BL_PC, tbl); + if (tbl == NULL || tbl->m != md->bl.m || (md->ud.attacktimer == INVALID_TIMER && !status->check_skilluse(&md->bl, tbl, 0, 0)) || (md->ud.walktimer != INVALID_TIMER && !(battle_config.mob_ai&0x1) && !check_distance_bl(&md->bl, tbl, md->min_chase)) - || ( tbl->type == BL_PC - && ((((TBL_PC*)tbl)->state.gangsterparadise && !(mode&MD_BOSS)) - || ((TBL_PC*)tbl)->invincible_timer != INVALID_TIMER) - ) + || (tsd != NULL && ((tsd->state.gangsterparadise && !(mode&MD_BOSS)) || tsd->invincible_timer != INVALID_TIMER)) ) { //No valid target if (mob->warpchase(md, tbl)) @@ -1580,7 +1571,7 @@ bool mob_ai_sub_hard(struct mob_data *md, int64 tick) { //Target exists, attack or loot as applicable. if (tbl->type == BL_ITEM) { //Loot time. - struct flooritem_data *fitem; + struct flooritem_data *fitem = BL_UCAST(BL_ITEM, tbl); if (md->ud.target == tbl->id && md->ud.walktimer != INVALID_TIMER) return true; //Already locked. if (md->lootitem == NULL) { @@ -1606,7 +1597,6 @@ bool mob_ai_sub_hard(struct mob_data *md, int64 tick) { if (md->ud.attacktimer != INVALID_TIMER) return true; //Busy attacking? - fitem = (struct flooritem_data *)tbl; //Logs items, taken by (L)ooter Mobs [Lupus] logs->pick_mob(md, LOG_TYPE_LOOT, fitem->item_data.amount, &fitem->item_data, NULL); @@ -1687,9 +1677,15 @@ bool mob_ai_sub_hard(struct mob_data *md, int64 tick) { return true; } -int mob_ai_sub_hard_timer(struct block_list *bl, va_list ap) { - struct mob_data *md = (struct mob_data*)bl; +int mob_ai_sub_hard_timer(struct block_list *bl, va_list ap) +{ + struct mob_data *md = NULL; int64 tick = va_arg(ap, int64); + + nullpo_ret(bl); + Assert_ret(bl->type == BL_MOB); + md = BL_UCAST(BL_MOB, bl); + if (mob->ai_sub_hard(md, tick)) { //Hard AI triggered. if(!md->state.spotted) @@ -1847,7 +1843,7 @@ int mob_delay_item_drop(int tid, int64 tick, int id, intptr_t data) { *------------------------------------------*/ void mob_item_drop(struct mob_data *md, struct item_drop_list *dlist, struct item_drop *ditem, int loot, int drop_rate, unsigned short flag) { - TBL_PC* sd; + struct map_session_data *sd = NULL; //Logs items, dropped by mobs [Lupus] logs->pick_mob(md, loot?LOG_TYPE_LOOT:LOG_TYPE_PICKDROP_MONSTER, -ditem->item_data.amount, &ditem->item_data, NULL); @@ -1878,7 +1874,7 @@ void mob_item_drop(struct mob_data *md, struct item_drop_list *dlist, struct ite } int mob_timer_delete(int tid, int64 tick, int id, intptr_t data) { - struct block_list* bl = map->id2bl(id); + struct block_list* bl = map->id2bl(id); // TODO: Why does this not use map->id2md? struct mob_data* md = BL_CAST(BL_MOB, bl); if( md ) @@ -1900,13 +1896,13 @@ int mob_timer_delete(int tid, int64 tick, int id, intptr_t data) { *------------------------------------------*/ int mob_deleteslave_sub(struct block_list *bl,va_list ap) { - struct mob_data *md; - int id; + struct mob_data *md = NULL; + int id = va_arg(ap, int); nullpo_ret(bl); - nullpo_ret(md = (struct mob_data *)bl); + Assert_ret(bl->type == BL_MOB); + md = BL_UCAST(BL_MOB, bl); - id=va_arg(ap,int); if(md->master_id > 0 && md->master_id == id ) status_kill(bl); return 0; @@ -1945,7 +1941,7 @@ void mob_log_damage(struct mob_data *md, struct block_list *src, int damage) { case BL_PC: { - struct map_session_data *sd = (TBL_PC*)src; + const struct map_session_data *sd = BL_UCCAST(BL_PC, src); char_id = sd->status.char_id; if( damage ) md->attacked_id = src->id; @@ -1953,7 +1949,7 @@ void mob_log_damage(struct mob_data *md, struct block_list *src, int damage) } case BL_HOM: { - struct homun_data *hd = (TBL_HOM*)src; + const struct homun_data *hd = BL_UCCAST(BL_HOM, src); flag = MDLF_HOMUN; if( hd->master ) char_id = hd->master->status.char_id; @@ -1963,7 +1959,7 @@ void mob_log_damage(struct mob_data *md, struct block_list *src, int damage) } case BL_MER: { - struct mercenary_data *mer = (TBL_MER*)src; + const struct mercenary_data *mer = BL_UCCAST(BL_MER, src); if( mer->master ) char_id = mer->master->status.char_id; if( damage ) @@ -1972,7 +1968,7 @@ void mob_log_damage(struct mob_data *md, struct block_list *src, int damage) } case BL_PET: { - struct pet_data *pd = (TBL_PET*)src; + const struct pet_data *pd = BL_UCCAST(BL_PET, src); flag = MDLF_PET; if( pd->msd ) { @@ -1984,7 +1980,7 @@ void mob_log_damage(struct mob_data *md, struct block_list *src, int damage) } case BL_MOB: { - struct mob_data* md2 = (TBL_MOB*)src; + const struct mob_data *md2 = BL_UCCAST(BL_MOB, src); if (md2->special_state.ai != AI_NONE && md2->master_id) { struct map_session_data* msd = map->id2sd(md2->master_id); if( msd ) @@ -2001,7 +1997,7 @@ void mob_log_damage(struct mob_data *md, struct block_list *src, int damage) } case BL_ELEM: { - struct elemental_data *ele = (TBL_ELEM*)src; + const struct elemental_data *ele = BL_UCCAST(BL_ELEM, src); if( ele->master ) char_id = ele->master->status.char_id; if( damage ) @@ -2098,14 +2094,15 @@ void mob_damage(struct mob_data *md, struct block_list *src, int damage) { *------------------------------------------*/ int mob_dead(struct mob_data *md, struct block_list *src, int type) { struct status_data *mstatus; - struct map_session_data *sd = NULL, *tmpsd[DAMAGELOG_SIZE]; - struct map_session_data *mvp_sd = NULL, *second_sd = NULL, *third_sd = NULL; + struct map_session_data *sd = BL_CAST(BL_PC, src); + struct map_session_data *tmpsd[DAMAGELOG_SIZE] = { NULL }; + struct map_session_data *mvp_sd = sd, *second_sd = NULL, *third_sd = NULL; struct { struct party_data *p; int id,zeny; unsigned int base_exp,job_exp; - } pt[DAMAGELOG_SIZE]; + } pt[DAMAGELOG_SIZE] = { { 0 } }; int i, temp, count, m = md->bl.m; int dmgbltypes = 0; // bitfield of all bl types, that caused damage to the mob and are eligible for exp distribution unsigned int mvp_damage; @@ -2114,12 +2111,6 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type) { mstatus = &md->status; - if( src && src->type == BL_PC ) - { - sd = (struct map_session_data *)src; - mvp_sd = sd; - } - if( md->guardian_data && md->guardian_data->number >= 0 && md->guardian_data->number < MAX_GUARDIANS ) guild->castledatasave(md->guardian_data->castle->castle_id, 10+md->guardian_data->number,0); @@ -2131,13 +2122,10 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type) { map->freeblock_lock(); - memset(pt,0,sizeof(pt)); - - if(src && src->type == BL_MOB) - mob->unlocktarget((struct mob_data *)src,tick); + if (src != NULL && src->type == BL_MOB) + mob->unlocktarget(BL_UCAST(BL_MOB, src), tick); // filter out entries not eligible for exp distribution - memset(tmpsd,0,sizeof(tmpsd)); for(i = 0, count = 0, mvp_damage = 0; i < DAMAGELOG_SIZE && md->dmglog[i].id; i++) { struct map_session_data* tsd = map->charid2sd(md->dmglog[i].id); @@ -2582,10 +2570,10 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type) { md->status.hp = 0; //So that npc_event invoked functions KNOW that mob is dead if( src ) { switch( src->type ) { - case BL_PET: sd = ((TBL_PET*)src)->msd; break; - case BL_HOM: sd = ((TBL_HOM*)src)->master; break; - case BL_MER: sd = ((TBL_MER*)src)->master; break; - case BL_ELEM: sd = ((TBL_ELEM*)src)->master; break; + case BL_PET: sd = BL_UCAST(BL_PET, src)->msd; break; + case BL_HOM: sd = BL_UCAST(BL_HOM, src)->master; break; + case BL_MER: sd = BL_UCAST(BL_MER, src)->master; break; + case BL_ELEM: sd = BL_UCAST(BL_ELEM, src)->master; break; } } @@ -2843,13 +2831,18 @@ void mob_heal(struct mob_data *md, unsigned int heal) /*========================================== * Added by RoVeRT *------------------------------------------*/ -int mob_warpslave_sub(struct block_list *bl,va_list ap) { - struct mob_data *md=(struct mob_data *)bl; +int mob_warpslave_sub(struct block_list *bl, va_list ap) +{ + struct mob_data *md = NULL; struct block_list *master; short x,y,range=0; master = va_arg(ap, struct block_list*); range = va_arg(ap, int); + nullpo_ret(bl); + Assert_ret(bl->type == BL_MOB); + md = BL_UCAST(BL_MOB, bl); + if(md->master_id!=master->id) return 0; @@ -2873,14 +2866,16 @@ int mob_warpslave(struct block_list *bl, int range) { /*========================================== * Counts slave sub, currently checking if mob master is the given ID. *------------------------------------------*/ -int mob_countslave_sub(struct block_list *bl,va_list ap) +int mob_countslave_sub(struct block_list *bl, va_list ap) { - int id; - struct mob_data *md; - id=va_arg(ap,int); + int id = va_arg(ap, int); + struct mob_data *md = NULL; + + nullpo_ret(bl); + Assert_ret(bl->type == BL_MOB); + md = BL_UCAST(BL_MOB, bl); - md = (struct mob_data *)bl; - if( md->master_id==id ) + if (md->master_id == id) return 1; return 0; } @@ -3064,11 +3059,12 @@ struct block_list *mob_getmasterhpltmaxrate(struct mob_data *md,int rate) { int mob_getfriendstatus_sub(struct block_list *bl,va_list ap) { int cond1,cond2; - struct mob_data **fr, *md, *mmd; + struct mob_data **fr = NULL, *md = NULL, *mmd = NULL; int flag=0; nullpo_ret(bl); - nullpo_ret(md=(struct mob_data *)bl); + Assert_ret(bl->type == BL_MOB); + md = BL_UCAST(BL_MOB, bl); nullpo_ret(mmd=va_arg(ap,struct mob_data *)); if( mmd->bl.id == bl->id && !(battle_config.mob_ai&0x10) ) diff --git a/src/map/npc.c b/src/map/npc.c index a7d4cdab0..411e52c29 100644 --- a/src/map/npc.c +++ b/src/map/npc.c @@ -147,8 +147,13 @@ int npc_get_new_npc_id(void) { } } -int npc_isnear_sub(struct block_list* bl, va_list args) { - struct npc_data *nd = (struct npc_data*)bl; +int npc_isnear_sub(struct block_list *bl, va_list args) +{ + const struct npc_data *nd = NULL; + + nullpo_ret(bl); + Assert_ret(bl->type == BL_NPC); + nd = BL_UCCAST(BL_NPC, bl); if( nd->option & (OPTION_HIDE|OPTION_INVISIBLE) ) return 0; @@ -212,9 +217,9 @@ int npc_enable_sub(struct block_list *bl, va_list ap) nullpo_ret(bl); nullpo_ret(nd=va_arg(ap,struct npc_data *)); - if(bl->type == BL_PC) - { - TBL_PC *sd = (TBL_PC*)bl; + + if (bl->type == BL_PC) { + struct map_session_data *sd = BL_UCAST(BL_PC, bl); if (nd->option&OPTION_INVISIBLE) return 1; @@ -272,9 +277,9 @@ int npc_enable(const char* name, int flag) /*========================================== * NPC lookup (get npc_data through npcname) *------------------------------------------*/ -struct npc_data* npc_name2id(const char* name) +struct npc_data *npc_name2id(const char *name) { - return (struct npc_data *) strdb_get(npc->name_db, name); + return strdb_get(npc->name_db, name); } /** * For the Secure NPC Timeout option (check config/Secure.h) [RR] @@ -566,10 +571,11 @@ struct timer_event_data { /*========================================== * triger 'OnTimerXXXX' events *------------------------------------------*/ -int npc_timerevent(int tid, int64 tick, int id, intptr_t data) { +int npc_timerevent(int tid, int64 tick, int id, intptr_t data) +{ int old_rid, old_timer; int64 old_tick; - struct npc_data* nd=(struct npc_data *)map->id2bl(id); + struct npc_data *nd = map->id2nd(id); struct npc_timerevent_list *te; struct timer_event_data *ted = (struct timer_event_data*)data; struct map_session_data *sd=NULL; @@ -736,14 +742,13 @@ void npc_timerevent_quit(struct map_session_data* sd) } // Delete timer - nd = (struct npc_data *)map->id2bl(td->id); + nd = map->id2nd(td->id); ted = (struct timer_event_data*)td->data; timer->delete(sd->npc_timer_id, npc->timerevent); sd->npc_timer_id = INVALID_TIMER; // Execute OnTimerQuit - if( nd && nd->bl.type == BL_NPC ) - { + if (nd != NULL) { char buf[EVENT_NAME_LENGTH]; struct event_data *ev; @@ -1027,15 +1032,14 @@ int npc_touch_areanpc(struct map_session_data* sd, int16 m, int16 x, int16 y) *------------------------------------------*/ int npc_untouch_areanpc(struct map_session_data* sd, int16 m, int16 x, int16 y) { - struct npc_data *nd; + struct npc_data *nd = NULL; nullpo_retr(1, sd); if (!sd->areanpc_id) return 0; - nd = (struct npc_data *) map->id2bl(sd->areanpc_id); - if (!nd) - { + nd = map->id2nd(sd->areanpc_id); + if (nd == NULL) { sd->areanpc_id = 0; return 1; } @@ -1166,13 +1170,13 @@ int npc_check_areanpc(int flag, int16 m, int16 x, int16 y, int16 range) { *------------------------------------------*/ struct npc_data* npc_checknear(struct map_session_data* sd, struct block_list* bl) { - struct npc_data *nd; + struct npc_data *nd = BL_CAST(BL_NPC, bl); int distance = AREA_SIZE + 1; nullpo_retr(NULL, sd); - if (bl == NULL) return NULL; - if (bl->type != BL_NPC) return NULL; - nd = (TBL_NPC*)bl; + + if (nd == NULL) + return NULL; if (sd->npc_id == bl->id) return nd; @@ -1297,8 +1301,8 @@ int npc_scriptcont(struct map_session_data* sd, int id, bool closing) { nullpo_retr(1, sd); if( id != sd->npc_id ){ - TBL_NPC* nd_sd=(TBL_NPC*)map->id2bl(sd->npc_id); - TBL_NPC* nd = BL_CAST(BL_NPC, target); + struct npc_data *nd_sd = map->id2nd(sd->npc_id); + struct npc_data *nd = BL_CAST(BL_NPC, target); ShowDebug("npc_scriptcont: %s (sd->npc_id=%d) is not %s (id=%d).\n", nd_sd?(char*)nd_sd->name:"'Unknown NPC'", (int)sd->npc_id, nd?(char*)nd->name:"'Unknown NPC'", (int)id); @@ -1397,7 +1401,8 @@ int npc_cashshop_buylist(struct map_session_data *sd, int points, int count, uns if( points < 0 ) return ERROR_TYPE_MONEY; - if( !(nd = (struct npc_data *)map->id2bl(sd->npc_shopid)) ) + nd = map->id2nd(sd->npc_shopid); + if (nd == NULL) return ERROR_TYPE_NPC; if( nd->subtype != CASHSHOP ) { @@ -1631,11 +1636,10 @@ void npc_trader_update(int master) { CREATE(master_nd->u.scr.shop,struct npc_shop_data,1); iter = db_iterator(map->id_db); - for( bl = (struct block_list*)dbi_first(iter); dbi_exists(iter); bl = (struct block_list*)dbi_next(iter) ) { - if( bl->type == BL_NPC ) { - struct npc_data* nd = (struct npc_data*)bl; - - if( nd->src_id == master ) { + for (bl = dbi_first(iter); dbi_exists(iter); bl = dbi_next(iter)) { + if (bl->type == BL_NPC) { + struct npc_data *nd = BL_UCAST(BL_NPC, bl); + if (nd->src_id == master) { nd->u.scr.shop = master_nd->u.scr.shop; } } @@ -1720,7 +1724,8 @@ int npc_cashshop_buy(struct map_session_data *sd, int nameid, int amount, int po if( sd->state.trading ) return ERROR_TYPE_EXCHANGE; - if( !(nd = (struct npc_data *)map->id2bl(sd->npc_shopid)) ) + nd = map->id2nd(sd->npc_shopid); + if (nd == NULL) return ERROR_TYPE_NPC; if( (item = itemdb->exists(nameid)) == NULL ) @@ -2283,11 +2288,12 @@ int npc_unload(struct npc_data* nd, bool single) if( single && nd->bl.m != -1 ) map->remove_questinfo(nd->bl.m,nd); - if( nd->src_id == 0 && ( nd->subtype == SHOP || nd->subtype == CASHSHOP ) ) //src check for duplicate shops [Orcao] + if (nd->src_id == 0 && ( nd->subtype == SHOP || nd->subtype == CASHSHOP)) { + //src check for duplicate shops [Orcao] aFree(nd->u.shop.shop_item); - else if( nd->subtype == SCRIPT ) { - struct s_mapiterator* iter; - struct block_list* bl; + } else if (nd->subtype == SCRIPT) { + struct s_mapiterator *iter; + struct map_session_data *sd = NULL; if( single ) { npc->ev_db->foreach(npc->ev_db,npc->unload_ev,nd->exname); //Clean up all events related @@ -2295,9 +2301,8 @@ int npc_unload(struct npc_data* nd, bool single) } iter = mapit_geteachpc(); - for( bl = (struct block_list*)mapit->first(iter); mapit->exists(iter); bl = (struct block_list*)mapit->next(iter) ) { - struct map_session_data *sd = ((TBL_PC*)bl); - if( sd && sd->npc_timer_id != INVALID_TIMER ) { + for (sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); sd = BL_UCAST(BL_PC, mapit->next(iter))) { + if (sd->npc_timer_id != INVALID_TIMER ) { const struct TimerData *td = timer->get(sd->npc_timer_id); if( td && td->id != nd->bl.id ) @@ -3430,10 +3435,17 @@ void npc_setcells(struct npc_data* nd) { } } -int npc_unsetcells_sub(struct block_list* bl, va_list ap) { - struct npc_data *nd = (struct npc_data*)bl; - int id = va_arg(ap,int); - if (nd->bl.id == id) return 0; +int npc_unsetcells_sub(struct block_list *bl, va_list ap) +{ + struct npc_data *nd = NULL; + int id = va_arg(ap, int); + + nullpo_ret(bl); + Assert_ret(bl->type == BL_NPC); + nd = BL_UCAST(BL_NPC, bl); + + if (nd->bl.id == id) + return 0; npc->setcells(nd); return 1; } @@ -4663,11 +4675,11 @@ int npc_reload(void) { //Remove all npcs/mobs. [Skotlex] iter = mapit_geteachiddb(); - for( bl = (struct block_list*)mapit->first(iter); mapit->exists(iter); bl = (struct block_list*)mapit->next(iter) ) { + for (bl = mapit->first(iter); mapit->exists(iter); bl = mapit->next(iter)) { switch(bl->type) { case BL_NPC: if( bl->id != npc->fake_nd->bl.id )// don't remove fake_nd - npc->unload((struct npc_data *)bl, false); + npc->unload(BL_UCAST(BL_NPC, bl), false); break; case BL_MOB: unit->free(bl,CLR_OUTSIGHT); @@ -4878,7 +4890,7 @@ int do_init_npc(bool minimal) { } // Init dummy NPC - npc->fake_nd = (struct npc_data *)aCalloc(1,sizeof(struct npc_data)); + CREATE(npc->fake_nd, struct npc_data, 1); npc->fake_nd->bl.m = -1; npc->fake_nd->bl.id = npc->get_new_npc_id(); npc->fake_nd->class_ = FAKE_NPC; diff --git a/src/map/npc_chat.c b/src/map/npc_chat.c index 8950df1ee..fef3ba99b 100644 --- a/src/map/npc_chat.c +++ b/src/map/npc_chat.c @@ -339,15 +339,20 @@ void npc_chat_finalize(struct npc_data* nd) */ int npc_chat_sub(struct block_list* bl, va_list ap) { - struct npc_data *nd = (struct npc_data *) bl; - struct npc_parse *npcParse = nd->chatdb; - char* msg; + struct npc_data *nd = NULL; + struct npc_parse *npcParse = NULL; + char *msg; int len, i; struct map_session_data* sd; struct npc_label_list* lst; struct pcrematch_set* pcreset; struct pcrematch_entry* e; + nullpo_ret(bl); + Assert_ret(bl->type == BL_NPC); + nd = BL_UCAST(BL_NPC, bl); + npcParse = nd->chatdb; + // Not interested in anything you might have to say... if (npcParse == NULL || npcParse->active == NULL) return 0; @@ -395,38 +400,46 @@ int npc_chat_sub(struct block_list* bl, va_list ap) } // Various script built-ins used to support these functions -BUILDIN(defpattern) { +BUILDIN(defpattern) +{ int setid = script_getnum(st,2); const char* pattern = script_getstr(st,3); const char* label = script_getstr(st,4); - struct npc_data* nd = (struct npc_data *)map->id2bl(st->oid); + struct npc_data *nd = map->id2nd(st->oid); + nullpo_retr(false, nd); npc_chat->def_pattern(nd, setid, pattern, label); return true; } -BUILDIN(activatepset) { +BUILDIN(activatepset) +{ int setid = script_getnum(st,2); - struct npc_data* nd = (struct npc_data *)map->id2bl(st->oid); + struct npc_data *nd = map->id2nd(st->oid); + nullpo_retr(false, nd); npc_chat->activate_pcreset(nd, setid); return true; } -BUILDIN(deactivatepset) { +BUILDIN(deactivatepset) +{ int setid = script_getnum(st,2); - struct npc_data* nd = (struct npc_data *)map->id2bl(st->oid); + struct npc_data *nd = map->id2nd(st->oid); + nullpo_retr(false, nd); npc_chat->deactivate_pcreset(nd, setid); return true; } -BUILDIN(deletepset) { +BUILDIN(deletepset) +{ int setid = script_getnum(st,2); - struct npc_data* nd = (struct npc_data *)map->id2bl(st->oid); + struct npc_data *nd = map->id2nd(st->oid); + nullpo_retr(false, nd); npc_chat->delete_pcreset(nd, setid); diff --git a/src/map/party.c b/src/map/party.c index 1b5989f41..a3e59c281 100644 --- a/src/map/party.c +++ b/src/map/party.c @@ -96,8 +96,9 @@ struct map_session_data* party_getavailablesd(struct party_data *p) /*========================================== * Retrieves and validates the sd pointer for this party member [Skotlex] *------------------------------------------*/ -TBL_PC* party_sd_check(int party_id, int account_id, int char_id) { - TBL_PC* sd = map->id2sd(account_id); +struct map_session_data *party_sd_check(int party_id, int account_id, int char_id) +{ + struct map_session_data *sd = map->id2sd(account_id); if (!(sd && sd->status.char_id == char_id)) return NULL; @@ -954,8 +955,8 @@ int party_exp_share(struct party_data* p, struct block_list* src, unsigned int b for (i = 0; i < c; i++) { #ifdef RENEWAL_EXP - if( !(src && src->type == BL_MOB && ((TBL_MOB*)src)->db->mexp) ){ - struct mob_data *md = (TBL_MOB*)src; + struct mob_data *md = BL_CAST(BL_MOB, src); + if (md != NULL && md->db->mexp == 0) { int rate = pc->level_penalty_mod(md->level - (sd[i])->status.base_level, md->status.race, md->status.mode, 1); base_exp = (unsigned int)cap_value(base_exp_bonus * rate / 100, 1, UINT_MAX); @@ -973,16 +974,16 @@ int party_exp_share(struct party_data* p, struct block_list* src, unsigned int b //Does party loot. first_charid holds the charid of the player who has time priority to take the item. int party_share_loot(struct party_data* p, struct map_session_data* sd, struct item* item_data, int first_charid) { - TBL_PC* target = NULL; + struct map_session_data *target = NULL; int i; if (p && p->party.item&2 && (first_charid || !(battle_config.party_share_type&1))) { //item distribution to party members. if (battle_config.party_share_type&2) { //Round Robin - TBL_PC* psd; i = p->itemc; do { + struct map_session_data *psd; i++; if (i >= MAX_PARTY) i = 0; // reset counter to 1st person in party so it'll stop when it reaches "itemc" @@ -1000,7 +1001,7 @@ int party_share_loot(struct party_data* p, struct map_session_data* sd, struct i } while (i != p->itemc); } else { //Random pick - TBL_PC* psd[MAX_PARTY]; + struct map_session_data *psd[MAX_PARTY]; int count = 0; //Collect pick candidates for (i = 0; i < MAX_PARTY; i++) { @@ -1048,7 +1049,11 @@ int party_send_dot_remove(struct map_session_data *sd) // party_foreachsamemap(party->sub_count, sd, 0, &c); int party_sub_count(struct block_list *bl, va_list ap) { - struct map_session_data *sd = (TBL_PC *)bl; + const struct map_session_data *sd = NULL; + + nullpo_ret(bl); + Assert_ret(bl->type == BL_PC); + sd = BL_UCCAST(BL_PC, bl); if (sd->state.autotrade) return 0; @@ -1109,8 +1114,13 @@ int party_vforeachsamemap(int (*func)(struct block_list*,va_list), struct map_se } // Special check for Minstrel's and Wanderer's chorus skills. -int party_sub_count_chorus(struct block_list *bl, va_list ap) { - struct map_session_data *sd = (TBL_PC *)bl; +int party_sub_count_chorus(struct block_list *bl, va_list ap) +{ + const struct map_session_data *sd = NULL; + + nullpo_ret(bl); + Assert_ret(bl->type == BL_PC); + sd = BL_UCCAST(BL_PC, bl); if (sd->state.autotrade) return 0; diff --git a/src/map/party.h b/src/map/party.h index eb3442b92..828916b88 100644 --- a/src/map/party.h +++ b/src/map/party.h @@ -21,7 +21,6 @@ #ifndef MAP_PARTY_H #define MAP_PARTY_H -#include "map/map.h" // TBL_PC #include "common/hercules.h" #include "common/db.h" #include "common/mmo.h" // struct party @@ -31,7 +30,9 @@ #define PARTY_BOOKING_JOBS 6 #define PARTY_BOOKING_RESULTS 10 +struct block_list; struct hplugin_data_store; +struct map_session_data; struct party_member_data { struct map_session_data *sd; @@ -141,7 +142,7 @@ struct party_interface { int (*foreachsamemap) (int (*func)(struct block_list *,va_list),struct map_session_data *sd,int range,...); int (*send_xy_timer) (int tid, int64 tick, int id, intptr_t data); void (*fill_member) (struct party_member* member, struct map_session_data* sd, unsigned int leader); - TBL_PC* (*sd_check) (int party_id, int account_id, int char_id); + struct map_session_data *(*sd_check) (int party_id, int account_id, int char_id); void (*check_state) (struct party_data *p); struct party_booking_ad_info* (*create_booking_data) (void); int (*db_final) (DBKey key, DBData *data, va_list ap); diff --git a/src/map/pc.c b/src/map/pc.c index b6b6787e9..2dfd9519b 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -123,10 +123,11 @@ bool pc_should_log_commands(struct map_session_data *sd) return pcg->should_log_commands(sd->group); } -int pc_invincible_timer(int tid, int64 tick, int id, intptr_t data) { - struct map_session_data *sd; +int pc_invincible_timer(int tid, int64 tick, int id, intptr_t data) +{ + struct map_session_data *sd = map->id2sd(id); - if( (sd=(struct map_session_data *)map->id2sd(id)) == NULL || sd->bl.type!=BL_PC ) + if (sd == NULL) return 1; if(sd->invincible_timer != tid){ @@ -162,10 +163,10 @@ void pc_delinvincibletimer(struct map_session_data* sd) } int pc_spiritball_timer(int tid, int64 tick, int id, intptr_t data) { - struct map_session_data *sd; + struct map_session_data *sd = map->id2sd(id); int i; - if( (sd=(struct map_session_data *)map->id2sd(id)) == NULL || sd->bl.type!=BL_PC ) + if (sd == NULL) return 1; if( sd->spiritball <= 0 ) @@ -286,14 +287,17 @@ int pc_delspiritball(struct map_session_data *sd,int count,int type) } return 0; } -int pc_check_banding( struct block_list *bl, va_list ap ) { +int pc_check_banding(struct block_list *bl, va_list ap) +{ int *c, *b_sd; struct block_list *src; - struct map_session_data *tsd; + const struct map_session_data *tsd; struct status_change *sc; nullpo_ret(bl); - nullpo_ret(tsd = (struct map_session_data*)bl); + Assert_ret(bl->type == BL_PC); + tsd = BL_UCCAST(BL_PC, bl); + nullpo_ret(src = va_arg(ap,struct block_list *)); c = va_arg(ap,int *); b_sd = va_arg(ap, int *); @@ -1858,9 +1862,9 @@ int pc_disguise(struct map_session_data *sd, int class_) { clif->updatestatus(sd,SP_CARTINFO); } if (sd->chatID) { - struct chat_data* cd; + struct chat_data *cd = map->id2cd(sd->chatID); - if( (cd = (struct chat_data*)map->id2bl(sd->chatID)) ) + if (cd != NULL) clif->dispchat(cd,0); } } @@ -3976,7 +3980,7 @@ int pc_bonus5(struct map_session_data *sd,int type,int type2,int type3,int type4 * Grants a player a given skill. * Flag values: @see enum pc_skill_flag *------------------------------------------*/ -int pc_skill(TBL_PC* sd, int id, int level, int flag) +int pc_skill(struct map_session_data *sd, int id, int level, int flag) { uint16 index = 0; nullpo_ret(sd); @@ -5224,7 +5228,7 @@ void pc_bound_clear(struct map_session_data *sd, enum e_item_bound_type type) { *------------------------------------------*/ int pc_show_steal(struct block_list *bl,va_list ap) { - struct map_session_data *sd; + struct map_session_data *sd = NULL, *tsd = NULL; int itemid; struct item_data *item=NULL; @@ -5233,11 +5237,16 @@ int pc_show_steal(struct block_list *bl,va_list ap) sd=va_arg(ap,struct map_session_data *); itemid=va_arg(ap,int); + nullpo_ret(bl); + Assert_ret(bl->type == BL_PC); + tsd = BL_UCAST(BL_PC, bl); + nullpo_ret(sd); + if((item=itemdb->exists(itemid))==NULL) sprintf(output,"%s stole an Unknown Item (id: %i).",sd->status.name, itemid); else sprintf(output,"%s stole %s.",sd->status.name,item->jname); - clif->message( ((struct map_session_data *)bl)->fd, output); + clif->message(tsd->fd, output); return 0; } @@ -5252,15 +5261,13 @@ int pc_steal_item(struct map_session_data *sd,struct block_list *bl, uint16 skil int i,itemid,flag; double rate; struct status_data *sd_status, *md_status; - struct mob_data *md; + struct mob_data *md = BL_CAST(BL_MOB, bl); struct item tmp_item; struct item_data *data = NULL; - if(!sd || !bl || bl->type!=BL_MOB) + if (sd == NULL || md == NULL) return 0; - md = (TBL_MOB *)bl; - if(md->state.steal_flag == UCHAR_MAX || ( md->sc.opt1 && md->sc.opt1 != OPT1_BURNING && md->sc.opt1 != OPT1_CRYSTALIZE ) ) //already stolen from / status change check return 0; @@ -5332,12 +5339,11 @@ int pc_steal_item(struct map_session_data *sd,struct block_list *bl, uint16 skil **/ int pc_steal_coin(struct map_session_data *sd, struct block_list *target) { int rate, skill_lv; - struct mob_data *md; + struct mob_data *md = BL_CAST(BL_MOB, target); - if (!sd || !target || target->type != BL_MOB) + if (sd == NULL || md == NULL) return 0; - md = (TBL_MOB*)target; if (md->state.steal_coin_flag || md->sc.data[SC_STONE] || md->sc.data[SC_FREEZE] || md->status.mode&MD_BOSS) return 0; @@ -7597,11 +7603,11 @@ int pc_dead(struct map_session_data *sd,struct block_list *src) { if (sd->charm_type != CHARM_TYPE_NONE && sd->charm_count > 0) pc->del_charm(sd, sd->charm_count, sd->charm_type); - if (src) { + if (src != NULL) { switch (src->type) { case BL_MOB: { - struct mob_data *md=(struct mob_data *)src; + struct mob_data *md = BL_UCAST(BL_MOB, src); if (md->target_id==sd->bl.id) mob->unlocktarget(md,tick); if (battle_config.mobs_level_up && md->status.hp @@ -7623,19 +7629,19 @@ int pc_dead(struct map_session_data *sd,struct block_list *src) { } break; case BL_PET: //Pass on to master... - src = &((TBL_PET*)src)->msd->bl; + src = &BL_UCAST(BL_PET, src)->msd->bl; break; case BL_HOM: - src = &((TBL_HOM*)src)->master->bl; + src = &BL_UCAST(BL_HOM, src)->master->bl; break; case BL_MER: - src = &((TBL_MER*)src)->master->bl; + src = &BL_UCAST(BL_MER, src)->master->bl; break; } } - if (src && src->type == BL_PC) { - struct map_session_data *ssd = (struct map_session_data *)src; + if (src != NULL && src->type == BL_PC) { + struct map_session_data *ssd = BL_UCAST(BL_PC, src); pc->setparam(ssd, SP_KILLEDRID, sd->bl.id); npc->script_event(ssd, NPCE_KILLPC); @@ -7821,9 +7827,8 @@ int pc_dead(struct map_session_data *sd,struct block_list *src) { if( map->list[sd->bl.m].flag.pvp && !battle_config.pk_mode && !map->list[sd->bl.m].flag.pvp_nocalcrank ) { sd->pvp_point -= 5; sd->pvp_lost++; - if( src && src->type == BL_PC ) - { - struct map_session_data *ssd = (struct map_session_data *)src; + if (src != NULL && src->type == BL_PC) { + struct map_session_data *ssd = BL_UCAST(BL_PC, src); ssd->pvp_point++; ssd->pvp_won++; } @@ -8323,11 +8328,12 @@ int pc_percentheal(struct map_session_data *sd,int hp,int sp) int jobchange_killclone(struct block_list *bl, va_list ap) { - struct mob_data *md; - int flag; - md = (struct mob_data *)bl; - nullpo_ret(md); - flag = va_arg(ap, int); + struct mob_data *md = NULL; + int flag = va_arg(ap, int); + + nullpo_ret(bl); + Assert_ret(bl->type == BL_MOB); + md = BL_UCAST(BL_MOB, bl); if (md->master_id && md->special_state.clone && md->master_id == flag) status_kill(&md->bl); @@ -8778,7 +8784,7 @@ int pc_setcart(struct map_session_data *sd,int type) { * @param sd Target player. * @param flag New state. **/ -void pc_setfalcon(TBL_PC* sd, bool flag) +void pc_setfalcon(struct map_session_data *sd, bool flag) { if (flag) { if (pc->checkskill(sd,HT_FALCON) > 0) // add falcon if he have the skill @@ -8796,7 +8802,7 @@ void pc_setfalcon(TBL_PC* sd, bool flag) * @param sd Target player. * @param flag New state. **/ -void pc_setridingpeco(TBL_PC* sd, bool flag) +void pc_setridingpeco(struct map_session_data *sd, bool flag) { if (flag) { if (pc->checkskill(sd, KN_RIDING)) @@ -8832,7 +8838,7 @@ void pc_setmadogear(struct map_session_data *sd, bool flag) * @param sd Target player. * @param type New state. This must be a valid OPTION_DRAGON* or 0. **/ -void pc_setridingdragon(TBL_PC* sd, unsigned int type) +void pc_setridingdragon(struct map_session_data *sd, unsigned int type) { if (type&OPTION_DRAGON) { // Ensure only one dragon is set at a time. @@ -8864,7 +8870,7 @@ void pc_setridingdragon(TBL_PC* sd, unsigned int type) * @param sd Target player. * @param flag New state. **/ -void pc_setridingwug(TBL_PC* sd, bool flag) +void pc_setridingwug(struct map_session_data *sd, bool flag) { if (flag) { if (pc->checkskill(sd, RA_WUGRIDER) > 0) @@ -9999,12 +10005,15 @@ int pc_checkitem(struct map_session_data *sd) /*========================================== * Update PVP rank for sd1 in cmp to sd2 *------------------------------------------*/ -int pc_calc_pvprank_sub(struct block_list *bl,va_list ap) +int pc_calc_pvprank_sub(struct block_list *bl, va_list ap) { - struct map_session_data *sd1,*sd2; + struct map_session_data *sd1 = NULL; + struct map_session_data *sd2 = va_arg(ap,struct map_session_data *); - sd1=(struct map_session_data *)bl; - sd2=va_arg(ap,struct map_session_data *); + nullpo_ret(bl); + Assert_ret(bl->type == BL_PC); + sd1 = BL_UCAST(BL_PC, bl); + nullpo_ret(sd2); if (pc_isinvisible(sd1) ||pc_isinvisible(sd2)) { // cannot register pvp rank for hidden GMs @@ -10259,8 +10268,7 @@ int pc_autosave(int tid, int64 tick, int id, intptr_t data) { save_flag = 1; //Noone was saved, so save first found char. iter = mapit_getallusers(); - for( sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); sd = (TBL_PC*)mapit->next(iter) ) - { + for (sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); sd = BL_UCAST(BL_PC, mapit->next(iter))) { if(sd->bl.id == last_save_id && save_flag != 1) { save_flag = 1; continue; @@ -10403,10 +10411,10 @@ bool pc_can_use_command(struct map_session_data *sd, const char *command) { */ int pc_charm_timer(int tid, int64 tick, int id, intptr_t data) { - struct map_session_data *sd; + struct map_session_data *sd = map->id2sd(id); int i; - if( (sd=(struct map_session_data *)map->id2sd(id)) == NULL || sd->bl.type!=BL_PC ) + if (sd == NULL) return 1; if (sd->charm_count <= 0) { @@ -10814,7 +10822,7 @@ void pc_read_skill_tree(void) /* lets update all players skill tree */ iter = mapit_getallusers(); - for( sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); sd = (TBL_PC*)mapit->next(iter) ) + for (sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); sd = BL_UCAST(BL_PC, mapit->next(iter))) clif->skillinfoblock(sd); mapit->free(iter); } @@ -11197,7 +11205,7 @@ int pc_global_expiration_timer(int tid, int64 tick, int id, intptr_t data) { struct map_session_data* sd; iter = mapit_getallusers(); - for( sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); sd = (TBL_PC*)mapit->next(iter) ) { + for (sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); sd = BL_UCAST(BL_PC, mapit->next(iter))) { if( sd->expiration_time ) pc->expire_check(sd); } @@ -11243,7 +11251,7 @@ void pc_autotrade_load(void) SQL->GetData(map->mysql_handle, 2, &data, NULL); sex = atoi(data); SQL->GetData(map->mysql_handle, 3, &data, NULL); safestrncpy(title, data, sizeof(title)); - CREATE(sd, TBL_PC, 1); + CREATE(sd, struct map_session_data, 1); pc->setnewpc(sd, account_id, char_id, 0, 0, sex, 0); @@ -11389,7 +11397,7 @@ void pc_autotrade_prepare(struct map_session_data *sd) { map->quit(sd); chrif->auth_delete(account_id, char_id, ST_LOGOUT); - CREATE(sd, TBL_PC, 1); + CREATE(sd, struct map_session_data, 1); pc->setnewpc(sd, account_id, char_id, 0, 0, sex, 0); diff --git a/src/map/pc_groups.c b/src/map/pc_groups.c index 675a8b62e..bd46b9616 100644 --- a/src/map/pc_groups.c +++ b/src/map/pc_groups.c @@ -508,7 +508,7 @@ void pc_groups_reload(void) { /* refresh online users permissions */ iter = mapit_getallusers(); - for (sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); sd = (TBL_PC*)mapit->next(iter)) { + for (sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); sd = BL_UCAST(BL_PC, mapit->next(iter))) { if (pc->set_group(sd, sd->group_id) != 0) { ShowWarning("pc_groups_reload: %s (AID:%d) has unknown group id (%d)! kicking...\n", sd->status.name, sd->status.account_id, pc_get_group_id(sd)); diff --git a/src/map/pet.c b/src/map/pet.c index 18a5ba915..db8d0d1f1 100644 --- a/src/map/pet.c +++ b/src/map/pet.c @@ -359,9 +359,10 @@ int pet_data_init(struct map_session_data *sd, struct s_pet *petinfo) sd->status.pet_id = 0; return 1; } - sd->pd = pd = (struct pet_data *)aCalloc(1,sizeof(struct pet_data)); + CREATE(pd, struct pet_data, 1); pd->bl.type = BL_PET; pd->bl.id = npc->get_new_npc_id(); + sd->pd = pd; pd->msd = sd; pd->petDB = &pet->db[i]; @@ -505,13 +506,15 @@ int pet_catch_process1(struct map_session_data *sd,int target_class) } int pet_catch_process2(struct map_session_data* sd, int target_id) { - struct mob_data* md; + struct mob_data *md = NULL; + struct block_list *bl = NULL; int i = 0, pet_catch_rate = 0; nullpo_retr(1, sd); - md = (struct mob_data*)map->id2bl(target_id); - if(!md || md->bl.type != BL_MOB || md->bl.prev == NULL) { + bl = map->id2bl(target_id); // TODO: Why does this not use map->id2md? + md = BL_CAST(BL_MOB, bl); + if (md == NULL || md->bl.prev == NULL) { // Invalid inputs/state, abort capture. clif->pet_roulette(sd,0); sd->catch_target_class = -1; @@ -937,7 +940,7 @@ int pet_ai_sub_hard(struct pet_data *pd, struct map_session_data *sd, int64 tick pet->unlocktarget(pd); return 0; } else{ - struct flooritem_data *fitem = (struct flooritem_data *)target; + struct flooritem_data *fitem = BL_UCAST(BL_ITEM, target); if(pd->loot->count < pd->loot->max){ memcpy(&pd->loot->item[pd->loot->count++],&fitem->item_data,sizeof(pd->loot->item[0])); pd->loot->weight += itemdb_weight(fitem->item_data.nameid)*fitem->item_data.amount; @@ -964,15 +967,16 @@ int pet_ai_hard(int tid, int64 tick, int id, intptr_t data) { return 0; } -int pet_ai_sub_hard_lootsearch(struct block_list *bl,va_list ap) +int pet_ai_sub_hard_lootsearch(struct block_list *bl, va_list ap) { - struct pet_data* pd; - struct flooritem_data *fitem = (struct flooritem_data *)bl; - struct block_list **target; - int sd_charid =0; - - pd=va_arg(ap,struct pet_data *); - target=va_arg(ap,struct block_list**); + struct pet_data *pd = va_arg(ap,struct pet_data *); + struct block_list **target = va_arg(ap,struct block_list**); + struct flooritem_data *fitem = NULL; + int sd_charid = 0; + + nullpo_ret(bl); + Assert_ret(bl->type == BL_ITEM); + fitem = BL_UCAST(BL_ITEM, bl); sd_charid = fitem->first_get_charid; diff --git a/src/map/quest.c b/src/map/quest.c index 9a6200138..0dbea56f8 100644 --- a/src/map/quest.c +++ b/src/map/quest.c @@ -75,7 +75,7 @@ struct quest_db *quest_db(int quest_id) { * @param sd Player's data * @return 0 in case of success, nonzero otherwise (i.e. the player has no quests) */ -int quest_pc_login(TBL_PC *sd) +int quest_pc_login(struct map_session_data *sd) { #if PACKETVER < 20141022 int i; @@ -106,7 +106,8 @@ int quest_pc_login(TBL_PC *sd) * @param quest_id ID of the quest to add. * @return 0 in case of success, nonzero otherwise */ -int quest_add(TBL_PC *sd, int quest_id) { +int quest_add(struct map_session_data *sd, int quest_id) +{ int n; struct quest_db *qi = quest->db(quest_id); @@ -157,7 +158,8 @@ int quest_add(TBL_PC *sd, int quest_id) { * @param qid2 New quest to add * @return 0 in case of success, nonzero otherwise */ -int quest_change(TBL_PC *sd, int qid1, int qid2) { +int quest_change(struct map_session_data *sd, int qid1, int qid2) +{ int i; struct quest_db *qi = quest->db(qid2); @@ -207,7 +209,8 @@ int quest_change(TBL_PC *sd, int qid1, int qid2) { * @param quest_id ID of the quest to remove * @return 0 in case of success, nonzero otherwise */ -int quest_delete(TBL_PC *sd, int quest_id) { +int quest_delete(struct map_session_data *sd, int quest_id) +{ int i; //Search for quest @@ -249,15 +252,15 @@ int quest_delete(TBL_PC *sd, int quest_id) { * int Party ID * int Mob ID */ -int quest_update_objective_sub(struct block_list *bl, va_list ap) { - struct map_session_data *sd; - int mob_id, party_id; +int quest_update_objective_sub(struct block_list *bl, va_list ap) +{ + struct map_session_data *sd = NULL; + int party_id = va_arg(ap, int); + int mob_id = va_arg(ap, int); nullpo_ret(bl); - nullpo_ret(sd = (struct map_session_data *)bl); - - party_id = va_arg(ap,int); - mob_id = va_arg(ap,int); + Assert_ret(bl->type == BL_PC); + sd = BL_UCAST(BL_PC, bl); if( !sd->avail_quests ) return 0; @@ -276,7 +279,7 @@ int quest_update_objective_sub(struct block_list *bl, va_list ap) { * @param sd Character's data * @param mob_id Monster ID */ -void quest_update_objective(TBL_PC *sd, int mob_id) +void quest_update_objective(struct map_session_data *sd, int mob_id) { int i,j; @@ -331,7 +334,8 @@ void quest_update_objective(TBL_PC *sd, int mob_id) * @param qs New quest state * @return 0 in case of success, nonzero otherwise */ -int quest_update_status(TBL_PC *sd, int quest_id, enum quest_state qs) { +int quest_update_status(struct map_session_data *sd, int quest_id, enum quest_state qs) +{ int i; ARR_FIND(0, sd->avail_quests, i, sd->quest_log[i].quest_id == quest_id); @@ -380,7 +384,7 @@ int quest_update_status(TBL_PC *sd, int quest_id, enum quest_state qs) { * 1 if the quest's timeout has expired * 0 otherwise */ -int quest_check(TBL_PC *sd, int quest_id, enum quest_check_type type) +int quest_check(struct map_session_data *sd, int quest_id, enum quest_check_type type) { int i; diff --git a/src/map/quest.h b/src/map/quest.h index 567f0692a..8e2cb4e23 100644 --- a/src/map/quest.h +++ b/src/map/quest.h @@ -21,9 +21,12 @@ #ifndef MAP_QUEST_H #define MAP_QUEST_H -#include "map/map.h" // TBL_PC #include "common/hercules.h" #include "common/conf.h" +#include "common/mmo.h" // enum quest_state + +struct block_list; +struct map_session_data; #define MAX_QUEST_DB (60355+1) // Highest quest ID + 1 @@ -64,14 +67,14 @@ struct quest_interface { void (*reload) (void); /* */ struct quest_db *(*db) (int quest_id); - int (*pc_login) (TBL_PC *sd); - int (*add) (TBL_PC *sd, int quest_id); - int (*change) (TBL_PC *sd, int qid1, int qid2); - int (*delete) (TBL_PC *sd, int quest_id); + int (*pc_login) (struct map_session_data *sd); + int (*add) (struct map_session_data *sd, int quest_id); + int (*change) (struct map_session_data *sd, int qid1, int qid2); + int (*delete) (struct map_session_data *sd, int quest_id); int (*update_objective_sub) (struct block_list *bl, va_list ap); - void (*update_objective) (TBL_PC *sd, int mob_id); - int (*update_status) (TBL_PC *sd, int quest_id, enum quest_state qs); - int (*check) (TBL_PC *sd, int quest_id, enum quest_check_type type); + void (*update_objective) (struct map_session_data *sd, int mob_id); + int (*update_status) (struct map_session_data *sd, int quest_id, enum quest_state qs); + int (*check) (struct map_session_data *sd, int quest_id, enum quest_check_type type); void (*clear) (void); int (*read_db) (void); struct quest_db *(*read_db_sub) (config_setting_t *cs, int n, const char *source); diff --git a/src/map/script.c b/src/map/script.c index 1e19cb85b..befb85304 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -226,10 +226,13 @@ void script_reportsrc(struct script_state *st) { switch( bl->type ) { case BL_NPC: - if( bl->m >= 0 ) - ShowDebug("Source (NPC): %s at %s (%d,%d)\n", ((struct npc_data *)bl)->name, map->list[bl->m].name, bl->x, bl->y); + { + const struct npc_data *nd = BL_UCCAST(BL_NPC, bl); + if (bl->m >= 0) + ShowDebug("Source (NPC): %s at %s (%d,%d)\n", nd->name, map->list[bl->m].name, bl->x, bl->y); else - ShowDebug("Source (NPC): %s (invisible/not on a map)\n", ((struct npc_data *)bl)->name); + ShowDebug("Source (NPC): %s (invisible/not on a map)\n", nd->name); + } break; default: if( bl->m >= 0 ) @@ -2633,8 +2636,9 @@ struct script_code* parse_script(const char *src,const char *file,int line,int o /// Returns the player attached to this script, identified by the rid. /// If there is no player attached, the script is terminated. -TBL_PC *script_rid2sd(struct script_state *st) { - TBL_PC *sd; +struct map_session_data *script_rid2sd(struct script_state *st) +{ + struct map_session_data *sd; if( !( sd = map->id2sd(st->rid) ) ) { ShowError("script_rid2sd: fatal error ! player not attached!\n"); script->reportfunc(st); @@ -2644,8 +2648,9 @@ TBL_PC *script_rid2sd(struct script_state *st) { return sd; } -TBL_PC *script_id2sd(struct script_state *st, int account_id) { - TBL_PC *sd; +struct map_session_data *script_id2sd(struct script_state *st, int account_id) +{ + struct map_session_data *sd; if ((sd = map->id2sd(account_id)) == NULL) { ShowWarning("script_id2sd: Player with account ID '%d' not found!\n", account_id); script->reportfunc(st); @@ -2654,8 +2659,9 @@ TBL_PC *script_id2sd(struct script_state *st, int account_id) { return sd; } -TBL_PC *script_charid2sd(struct script_state *st, int char_id) { - TBL_PC *sd; +struct map_session_data *script_charid2sd(struct script_state *st, int char_id) +{ + struct map_session_data *sd; if ((sd = map->charid2sd(char_id)) == NULL) { ShowWarning("script_charid2sd: Player with char ID '%d' not found!\n", char_id); script->reportfunc(st); @@ -2664,8 +2670,9 @@ TBL_PC *script_charid2sd(struct script_state *st, int char_id) { return sd; } -TBL_PC *script_nick2sd(struct script_state *st, const char *name) { - TBL_PC *sd; +struct map_session_data *script_nick2sd(struct script_state *st, const char *name) +{ + struct map_session_data *sd; if ((sd = map->nick2sd(name)) == NULL) { ShowWarning("script_nick2sd: Player name '%s' not found!\n", name); script->reportfunc(st); @@ -2717,7 +2724,7 @@ struct script_data *get_val(struct script_state* st, struct script_data* data) { const char* name; char prefix; char postfix; - TBL_PC* sd = NULL; + struct map_session_data *sd = NULL; if( !data_isreference(data) ) return data;// not a variable/constant @@ -3146,7 +3153,8 @@ void set_reg_instance_num(struct script_state* st, int64 num, const char* name, * * TODO: return values are screwed up, have been for some time (reaad: years), e.g. some functions return 1 failure and success. *------------------------------------------*/ -int set_reg(struct script_state* st, TBL_PC* sd, int64 num, const char* name, const void* value, struct reg_db *ref) { +int set_reg(struct script_state *st, struct map_session_data *sd, int64 num, const char *name, const void *value, struct reg_db *ref) +{ char prefix = name[0]; if (strlen(name) > SCRIPT_VARNAME_LENGTH) { @@ -3231,11 +3239,13 @@ int set_reg(struct script_state* st, TBL_PC* sd, int64 num, const char* name, co } } -int set_var(TBL_PC* sd, char* name, void* val) { +int set_var(struct map_session_data *sd, char *name, void *val) +{ return script->set_reg(NULL, sd, reference_uid(script->add_str(name),0), name, val, NULL); } -void setd_sub(struct script_state *st, TBL_PC *sd, const char *varname, int elem, void *value, struct reg_db *ref) { +void setd_sub(struct script_state *st, struct map_session_data *sd, const char *varname, int elem, void *value, struct reg_db *ref) +{ script->set_reg(st, sd, reference_uid(script->add_str(varname),elem), varname, value, ref); } @@ -4156,7 +4166,7 @@ void script_stop_instances(struct script_code *code) { int run_script_timer(int tid, int64 tick, int id, intptr_t data) { struct script_state *st = idb_get(script->st_db,(int)data); if( st ) { - TBL_PC *sd = map->id2sd(st->rid); + struct map_session_data *sd = map->id2sd(st->rid); if((sd && sd->status.char_id != id) || (st->rid && !sd)) { //Character mismatch. Cancel execution. st->rid = 0; @@ -4241,7 +4251,7 @@ void script_attach_state(struct script_state* st) { void run_script_main(struct script_state *st) { int cmdcount = script->config.check_cmdcount; int gotocount = script->config.check_gotocount; - TBL_PC *sd; + struct map_session_data *sd; struct script_stack *stack = st->stack; struct npc_data *nd; @@ -5158,8 +5168,9 @@ const char *script_getfuncname(struct script_state *st) { /// If a dialog doesn't exist yet, one is created. /// /// mes "<message>"; -BUILDIN(mes) { - TBL_PC* sd = script->rid2sd(st); +BUILDIN(mes) +{ + struct map_session_data *sd = script->rid2sd(st); if( sd == NULL ) return true; @@ -5183,10 +5194,8 @@ BUILDIN(mes) { /// next; BUILDIN(next) { - TBL_PC* sd; - - sd = script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; #ifdef SECURE_NPCTIMEOUT sd->npc_idle_type = NPCT_WAIT; @@ -5200,11 +5209,10 @@ BUILDIN(next) /// The dialog is closed when the button is pressed. /// /// close; -BUILDIN(close) { - TBL_PC* sd; - - sd = script->rid2sd(st); - if( sd == NULL ) +BUILDIN(close) +{ + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; st->state = sd->state.dialog == 1 ? CLOSE : END; @@ -5216,11 +5224,10 @@ BUILDIN(close) { /// The dialog is closed and the script continues when the button is pressed. /// /// close2; -BUILDIN(close2) { - TBL_PC* sd; - - sd = script->rid2sd(st); - if( sd == NULL ) +BUILDIN(close2) +{ + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; if( sd->state.dialog == 1 ) @@ -5290,10 +5297,8 @@ BUILDIN(menu) { int i; const char* text; - TBL_PC* sd; - - sd = script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; #ifdef SECURE_NPCTIMEOUT @@ -5414,10 +5419,8 @@ BUILDIN(select) { int i; const char* text; - TBL_PC* sd; - - sd = script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; #ifdef SECURE_NPCTIMEOUT @@ -5491,10 +5494,8 @@ BUILDIN(prompt) { int i; const char *text; - TBL_PC* sd; - - sd = script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; #ifdef SECURE_NPCTIMEOUT @@ -5821,10 +5822,8 @@ BUILDIN(warp) int x,y; int warp_clean = 1; const char* str; - TBL_PC* sd; - - sd = script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; str = script_getstr(st,2); @@ -5853,10 +5852,15 @@ BUILDIN(warp) /*========================================== * Warp a specified area *------------------------------------------*/ -int buildin_areawarp_sub(struct block_list *bl,va_list ap) +int buildin_areawarp_sub(struct block_list *bl, va_list ap) { int x2,y2,x3,y3; unsigned int index; + struct map_session_data *sd = NULL; + + nullpo_ret(bl); + Assert_ret(bl->type == BL_PC); + sd = BL_UCAST(BL_PC, bl); index = va_arg(ap,unsigned int); x2 = va_arg(ap,int); @@ -5864,9 +5868,9 @@ int buildin_areawarp_sub(struct block_list *bl,va_list ap) x3 = va_arg(ap,int); y3 = va_arg(ap,int); - if(index == 0) - pc->randomwarp((TBL_PC *)bl,CLR_TELEPORT); - else if(x3 && y3) { + if (index == 0) { + pc->randomwarp(sd, CLR_TELEPORT); + } else if (x3 != 0 && y3 != 0) { int max, tx, ty, j = 0; // choose a suitable max number of attempts @@ -5880,10 +5884,10 @@ int buildin_areawarp_sub(struct block_list *bl,va_list ap) j++; } while (map->getcell(index, bl, tx, ty, CELL_CHKNOPASS) && j < max); - pc->setpos((TBL_PC *)bl,index,tx,ty,CLR_OUTSIGHT); + pc->setpos(sd, index, tx, ty, CLR_OUTSIGHT); + } else { + pc->setpos(sd, index, x2, y2, CLR_OUTSIGHT); } - else - pc->setpos((TBL_PC *)bl,index,x2,y2,CLR_OUTSIGHT); return 0; } BUILDIN(areawarp) @@ -5928,14 +5932,20 @@ BUILDIN(areawarp) /*========================================== * areapercentheal <map>,<x1>,<y1>,<x2>,<y2>,<hp>,<sp> *------------------------------------------*/ -int buildin_areapercentheal_sub(struct block_list *bl,va_list ap) +int buildin_areapercentheal_sub(struct block_list *bl, va_list ap) { - int hp, sp; - hp = va_arg(ap, int); - sp = va_arg(ap, int); - pc->percentheal((TBL_PC *)bl,hp,sp); + int hp = va_arg(ap, int); + int sp = va_arg(ap, int); + struct map_session_data *sd = NULL; + + nullpo_ret(bl); + Assert_ret(bl->type == BL_PC); + sd = BL_UCAST(BL_PC, bl); + + pc->percentheal(sd, hp, sp); return 0; } + BUILDIN(areapercentheal) { int hp,sp,m; const char *mapname; @@ -5965,7 +5975,7 @@ BUILDIN(areapercentheal) { BUILDIN(warpchar) { int x,y,a; const char *str; - TBL_PC *sd; + struct map_session_data *sd; str=script_getstr(st,2); x=script_getnum(st,3); @@ -5993,8 +6003,8 @@ BUILDIN(warpchar) { *------------------------------------------*/ BUILDIN(warpparty) { - TBL_PC *sd = NULL; - TBL_PC *pl_sd; + struct map_session_data *sd = NULL; + struct map_session_data *pl_sd; struct party_data* p; int type; int map_index; @@ -6082,8 +6092,8 @@ BUILDIN(warpparty) *------------------------------------------*/ BUILDIN(warpguild) { - TBL_PC *sd = NULL; - TBL_PC *pl_sd; + struct map_session_data *sd = NULL; + struct map_session_data *pl_sd; struct guild* g; struct s_mapiterator* iter; int type; @@ -6108,8 +6118,7 @@ BUILDIN(warpguild) } iter = mapit_getallusers(); - for( pl_sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); pl_sd = (TBL_PC*)mapit->next(iter) ) - { + for (pl_sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); pl_sd = BL_UCAST(BL_PC, mapit->next(iter))) { if( pl_sd->status.guild_id != gid ) continue; @@ -6140,12 +6149,12 @@ BUILDIN(warpguild) /*========================================== * Force Heal a player (hp and sp) *------------------------------------------*/ -BUILDIN(heal) { - TBL_PC *sd; +BUILDIN(heal) +{ int hp,sp; - - sd = script->rid2sd(st); - if (!sd) return true; + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) + return true; hp=script_getnum(st,2); sp=script_getnum(st,3); @@ -6157,7 +6166,7 @@ BUILDIN(heal) { *------------------------------------------*/ BUILDIN(itemheal) { - TBL_PC *sd; + struct map_session_data *sd; int hp,sp; hp=script_getnum(st,2); @@ -6180,7 +6189,7 @@ BUILDIN(itemheal) BUILDIN(percentheal) { int hp,sp; - TBL_PC* sd; + struct map_session_data *sd; hp=script_getnum(st,2); sp=script_getnum(st,3); @@ -6213,12 +6222,9 @@ BUILDIN(jobchange) if( script_hasdata(st,3) ) upper=script_getnum(st,3); - if (pc->db_checkid(job)) - { - TBL_PC* sd; - - sd = script->rid2sd(st); - if( sd == NULL ) + if (pc->db_checkid(job)) { + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; pc->jobchange(sd, job, upper); @@ -6246,15 +6252,13 @@ BUILDIN(jobname) /// input(<var>{,<min>{,<max>}}) -> <int> BUILDIN(input) { - TBL_PC* sd; struct script_data* data; int64 uid; const char* name; int min; int max; - - sd = script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; data = script_getdata(st,2); @@ -6308,8 +6312,9 @@ BUILDIN(copyarray); /// The value is converted to the type of the variable. /// /// set(<variable>,<value>) -> <variable> -BUILDIN(__setr) { - TBL_PC* sd = NULL; +BUILDIN(__setr) +{ + struct map_session_data *sd = NULL; struct script_data* data; //struct script_data* datavalue; int64 num; @@ -6402,7 +6407,7 @@ BUILDIN(setarray) uint32 end; int32 id; int32 i; - TBL_PC* sd = NULL; + struct map_session_data *sd = NULL; data = script_getdata(st, 2); if( !data_isreference(data) || reference_toconstant(data) ) @@ -6453,7 +6458,7 @@ BUILDIN(cleararray) uint32 end; int32 id; void* v; - TBL_PC* sd = NULL; + struct map_session_data *sd = NULL; data = script_getdata(st, 2); if( !data_isreference(data) ) @@ -6506,7 +6511,7 @@ BUILDIN(copyarray) void* v; int32 i; uint32 count; - TBL_PC* sd = NULL; + struct map_session_data *sd = NULL; data1 = script_getdata(st, 2); data2 = script_getdata(st, 3); @@ -6608,7 +6613,7 @@ BUILDIN(deletearray) const char* name; unsigned int start, end, i; int id; - TBL_PC *sd = NULL; + struct map_session_data *sd = NULL; struct script_array *sa = NULL; struct reg_db *src = NULL; void *value; @@ -6757,7 +6762,7 @@ BUILDIN(getelementofarray) BUILDIN(setlook) { int type,val; - TBL_PC* sd; + struct map_session_data *sd; type=script_getnum(st,2); val=script_getnum(st,3); @@ -6774,7 +6779,7 @@ BUILDIN(setlook) BUILDIN(changelook) { // As setlook but only client side int type,val; - TBL_PC* sd; + struct map_session_data *sd; type=script_getnum(st,2); val=script_getnum(st,3); @@ -6793,10 +6798,8 @@ BUILDIN(changelook) *------------------------------------------*/ BUILDIN(cutin) { - TBL_PC* sd; - - sd = script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; clif->cutin(sd,script_getstr(st,2),script_getnum(st,3)); @@ -6809,7 +6812,7 @@ BUILDIN(cutin) BUILDIN(viewpoint) { int type,x,y,id,color; - TBL_PC* sd; + struct map_session_data *sd; type=script_getnum(st,2); x=script_getnum(st,3); @@ -6834,8 +6837,8 @@ BUILDIN(countitem) { int count = 0; struct item_data* id = NULL; - TBL_PC* sd = script->rid2sd(st); - if( !sd ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; if( script_isstringtype(st, 2) ) { @@ -6872,8 +6875,8 @@ BUILDIN(countitem2) { int i; struct item_data* id = NULL; - TBL_PC* sd = script->rid2sd(st); - if( !sd ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; if( script_isstringtype(st, 2) ) { @@ -7017,8 +7020,7 @@ BUILDIN(checkweight2) int32 idx_it, idx_nb; int nb_it, nb_nb; //array size - TBL_PC *sd = script->rid2sd(st); - + struct map_session_data *sd = script->rid2sd(st); if (sd == NULL) return true; @@ -7110,7 +7112,7 @@ BUILDIN(checkweight2) BUILDIN(getitem) { int nameid,amount,get_count,i,flag = 0, offset = 0; struct item it; - TBL_PC *sd; + struct map_session_data *sd; struct item_data *item_data; if( script_isstringtype(st, 2) ) { @@ -7196,7 +7198,7 @@ BUILDIN(getitem2) { int nameid,amount,flag = 0, offset = 0; int iden,ref,attr,c1,c2,c3,c4, bound = 0; - TBL_PC *sd; + struct map_session_data *sd; if( !strcmp(script->getfuncname(st),"getitembound2") ) { bound = script_getnum(st,11); @@ -7353,7 +7355,7 @@ BUILDIN(rentitem) { BUILDIN(getnameditem) { int nameid; struct item item_tmp; - TBL_PC *sd, *tsd; + struct map_session_data *sd, *tsd; sd = script->rid2sd(st); if (sd == NULL) // Player not attached! @@ -7466,9 +7468,9 @@ BUILDIN(makeitem) y = script_getnum(st,6); if(strcmp(mapname,"this")==0) { - TBL_PC *sd; - sd = script->rid2sd(st); - if (!sd) return true; //Failed... + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) + return true; //Failed... m=sd->bl.m; } else m=map->mapname2mapid(mapname); @@ -7621,8 +7623,9 @@ bool buildin_delitem_search(struct map_session_data* sd, struct item* it, bool e /// /// delitem <item id>,<amount>{,<account id>} /// delitem "<item name>",<amount>{,<account id>} -BUILDIN(delitem) { - TBL_PC *sd; +BUILDIN(delitem) +{ + struct map_session_data *sd; struct item it; if (script_hasdata(st,4)) { @@ -7677,8 +7680,9 @@ BUILDIN(delitem) { /// /// delitem2 <item id>,<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<account ID>} /// delitem2 "<Item name>",<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<account ID>} -BUILDIN(delitem2) { - TBL_PC *sd; +BUILDIN(delitem2) +{ + struct map_session_data *sd; struct item it; if (script_hasdata(st,11)) { @@ -7741,18 +7745,16 @@ BUILDIN(delitem2) { *------------------------------------------*/ BUILDIN(enableitemuse) { - TBL_PC *sd; - sd=script->rid2sd(st); - if (sd) + struct map_session_data *sd = script->rid2sd(st); + if (sd != NULL) st->npc_item_flag = sd->npc_item_flag = 1; return true; } BUILDIN(disableitemuse) { - TBL_PC *sd; - sd=script->rid2sd(st); - if (sd) + struct map_session_data *sd = script->rid2sd(st); + if (sd != NULL) st->npc_item_flag = sd->npc_item_flag = 0; return true; } @@ -7763,7 +7765,7 @@ BUILDIN(disableitemuse) *------------------------------------------*/ BUILDIN(readparam) { int type; - TBL_PC *sd; + struct map_session_data *sd; type=script_getnum(st,2); if (script_hasdata(st,3)) @@ -7792,7 +7794,7 @@ BUILDIN(readparam) { *------------------------------------------*/ BUILDIN(getcharid) { int num; - TBL_PC *sd; + struct map_session_data *sd; num = script_getnum(st,2); if( script_hasdata(st,3) ) @@ -8066,13 +8068,11 @@ BUILDIN(getguildmember) *------------------------------------------*/ BUILDIN(strcharinfo) { - TBL_PC *sd; int num; struct guild* g; struct party_data* p; - - sd=script->rid2sd(st); - if (!sd) //Avoid crashing.... + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) //Avoid crashing.... return true; num=script_getnum(st,2); @@ -8115,13 +8115,12 @@ BUILDIN(strcharinfo) * 3 : ::str * 4 : map name *------------------------------------------*/ -BUILDIN(strnpcinfo) { - TBL_NPC* nd; +BUILDIN(strnpcinfo) +{ int num; char *buf,*name=NULL; - - nd = map->id2nd(st->oid); - if (!nd) { + struct npc_data *nd = map->id2nd(st->oid); + if (nd == NULL) { script_pushconststr(st, ""); return true; } @@ -8166,7 +8165,7 @@ BUILDIN(strnpcinfo) { BUILDIN(charid2rid) { int cid = script_getnum(st, 2); - TBL_PC *sd = map->charid2sd(cid); + struct map_session_data *sd = map->charid2sd(cid); if (sd == NULL) { script_pushint(st, 0); @@ -8183,11 +8182,9 @@ BUILDIN(charid2rid) BUILDIN(getequipid) { int i, num; - TBL_PC* sd; struct item_data* item; - - sd = script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; num = script_getnum(st,2) - 1; @@ -8221,11 +8218,9 @@ BUILDIN(getequipid) BUILDIN(getequipname) { int i, num; - TBL_PC* sd; struct item_data* item; - - sd = script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; num = script_getnum(st,2) - 1; @@ -8258,10 +8253,8 @@ BUILDIN(getequipname) BUILDIN(getbrokenid) { int i,num,id=0,brokencounter=0; - TBL_PC *sd; - - sd = script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; num=script_getnum(st,2); @@ -8286,10 +8279,7 @@ BUILDIN(getbrokenid) BUILDIN(getbrokencount) { int i, counter = 0; - TBL_PC *sd; - - sd = script->rid2sd(st); - + struct map_session_data *sd = script->rid2sd(st); if (sd == NULL) return true; @@ -8310,10 +8300,8 @@ BUILDIN(repair) { int i,num; int repaircounter=0; - TBL_PC *sd; - - sd = script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; num=script_getnum(st,2); @@ -8339,10 +8327,8 @@ BUILDIN(repair) BUILDIN(repairall) { int i, repaircounter = 0; - TBL_PC *sd; - - sd = script->rid2sd(st); - if(sd == NULL) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; for(i = 0; i < MAX_INVENTORY; i++) @@ -8370,7 +8356,7 @@ BUILDIN(repairall) BUILDIN(getequipisequiped) { int i = -1,num; - TBL_PC *sd; + struct map_session_data *sd; num = script_getnum(st,2); sd = script->rid2sd(st); @@ -8397,7 +8383,7 @@ BUILDIN(getequipisequiped) BUILDIN(getequipisenableref) { int i = -1,num; - TBL_PC *sd; + struct map_session_data *sd; num = script_getnum(st,2); sd = script->rid2sd(st); @@ -8423,7 +8409,7 @@ BUILDIN(getequipisenableref) BUILDIN(getequipisidentify) { int i = -1,num; - TBL_PC *sd; + struct map_session_data *sd; num = script_getnum(st,2); sd = script->rid2sd(st); @@ -8449,7 +8435,7 @@ BUILDIN(getequipisidentify) BUILDIN(getequiprefinerycnt) { int i = -1,num; - TBL_PC *sd; + struct map_session_data *sd; num = script_getnum(st,2); sd = script->rid2sd(st); @@ -8476,7 +8462,7 @@ BUILDIN(getequiprefinerycnt) BUILDIN(getequipweaponlv) { int i = -1,num; - TBL_PC *sd; + struct map_session_data *sd; num = script_getnum(st,2); sd = script->rid2sd(st); @@ -8501,7 +8487,7 @@ BUILDIN(getequipweaponlv) *------------------------------------------*/ BUILDIN(getequippercentrefinery) { int i = -1,num; - TBL_PC *sd; + struct map_session_data *sd; num = script_getnum(st,2); sd = script->rid2sd(st); @@ -8524,7 +8510,7 @@ BUILDIN(getequippercentrefinery) { BUILDIN(successrefitem) { int i = -1 , num, up = 1; - TBL_PC *sd; + struct map_session_data *sd; num = script_getnum(st,2); sd = script->rid2sd(st); @@ -8585,7 +8571,7 @@ BUILDIN(successrefitem) BUILDIN(failedrefitem) { int i=-1,num; - TBL_PC *sd; + struct map_session_data *sd; num = script_getnum(st,2); sd = script->rid2sd(st); @@ -8613,7 +8599,7 @@ BUILDIN(failedrefitem) BUILDIN(downrefitem) { int i = -1, num, down = 1; - TBL_PC *sd; + struct map_session_data *sd; sd = script->rid2sd(st); if (sd == NULL) @@ -8654,7 +8640,7 @@ BUILDIN(downrefitem) BUILDIN(delequip) { int i=-1,num; - TBL_PC *sd; + struct map_session_data *sd; num = script_getnum(st,2); sd = script->rid2sd(st); @@ -8681,7 +8667,7 @@ BUILDIN(delequip) *------------------------------------------*/ BUILDIN(statusup) { int type; - TBL_PC *sd; + struct map_session_data *sd; type=script_getnum(st,2); sd = script->rid2sd(st); @@ -8698,7 +8684,7 @@ BUILDIN(statusup) { BUILDIN(statusup2) { int type,val; - TBL_PC *sd; + struct map_session_data *sd; type=script_getnum(st,2); val=script_getnum(st,3); @@ -8725,10 +8711,8 @@ BUILDIN(bonus) { int val3 = 0; int val4 = 0; int val5 = 0; - TBL_PC* sd; - - sd = script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; // no player attached type = script_getnum(st,2); @@ -8806,11 +8790,9 @@ BUILDIN(autobonus) { unsigned int dur; short rate; short atk_type = 0; - TBL_PC* sd; const char *bonus_script, *other_script = NULL; - - sd = script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; // no player attached if( sd->state.autobonus&sd->status.inventory[status->current_equip_item_index].equip ) @@ -8842,11 +8824,9 @@ BUILDIN(autobonus2) { unsigned int dur; short rate; short atk_type = 0; - TBL_PC* sd; const char *bonus_script, *other_script = NULL; - - sd = script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; // no player attached if( sd->state.autobonus&sd->status.inventory[status->current_equip_item_index].equip ) @@ -8877,11 +8857,9 @@ BUILDIN(autobonus2) { BUILDIN(autobonus3) { unsigned int dur; short rate,atk_type; - TBL_PC* sd; const char *bonus_script, *other_script = NULL; - - sd = script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; // no player attached if( sd->state.autobonus&sd->status.inventory[status->current_equip_item_index].equip ) @@ -8922,10 +8900,8 @@ BUILDIN(skill) { int id; int level; int flag = SKILL_GRANT_TEMPORARY; - TBL_PC* sd; - - sd = script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true;// no player attached, report source id = ( script_isstringtype(st,2) ? skill->name2id(script_getstr(st,2)) : script_getnum(st,2) ); @@ -8950,10 +8926,8 @@ BUILDIN(addtoskill) { int id; int level; int flag = SKILL_GRANT_TEMPSTACK; - TBL_PC* sd; - - sd = script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true;// no player attached, report source id = ( script_isstringtype(st,2) ? skill->name2id(script_getstr(st,2)) : script_getnum(st,2) ); @@ -8973,11 +8947,9 @@ BUILDIN(guildskill) { int skill_id, id, max_points; int level; - TBL_PC* sd; struct guild *gd; struct guild_skill gd_skill; - - sd = script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); if (sd == NULL) return true; // no player attached, report source @@ -9007,12 +8979,11 @@ BUILDIN(guildskill) { /// /// getskilllv(<skill id>) -> <level> /// getskilllv("<skill name>") -> <level> -BUILDIN(getskilllv) { +BUILDIN(getskilllv) +{ int id; - TBL_PC* sd; - - sd = script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true;// no player attached, report source id = ( script_isstringtype(st,2) ? skill->name2id(script_getstr(st,2)) : script_getnum(st,2) ); @@ -9057,10 +9028,8 @@ BUILDIN(basicskillcheck) /// getgmlevel() -> <level> BUILDIN(getgmlevel) { - TBL_PC* sd; - - sd = script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true;// no player attached, report source script_pushint(st, pc_get_group_level(sd)); @@ -9097,9 +9066,7 @@ BUILDIN(setgroupid) { /// getgroupid() -> <int> BUILDIN(getgroupid) { - TBL_PC* sd; - - sd = script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); if (sd == NULL) return true; // no player attached, report source script_pushint(st, pc_get_group_id(sd)); @@ -9133,10 +9100,8 @@ BUILDIN(end) { BUILDIN(checkoption) { int option; - TBL_PC* sd; - - sd = script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true;// no player attached, report source option = script_getnum(st,2); @@ -9154,10 +9119,8 @@ BUILDIN(checkoption) BUILDIN(checkoption1) { int opt1; - TBL_PC* sd; - - sd = script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true;// no player attached, report source opt1 = script_getnum(st,2); @@ -9175,10 +9138,8 @@ BUILDIN(checkoption1) BUILDIN(checkoption2) { int opt2; - TBL_PC* sd; - - sd = script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true;// no player attached, report source opt2 = script_getnum(st,2); @@ -9201,10 +9162,8 @@ BUILDIN(setoption) { int option; int flag = 1; - TBL_PC* sd; - - sd = script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true;// no player attached, report source option = script_getnum(st,2); @@ -9234,10 +9193,8 @@ BUILDIN(setoption) /// @author Valaris BUILDIN(checkcart) { - TBL_PC* sd; - - sd = script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true;// no player attached, report source if( pc_iscarton(sd) ) @@ -9262,10 +9219,8 @@ BUILDIN(checkcart) BUILDIN(setcart) { int type = 1; - TBL_PC* sd; - - sd = script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true;// no player attached, report source if( script_hasdata(st,2) ) @@ -9282,9 +9237,7 @@ BUILDIN(setcart) /// @author Valaris BUILDIN(checkfalcon) { - TBL_PC* sd; - - sd = script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); if (sd == NULL) return true;// no player attached, report source @@ -9304,9 +9257,7 @@ BUILDIN(checkfalcon) BUILDIN(setfalcon) { bool flag = true; - TBL_PC* sd; - - sd = script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); if (sd == NULL) return true;// no player attached, report source @@ -9342,9 +9293,7 @@ enum setmount_type { */ BUILDIN(checkmount) { - TBL_PC* sd; - - sd = script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); if (sd == NULL) return true; // no player attached, report source @@ -9388,9 +9337,7 @@ BUILDIN(checkmount) BUILDIN(setmount) { int flag = SETMOUNT_TYPE_AUTODETECT; - TBL_PC* sd; - - sd = script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); if (sd == NULL) return true;// no player attached, report source @@ -9454,10 +9401,8 @@ BUILDIN(setmount) /// BUILDIN(checkwug) { - TBL_PC* sd; - - sd = script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true;// no player attached, report source if( pc_iswug(sd) || pc_isridingwug(sd) ) @@ -9477,9 +9422,7 @@ BUILDIN(savepoint) { int y; short mapid; const char* str; - TBL_PC* sd; - - sd = script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); if (sd == NULL) return true; // no player attached, report source @@ -9595,23 +9538,21 @@ BUILDIN(gettimestr) /*========================================== * Open player storage *------------------------------------------*/ -BUILDIN(openstorage) { - TBL_PC* sd; - - sd = script->rid2sd(st); - if( sd == NULL ) +BUILDIN(openstorage) +{ + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; storage->open(sd); return true; } -BUILDIN(guildopenstorage) { - TBL_PC* sd; +BUILDIN(guildopenstorage) +{ int ret; - - sd = script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; ret = gstorage->open(sd); @@ -9624,13 +9565,12 @@ BUILDIN(guildopenstorage) { *------------------------------------------*/ /// itemskill <skill id>,<level>{,flag /// itemskill "<skill name>",<level>{,flag -BUILDIN(itemskill) { +BUILDIN(itemskill) +{ int id; int lv; - TBL_PC* sd; - - sd = script->rid2sd(st); - if( sd == NULL || sd->ud.skilltimer != INVALID_TIMER ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL || sd->ud.skilltimer != INVALID_TIMER) return true; id = ( script_isstringtype(st,2) ? skill->name2id(script_getstr(st,2)) : script_getnum(st,2) ); @@ -9653,10 +9593,8 @@ BUILDIN(itemskill) { BUILDIN(produce) { int trigger; - TBL_PC* sd; - - sd = script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; trigger=script_getnum(st,2); @@ -9669,10 +9607,8 @@ BUILDIN(produce) BUILDIN(cooking) { int trigger; - TBL_PC* sd; - - sd = script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; trigger=script_getnum(st,2); @@ -9684,7 +9620,7 @@ BUILDIN(cooking) *------------------------------------------*/ BUILDIN(makepet) { - TBL_PC* sd; + struct map_session_data *sd; int id,pet_id; id=script_getnum(st,2); @@ -9711,12 +9647,10 @@ BUILDIN(makepet) *------------------------------------------*/ BUILDIN(getexp) { - TBL_PC* sd; int base=0,job=0; double bonus; - - sd = script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; base=script_getnum(st,2); @@ -9739,11 +9673,9 @@ BUILDIN(getexp) *------------------------------------------*/ BUILDIN(guildgetexp) { - TBL_PC* sd; int exp; - - sd = script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; exp = script_getnum(st,2); @@ -9758,8 +9690,9 @@ BUILDIN(guildgetexp) /*========================================== * Changes the guild master of a guild [Skotlex] *------------------------------------------*/ -BUILDIN(guildchangegm) { - TBL_PC *sd; +BUILDIN(guildchangegm) +{ + struct map_session_data *sd; int guild_id; const char *name; @@ -9953,11 +9886,16 @@ BUILDIN(areamonster) { /*========================================== * KillMonster subcheck, verify if mob to kill ain't got an even to handle, could be force kill by allflag *------------------------------------------*/ -int buildin_killmonster_sub_strip(struct block_list *bl,va_list ap) -{ //same fix but with killmonster instead - stripping events from mobs. - TBL_MOB* md = (TBL_MOB*)bl; - char *event=va_arg(ap,char *); - int allflag=va_arg(ap,int); +int buildin_killmonster_sub_strip(struct block_list *bl, va_list ap) +{ + //same fix but with killmonster instead - stripping events from mobs. + struct mob_data *md = NULL; + char *event = va_arg(ap,char *); + int allflag = va_arg(ap,int); + + nullpo_ret(bl); + Assert_ret(bl->type == BL_MOB); + md = BL_UCAST(BL_MOB, bl); md->state.npc_killmonster = 1; @@ -9971,11 +9909,15 @@ int buildin_killmonster_sub_strip(struct block_list *bl,va_list ap) md->state.npc_killmonster = 0; return 0; } -int buildin_killmonster_sub(struct block_list *bl,va_list ap) +int buildin_killmonster_sub(struct block_list *bl, va_list ap) { - TBL_MOB* md = (TBL_MOB*)bl; - char *event=va_arg(ap,char *); - int allflag=va_arg(ap,int); + struct mob_data *md = NULL; + char *event = va_arg(ap,char *); + int allflag = va_arg(ap,int); + + nullpo_ret(bl); + Assert_ret(bl->type == BL_MOB); + md = BL_UCAST(BL_MOB, bl); if(!allflag) { if(strcmp(event,md->npc_event)==0) @@ -10058,7 +10000,7 @@ BUILDIN(killmonsterall) { * clone map, x, y, event, char_id, master_id, mode, flag, duration *------------------------------------------*/ BUILDIN(clone) { - TBL_PC *sd, *msd=NULL; + struct map_session_data *sd, *msd = NULL; int char_id,master_id=0,x,y, mode = 0, flag = 0, m; unsigned int duration = 0; const char *mapname, *event; @@ -10139,7 +10081,7 @@ BUILDIN(addtimer) { int tick = script_getnum(st,2); const char* event = script_getstr(st, 3); - TBL_PC* sd; + struct map_session_data *sd; script->check_event(st, event); sd = script->rid2sd(st); @@ -10157,7 +10099,7 @@ BUILDIN(addtimer) BUILDIN(deltimer) { const char *event; - TBL_PC* sd; + struct map_session_data *sd; event=script_getstr(st, 2); sd = script->rid2sd(st); @@ -10174,7 +10116,7 @@ BUILDIN(addtimercount) { const char *event; int tick; - TBL_PC* sd; + struct map_session_data *sd; event=script_getstr(st, 2); tick=script_getnum(st,3); @@ -10203,25 +10145,26 @@ BUILDIN(initnpctimer) struct script_data *data; data = script_getdata(st,2); script->get_val(st,data); // dereference if it's a variable - if( data_isstring(data) ) //NPC name + if (data_isstring(data)) { + //NPC name nd = npc->name2id(script->conv_str(st, data)); - else if( data_isint(data) ) { + } else if (data_isint(data)) { //Flag - nd = (struct npc_data *)map->id2bl(st->oid); + nd = map->id2nd(st->oid); flag = script->conv_num(st,data); } else { ShowError("initnpctimer: invalid argument type #1 (needs be int or string)).\n"); return false; } - } else - nd = (struct npc_data *)map->id2bl(st->oid); + } else { + nd = map->id2nd(st->oid); + } if( !nd ) return true; - if( flag ) //Attach - { - TBL_PC* sd = script->rid2sd(st); - if( sd == NULL ) + if (flag) { //Attach + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; nd->u.scr.rid = sd->bl.id; } @@ -10247,25 +10190,26 @@ BUILDIN(startnpctimer) struct script_data *data; data = script_getdata(st,2); script->get_val(st,data); // dereference if it's a variable - if( data_isstring(data) ) //NPC name + if (data_isstring(data)) { + //NPC name nd = npc->name2id(script->conv_str(st, data)); - else if( data_isint(data) ) { + } else if (data_isint(data)) { //Flag - nd = (struct npc_data *)map->id2bl(st->oid); + nd = map->id2nd(st->oid); flag = script->conv_num(st,data); } else { ShowError("initnpctimer: invalid argument type #1 (needs be int or string)).\n"); return false; } - } else - nd=(struct npc_data *)map->id2bl(st->oid); + } else { + nd = map->id2nd(st->oid); + } if( !nd ) return true; - if( flag ) //Attach - { - TBL_PC* sd = script->rid2sd(st); - if( sd == NULL ) + if (flag) { //Attach + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; nd->u.scr.rid = sd->bl.id; } @@ -10288,18 +10232,20 @@ BUILDIN(stopnpctimer) { struct script_data *data; data = script_getdata(st,2); script->get_val(st,data); // Dereference if it's a variable - if( data_isstring(data) ) //NPC name + if (data_isstring(data)) { + //NPC name nd = npc->name2id(script->conv_str(st, data)); - else if( data_isint(data) ) { + } else if (data_isint(data)) { //Flag - nd = (struct npc_data *)map->id2bl(st->oid); + nd = map->id2nd(st->oid); flag = script->conv_num(st,data); } else { ShowError("initnpctimer: invalid argument type #1 (needs be int or string)).\n"); return false; } - } else - nd=(struct npc_data *)map->id2bl(st->oid); + } else { + nd = map->id2nd(st->oid); + } if( !nd ) return true; @@ -10311,19 +10257,19 @@ BUILDIN(stopnpctimer) { } /*========================================== *------------------------------------------*/ -BUILDIN(getnpctimer) { +BUILDIN(getnpctimer) +{ struct npc_data *nd; - TBL_PC *sd; + struct map_session_data *sd; int type = script_getnum(st,2); int val = 0; if( script_hasdata(st,3) ) nd = npc->name2id(script_getstr(st,3)); else - nd = (struct npc_data *)map->id2bl(st->oid); + nd = map->id2nd(st->oid); - if( !nd || nd->bl.type != BL_NPC ) - { + if (nd == NULL) { script_pushint(st,0); ShowError("getnpctimer: Invalid NPC.\n"); return false; @@ -10358,9 +10304,9 @@ BUILDIN(setnpctimer) if( script_hasdata(st,3) ) nd = npc->name2id(script_getstr(st,3)); else - nd = (struct npc_data *)map->id2bl(st->oid); + nd = map->id2nd(st->oid); - if( !nd || nd->bl.type != BL_NPC ) { + if (nd == NULL) { script_pushint(st,1); ShowError("setnpctimer: Invalid NPC.\n"); return false; @@ -10374,12 +10320,12 @@ BUILDIN(setnpctimer) /*========================================== * attaches the player rid to the timer [Celest] *------------------------------------------*/ -BUILDIN(attachnpctimer) { - TBL_PC *sd; - struct npc_data *nd = (struct npc_data *)map->id2bl(st->oid); +BUILDIN(attachnpctimer) +{ + struct map_session_data *sd; + struct npc_data *nd = map->id2nd(st->oid); - if( !nd || nd->bl.type != BL_NPC ) - { + if (nd == NULL) { script_pushint(st,1); ShowError("setnpctimer: Invalid NPC.\n"); return false; @@ -10409,10 +10355,9 @@ BUILDIN(detachnpctimer) { if( script_hasdata(st,2) ) nd = npc->name2id(script_getstr(st,2)); else - nd = (struct npc_data *)map->id2bl(st->oid); + nd = map->id2nd(st->oid); - if( !nd || nd->bl.type != BL_NPC ) - { + if (nd == NULL) { script_pushint(st,1); ShowError("detachnpctimer: Invalid NPC.\n"); return false; @@ -10450,7 +10395,15 @@ BUILDIN(announce) { if( flag&(BC_TARGET_MASK|BC_SOURCE_MASK) ) { // Broadcast source or broadcast region defined send_target target; - struct block_list *bl = (flag&BC_NPC) ? map->id2bl(st->oid) : (struct block_list *)script->rid2sd(st); // If bc_npc flag is set, use NPC as broadcast source + struct block_list *bl = NULL; + if (flag&BC_NPC) { + // If bc_npc flag is set, use NPC as broadcast source + bl = map->id2bl(st->oid); + } else { + struct map_session_data *sd = script->rid2sd(st); + if (sd != NULL) + bl = &sd->bl; + } if (bl == NULL) return true; @@ -10494,17 +10447,16 @@ int buildin_announce_sub(struct block_list *bl, va_list ap) /* Runs item effect on attached character. * itemeffect <item id>; * itemeffect "<item name>"; */ -BUILDIN(itemeffect) { - TBL_NPC *nd; - TBL_PC *sd; +BUILDIN(itemeffect) +{ + struct npc_data *nd; struct item_data *item_data; - - sd = script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); if (sd == NULL) return true; - nd = (TBL_NPC *)map->id2bl(sd->npc_id); - if( nd == NULL ) + nd = map->id2nd(sd->npc_id); + if (nd == NULL) return false; if( script_isstringtype(st, 2) ) { @@ -10611,7 +10563,8 @@ BUILDIN(getusers) { *------------------------------------------*/ BUILDIN(getusersname) { - TBL_PC *sd, *pl_sd; + struct map_session_data *sd; + const struct map_session_data *pl_sd; int /*disp_num=1,*/ group_level = 0; struct s_mapiterator* iter; @@ -10620,8 +10573,7 @@ BUILDIN(getusersname) group_level = pc_get_group_level(sd); iter = mapit_getallusers(); - for( pl_sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); pl_sd = (TBL_PC*)mapit->next(iter) ) - { + for (pl_sd = BL_UCCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); pl_sd = BL_UCCAST(BL_PC, mapit->next(iter))) { if (pc_has_permission(pl_sd, PC_PERM_HIDE_SESSION) && pc_get_group_level(pl_sd) > group_level) continue; // skip hidden sessions @@ -10700,7 +10652,7 @@ BUILDIN(getareausers) } idx = 3; } else { - TBL_PC *sd = script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); if (sd == NULL) { script_pushint(st, -1); return true; @@ -10746,17 +10698,22 @@ BUILDIN(getareausers) /*========================================== *------------------------------------------*/ -int buildin_getareadropitem_sub(struct block_list *bl,va_list ap) +int buildin_getareadropitem_sub(struct block_list *bl, va_list ap) { - int item=va_arg(ap,int); - int *amount=va_arg(ap,int *); - struct flooritem_data *drop=(struct flooritem_data *)bl; + int item = va_arg(ap, int); + int *amount = va_arg(ap, int *); + const struct flooritem_data *drop = NULL; + + nullpo_ret(bl); + Assert_ret(bl->type == BL_ITEM); + drop = BL_UCCAST(BL_ITEM, bl); - if(drop->item_data.nameid==item) - (*amount)+=drop->item_data.amount; + if (drop->item_data.nameid == item) + (*amount) += drop->item_data.amount; return 0; } + BUILDIN(getareadropitem) { const char *str; int16 m,x0,y0,x1,y1; @@ -10832,8 +10789,9 @@ BUILDIN(hideonnpc) * sc_start4 <effect_id>,<duration>,<val1>,<val2>,<val3>,<val4>{,<rate,<flag>,{<unit_id>}}; * <flag>: @see enum scstart_flag */ -BUILDIN(sc_start) { - TBL_NPC * nd = map->id2nd(st->oid); +BUILDIN(sc_start) +{ + struct npc_data *nd = map->id2nd(st->oid); struct block_list* bl; enum sc_type type; int tick, val1, val2, val3, val4=0, rate, flag; @@ -11029,7 +10987,7 @@ BUILDIN(debugmes) BUILDIN(catchpet) { int pet_id; - TBL_PC *sd; + struct map_session_data *sd; pet_id= script_getnum(st,2); sd=script->rid2sd(st); @@ -11045,10 +11003,8 @@ BUILDIN(catchpet) *------------------------------------------*/ BUILDIN(homunculus_evolution) { - TBL_PC *sd; - - sd=script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; if(homun_alive(sd->hd)) { @@ -11067,11 +11023,9 @@ BUILDIN(homunculus_evolution) *------------------------------------------*/ BUILDIN(homunculus_mutate) { - TBL_PC *sd; bool success = false; - - sd = script->rid2sd(st); - if( sd == NULL || sd->hd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL || sd->hd == NULL) return true; if (sd->hd->homunculus.vaporize == HOM_ST_MORPH) { @@ -11110,11 +11064,9 @@ BUILDIN(homunculus_mutate) *------------------------------------------*/ BUILDIN(homunculus_morphembryo) { - TBL_PC *sd; bool success = false; - - sd = script->rid2sd(st); - if( sd == NULL || sd->hd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL || sd->hd == NULL) return true; if (homun_alive(sd->hd)) { @@ -11153,10 +11105,10 @@ BUILDIN(homunculus_morphembryo) * 1 = Homunculus is vaporized (rest) * 2 = Homunculus is in morph state *------------------------------------------*/ -BUILDIN(homunculus_checkcall) { - TBL_PC *sd = script->rid2sd(st); - - if( sd == NULL || !sd->hd ) +BUILDIN(homunculus_checkcall) +{ + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL || sd->hd == NULL) script_pushint(st, -1); else script_pushint(st, sd->hd->homunculus.vaporize); @@ -11165,11 +11117,10 @@ BUILDIN(homunculus_checkcall) { } // [Zephyrus] -BUILDIN(homunculus_shuffle) { - TBL_PC *sd; - - sd=script->rid2sd(st); - if( sd == NULL ) +BUILDIN(homunculus_shuffle) +{ + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; if(homun_alive(sd->hd)) @@ -11182,12 +11133,11 @@ BUILDIN(homunculus_shuffle) { BUILDIN(eaclass) { int class_; - if( script_hasdata(st,2) ) + if (script_hasdata(st,2)) { class_ = script_getnum(st,2); - else { - TBL_PC *sd; - sd=script->rid2sd(st); - if( !sd ) + } else { + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; class_ = sd->status.class_; } @@ -11199,10 +11149,10 @@ BUILDIN(roclass) { int class_ =script_getnum(st,2); int sex; - if( script_hasdata(st,3) ) + if (script_hasdata(st,3)) { sex = script_getnum(st,3); - else { - TBL_PC *sd; + } else { + struct map_session_data *sd; if (st->rid && (sd=script->rid2sd(st)) != NULL) sex = sd->status.sex; else @@ -11217,9 +11167,8 @@ BUILDIN(roclass) *------------------------------------------*/ BUILDIN(birthpet) { - TBL_PC *sd; - sd=script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; if( sd->status.pet_id ) @@ -11241,12 +11190,9 @@ BUILDIN(birthpet) *------------------------------------------*/ BUILDIN(resetlvl) { - TBL_PC *sd; - int type=script_getnum(st,2); - - sd=script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; pc->resetlvl(sd,type); @@ -11257,7 +11203,7 @@ BUILDIN(resetlvl) *------------------------------------------*/ BUILDIN(resetstatus) { - TBL_PC *sd = script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); if (sd == NULL) return true; pc->resetstate(sd); @@ -11269,7 +11215,7 @@ BUILDIN(resetstatus) *------------------------------------------*/ BUILDIN(resetskill) { - TBL_PC *sd = script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); if (sd == NULL) return true; pc->resetskill(sd, PCRESETSKILL_RESYNC); @@ -11281,7 +11227,7 @@ BUILDIN(resetskill) *------------------------------------------*/ BUILDIN(skillpointcount) { - TBL_PC *sd = script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); if (sd == NULL) return true; script_pushint(st,sd->status.skill_point + pc->resetskill(sd, PCRESETSKILL_RECOUNT)); @@ -11291,8 +11237,9 @@ BUILDIN(skillpointcount) /*========================================== * *------------------------------------------*/ -BUILDIN(changebase) { - TBL_PC *sd=NULL; +BUILDIN(changebase) +{ + struct map_session_data *sd = NULL; int vclass; if (script_hasdata(st,3)) @@ -11318,10 +11265,10 @@ BUILDIN(changebase) { return true; } -static TBL_PC *prepareChangeSex(struct script_state* st) +static struct map_session_data *prepareChangeSex(struct script_state *st) { int i; - TBL_PC *sd = script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); if (sd == NULL) return NULL; @@ -11338,7 +11285,7 @@ static TBL_PC *prepareChangeSex(struct script_state* st) *------------------------------------------*/ BUILDIN(changesex) { - TBL_PC *sd = prepareChangeSex(st); + struct map_session_data *sd = prepareChangeSex(st); if (sd == NULL) return true; chrif->changesex(sd, true); @@ -11350,7 +11297,7 @@ BUILDIN(changesex) *------------------------------------------*/ BUILDIN(changecharsex) { - TBL_PC *sd = prepareChangeSex(st); + struct map_session_data *sd = prepareChangeSex(st); if (sd == NULL) return true; chrif->changesex(sd, false); @@ -11360,9 +11307,8 @@ BUILDIN(changecharsex) /*========================================== * Works like 'announce' but outputs in the common chat window *------------------------------------------*/ -BUILDIN(globalmes) { - struct block_list *bl = map->id2bl(st->oid); - struct npc_data *nd = (struct npc_data *)bl; +BUILDIN(globalmes) +{ const char *name=NULL,*mes; mes=script_getstr(st,2); @@ -11372,7 +11318,9 @@ BUILDIN(globalmes) { // npc name to display name=script_getstr(st,3); } else { - name=nd->name; //use current npc name + const struct npc_data *nd = map->id2nd(st->oid); + nullpo_retr(false, nd); + name = nd->name; //use current npc name } npc->globalmessage(name,mes); // broadcast to all players connected @@ -11398,7 +11346,7 @@ BUILDIN(waitingroom) int minLvl = script_hasdata(st,7) ? script_getnum(st,7) : 1; int maxLvl = script_hasdata(st,8) ? script_getnum(st,8) : MAX_LEVEL; - nd = (struct npc_data *)map->id2bl(st->oid); + nd = map->id2nd(st->oid); if (nd != NULL) { int pub = 1; chat->create_npc_chat(nd, title, limit, pub, trigger, ev, zeny, minLvl, maxLvl); @@ -11416,8 +11364,8 @@ BUILDIN(delwaitingroom) { if( script_hasdata(st,2) ) nd = npc->name2id(script_getstr(st, 2)); else - nd = (struct npc_data *)map->id2bl(st->oid); - if( nd != NULL ) + nd = map->id2nd(st->oid); + if (nd != NULL) chat->delete_npc_chat(nd); return true; } @@ -11433,9 +11381,9 @@ BUILDIN(waitingroomkickall) { if( script_hasdata(st,2) ) nd = npc->name2id(script_getstr(st,2)); else - nd = (struct npc_data *)map->id2bl(st->oid); + nd = map->id2nd(st->oid); - if( nd != NULL && (cd=(struct chat_data *)map->id2bl(nd->chat_id)) != NULL ) + if (nd != NULL && (cd=map->id2cd(nd->chat_id)) != NULL) chat->npc_kick_all(cd); return true; } @@ -11451,9 +11399,9 @@ BUILDIN(enablewaitingroomevent) { if( script_hasdata(st,2) ) nd = npc->name2id(script_getstr(st, 2)); else - nd = (struct npc_data *)map->id2bl(st->oid); + nd = map->id2nd(st->oid); - if( nd != NULL && (cd=(struct chat_data *)map->id2bl(nd->chat_id)) != NULL ) + if (nd != NULL && (cd=map->id2cd(nd->chat_id)) != NULL) chat->enable_event(cd); return true; } @@ -11469,9 +11417,9 @@ BUILDIN(disablewaitingroomevent) { if( script_hasdata(st,2) ) nd = npc->name2id(script_getstr(st, 2)); else - nd = (struct npc_data *)map->id2bl(st->oid); + nd = map->id2nd(st->oid); - if( nd != NULL && (cd=(struct chat_data *)map->id2bl(nd->chat_id)) != NULL ) + if (nd != NULL && (cd=map->id2cd(nd->chat_id)) != NULL) chat->disable_event(cd); return true; } @@ -11494,9 +11442,10 @@ BUILDIN(disablewaitingroomevent) { /// /// getwaitingroomstate(<type>,"<npc_name>") -> <info> /// getwaitingroomstate(<type>) -> <info> -BUILDIN(getwaitingroomstate) { - struct npc_data *nd; - struct chat_data *cd; +BUILDIN(getwaitingroomstate) +{ + const struct npc_data *nd; + const struct chat_data *cd; int type; int i; @@ -11504,9 +11453,9 @@ BUILDIN(getwaitingroomstate) { if( script_hasdata(st,3) ) nd = npc->name2id(script_getstr(st, 3)); else - nd = (struct npc_data *)map->id2bl(st->oid); + nd = map->id2nd(st->oid); - if( nd == NULL || (cd=(struct chat_data *)map->id2bl(nd->chat_id)) == NULL ) { + if (nd == NULL || (cd=map->id2cd(nd->chat_id)) == NULL) { script_pushint(st, -1); return true; } @@ -11555,8 +11504,8 @@ BUILDIN(warpwaitingpc) struct npc_data* nd; struct chat_data* cd; - nd = (struct npc_data *)map->id2bl(st->oid); - if( nd == NULL || (cd=(struct chat_data *)map->id2bl(nd->chat_id)) == NULL ) + nd = map->id2nd(st->oid); + if (nd == NULL || (cd=map->id2cd(nd->chat_id)) == NULL) return true; map_name = script_getstr(st,2); @@ -11568,7 +11517,7 @@ BUILDIN(warpwaitingpc) n = script_getnum(st,5); for (i = 0; i < n && cd->users > 0; i++) { - TBL_PC* sd = cd->usersd[0]; + struct map_session_data *sd = cd->usersd[0]; if (strcmp(map_name,"SavePoint") == 0 && map->list[sd->bl.m].flag.noteleport) { // can't teleport on this map @@ -11638,10 +11587,11 @@ BUILDIN(detachrid) /*========================================== * Chk if account connected, (and charid from account if specified) *------------------------------------------*/ -BUILDIN(isloggedin) { - TBL_PC* sd = map->id2sd(script_getnum(st,2)); - if (script_hasdata(st,3) && sd && - sd->status.char_id != script_getnum(st,3)) +BUILDIN(isloggedin) +{ + struct map_session_data *sd = map->id2sd(script_getnum(st,2)); + if (script_hasdata(st,3) && sd != NULL + && sd->status.char_id != script_getnum(st,3)) sd = NULL; script->push_val(st->stack,C_INT,sd!=NULL,NULL); return true; @@ -11741,8 +11691,14 @@ BUILDIN(getmapflag) return true; } /* pvp timer handling */ -int script_mapflag_pvp_sub(struct block_list *bl,va_list ap) { - TBL_PC* sd = (TBL_PC*)bl; +int script_mapflag_pvp_sub(struct block_list *bl, va_list ap) +{ + struct map_session_data *sd = NULL; + + nullpo_ret(bl); + Assert_ret(bl->type == BL_PC); + sd = BL_UCAST(BL_PC, bl); + if (sd->pvp_timer == INVALID_TIMER) { sd->pvp_timer = timer->add(timer->gettick() + 200, pc->calc_pvprank_timer, sd->bl.id, 0); sd->pvp_rank = 0; @@ -11755,6 +11711,7 @@ int script_mapflag_pvp_sub(struct block_list *bl,va_list ap) { clif->maptypeproperty2(&sd->bl,SELF); return 0; } + BUILDIN(setmapflag) { int16 m,i; const char *str, *val2 = NULL; @@ -11945,10 +11902,11 @@ BUILDIN(removemapflag) { return true; } -BUILDIN(pvpon) { +BUILDIN(pvpon) +{ int16 m; const char *str; - TBL_PC* sd = NULL; + struct map_session_data *sd = NULL; struct s_mapiterator* iter; struct block_list bl; @@ -11973,8 +11931,7 @@ BUILDIN(pvpon) { return true; iter = mapit_getallusers(); - for( sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); sd = (TBL_PC*)mapit->next(iter) ) - { + for (sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); sd = BL_UCAST(BL_PC, mapit->next(iter))) { if( sd->bl.m != m || sd->pvp_timer != INVALID_TIMER ) continue; // not applicable @@ -11990,9 +11947,14 @@ BUILDIN(pvpon) { return true; } -int buildin_pvpoff_sub(struct block_list *bl,va_list ap) +int buildin_pvpoff_sub(struct block_list *bl, va_list ap) { - TBL_PC* sd = (TBL_PC*)bl; + struct map_session_data *sd = NULL; + + nullpo_ret(bl); + Assert_ret(bl->type == BL_PC); + sd = BL_UCAST(BL_PC, bl); + clif->pvpset(sd, 0, 0, 2); if (sd->pvp_timer != INVALID_TIMER) { timer->delete(sd->pvp_timer, pc->calc_pvprank_timer); @@ -12084,7 +12046,7 @@ BUILDIN(emotion) { player=script_getnum(st,3); if (player != 0) { - TBL_PC *sd = NULL; + struct map_session_data *sd = NULL; if (script_hasdata(st,4)) sd = script->nick2sd(st, script_getstr(st,4)); else @@ -12092,11 +12054,12 @@ BUILDIN(emotion) { if (sd != NULL) clif->emotion(&sd->bl,type); } else if( script_hasdata(st,4) ) { - TBL_NPC *nd = npc->name2id(script_getstr(st,4)); - if(nd) + struct npc_data *nd = npc->name2id(script_getstr(st,4)); + if (nd == NULL) clif->emotion(&nd->bl,type); - } else + } else { clif->emotion(map->id2bl(st->oid),type); + } return true; } @@ -12117,9 +12080,13 @@ int buildin_maprespawnguildid_sub_pc(struct map_session_data* sd, va_list ap) return 1; } -int buildin_maprespawnguildid_sub_mob(struct block_list *bl,va_list ap) +int buildin_maprespawnguildid_sub_mob(struct block_list *bl, va_list ap) { - struct mob_data *md=(struct mob_data *)bl; + struct mob_data *md = NULL; + + nullpo_ret(bl); + Assert_ret(bl->type == BL_MOB); + md = BL_UCAST(BL_MOB, bl); if (md->guardian_data == NULL && md->class_ != MOBID_EMPELIUM) status_kill(bl); @@ -12191,13 +12158,14 @@ BUILDIN(agitcheck2) { /// Sets the guild_id of this npc. /// /// flagemblem <guild_id>; -BUILDIN(flagemblem) { - TBL_NPC* nd; +BUILDIN(flagemblem) +{ + struct npc_data *nd; int g_id = script_getnum(st,2); if(g_id < 0) return true; - nd = (TBL_NPC*)map->id2nd(st->oid); + nd = map->id2nd(st->oid); if( nd == NULL ) { ShowError("script:flagemblem: npc %d not found\n", st->oid); } else if( nd->subtype != SCRIPT ) { @@ -12310,7 +12278,7 @@ BUILDIN(requestguildinfo) BUILDIN(getequipcardcnt) { int i=-1,j,num; - TBL_PC *sd; + struct map_session_data *sd; int count; num=script_getnum(st,2); @@ -12349,7 +12317,7 @@ BUILDIN(successremovecards) { int i=-1,c,cardflag=0; - TBL_PC *sd = script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); int num = script_getnum(st,2); if (sd == NULL) @@ -12420,7 +12388,7 @@ BUILDIN(failedremovecards) { int i=-1,c,cardflag=0; - TBL_PC *sd = script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); int num = script_getnum(st,2); int typefail = script_getnum(st,3); @@ -12550,9 +12518,15 @@ BUILDIN(mapwarp) { } // Added by RoVeRT -int buildin_mobcount_sub(struct block_list *bl,va_list ap) { - char *event=va_arg(ap,char *); - struct mob_data *md = ((struct mob_data *)bl); +int buildin_mobcount_sub(struct block_list *bl, va_list ap) +{ + char *event = va_arg(ap,char *); + const struct mob_data *md = NULL; + + nullpo_ret(bl); + Assert_ret(bl->type == BL_MOB); + md = BL_UCCAST(BL_MOB, bl); + if( md->status.hp > 0 && (!event || strcmp(event,md->npc_event) == 0) ) return 1; return 0; @@ -12594,8 +12568,8 @@ BUILDIN(mobcount) { BUILDIN(marriage) { const char *partner=script_getstr(st,2); - TBL_PC *sd=script->rid2sd(st); - TBL_PC *p_sd = script->nick2sd(st, partner); + struct map_session_data *sd = script->rid2sd(st); + struct map_session_data *p_sd = script->nick2sd(st, partner); if (sd == NULL || p_sd == NULL || pc->marriage(sd,p_sd) < 0) { script_pushint(st,0); @@ -12604,8 +12578,9 @@ BUILDIN(marriage) { script_pushint(st,1); return true; } -BUILDIN(wedding_effect) { - TBL_PC *sd = script->rid2sd(st); +BUILDIN(wedding_effect) +{ + struct map_session_data *sd = script->rid2sd(st); struct block_list *bl; if (sd == NULL) @@ -12617,8 +12592,8 @@ BUILDIN(wedding_effect) { } BUILDIN(divorce) { - TBL_PC *sd=script->rid2sd(st); - if(sd==NULL || pc->divorce(sd) < 0) { + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL || pc->divorce(sd) < 0) { script_pushint(st,0); return true; } @@ -12627,7 +12602,7 @@ BUILDIN(divorce) } BUILDIN(ispartneron) { - TBL_PC *sd=script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); if (sd==NULL || !pc->ismarried(sd) || map->charid2sd(sd->status.partner_id) == NULL) { @@ -12641,7 +12616,7 @@ BUILDIN(ispartneron) { BUILDIN(getpartnerid) { - TBL_PC *sd = script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); if (sd == NULL) return true; @@ -12651,7 +12626,7 @@ BUILDIN(getpartnerid) BUILDIN(getchildid) { - TBL_PC *sd = script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); if (sd == NULL) return true; @@ -12661,7 +12636,7 @@ BUILDIN(getchildid) BUILDIN(getmotherid) { - TBL_PC *sd = script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); if (sd == NULL) return true; @@ -12670,8 +12645,8 @@ BUILDIN(getmotherid) } BUILDIN(getfatherid) { - TBL_PC *sd=script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; script_pushint(st,sd->status.father); @@ -12683,8 +12658,8 @@ BUILDIN(warppartner) int x,y; unsigned short map_index; const char *str; - TBL_PC *sd=script->rid2sd(st); - TBL_PC *p_sd=NULL; + struct map_session_data *sd = script->rid2sd(st); + struct map_session_data *p_sd = NULL; if (sd == NULL || !pc->ismarried(sd) || (p_sd = script->charid2sd(st, sd->status.partner_id)) == NULL) { @@ -12992,7 +12967,7 @@ BUILDIN(setiteminfo) BUILDIN(getequipcardid) { int i=-1,num,slot; - TBL_PC *sd; + struct map_session_data *sd; num=script_getnum(st,2); slot=script_getnum(st,3); @@ -13018,9 +12993,9 @@ BUILDIN(petskillbonus) { struct pet_data *pd; - TBL_PC *sd=script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); - if(sd==NULL || sd->pd==NULL) + if (sd == NULL || sd->pd == NULL) return true; pd=sd->pd; @@ -13055,9 +13030,9 @@ BUILDIN(petloot) { int max; struct pet_data *pd; - TBL_PC *sd=script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); - if(sd==NULL || sd->pd==NULL) + if (sd == NULL || sd->pd == NULL) return true; max=script_getnum(st,2); @@ -13091,8 +13066,9 @@ BUILDIN(petloot) * @inventorylist_card(0..3), @inventorylist_expire * @inventorylist_count = scalar *------------------------------------------*/ -BUILDIN(getinventorylist){ - TBL_PC *sd=script->rid2sd(st); +BUILDIN(getinventorylist) +{ + struct map_session_data *sd = script->rid2sd(st); char card_var[NAME_LENGTH]; int i,j=0,k; @@ -13123,8 +13099,9 @@ BUILDIN(getinventorylist){ return true; } -BUILDIN(getcartinventorylist){ - TBL_PC *sd=script->rid2sd(st); +BUILDIN(getcartinventorylist) +{ + struct map_session_data *sd = script->rid2sd(st); char card_var[26]; int i,j=0,k; @@ -13153,9 +13130,10 @@ BUILDIN(getcartinventorylist){ BUILDIN(getskilllist) { - TBL_PC *sd=script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); int i,j=0; - if(!sd) return true; + if (sd == NULL) + return true; for(i=0;i<MAX_SKILL;i++) { if(sd->status.skill[i].id > 0 && sd->status.skill[i].lv > 0) { pc->setreg(sd,reference_uid(script->add_str("@skilllist_id"), j),sd->status.skill[i].id); @@ -13170,9 +13148,10 @@ BUILDIN(getskilllist) BUILDIN(clearitem) { - TBL_PC *sd=script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); int i; - if(sd==NULL) return true; + if (sd == NULL) + return true; for (i=0; i<MAX_INVENTORY; i++) { if (sd->status.inventory[i].amount) { pc->delitem(sd, i, sd->status.inventory[i].amount, 0, DELITEM_NORMAL, LOG_TYPE_SCRIPT); @@ -13187,8 +13166,9 @@ BUILDIN(clearitem) BUILDIN(disguise) { int id; - TBL_PC* sd = script->rid2sd(st); - if (sd == NULL) return true; + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) + return true; id = script_getnum(st,2); @@ -13206,8 +13186,9 @@ BUILDIN(disguise) *------------------------------------------*/ BUILDIN(undisguise) { - TBL_PC* sd = script->rid2sd(st); - if (sd == NULL) return true; + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) + return true; if (sd->disguise != -1) { pc->disguise(sd, -1); @@ -13247,8 +13228,8 @@ BUILDIN(misceffect) if (bl) clif->specialeffect(bl,type,AREA); } else { - TBL_PC *sd=script->rid2sd(st); - if(sd) + struct map_session_data *sd = script->rid2sd(st); + if (sd != NULL) clif->specialeffect(&sd->bl,type,AREA); } return true; @@ -13333,23 +13314,27 @@ BUILDIN(playbgmall) { *------------------------------------------*/ BUILDIN(soundeffect) { - TBL_PC* sd = script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); const char* name = script_getstr(st,2); int type = script_getnum(st,3); - if(sd) - { + if (sd != NULL) { clif->soundeffect(sd,&sd->bl,name,type); } return true; } -int soundeffect_sub(struct block_list* bl,va_list ap) +int soundeffect_sub(struct block_list *bl, va_list ap) { - char* name = va_arg(ap,char*); - int type = va_arg(ap,int); + struct map_session_data *sd = NULL; + char *name = va_arg(ap, char *); + int type = va_arg(ap, int); - clif->soundeffect((TBL_PC *)bl, bl, name, type); + nullpo_ret(bl); + Assert_ret(bl->type == BL_PC); + sd = BL_UCAST(BL_PC, bl); + + clif->soundeffect(sd, bl, name, type); return true; } @@ -13412,9 +13397,9 @@ BUILDIN(soundeffectall) { BUILDIN(petrecovery) { struct pet_data *pd; - TBL_PC *sd=script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); - if(sd==NULL || sd->pd==NULL) + if (sd == NULL || sd->pd == NULL) return true; pd=sd->pd; @@ -13438,9 +13423,10 @@ BUILDIN(petrecovery) *------------------------------------------*/ /// petskillattack <skill id>,<level>,<div>,<rate>,<bonusrate> /// petskillattack "<skill name>",<level>,<div>,<rate>,<bonusrate> -BUILDIN(petskillattack) { +BUILDIN(petskillattack) +{ struct pet_data *pd; - TBL_PC *sd=script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); if (sd==NULL || sd->pd==NULL) return true; @@ -13463,11 +13449,12 @@ BUILDIN(petskillattack) { *------------------------------------------*/ /// petskillsupport <skill id>,<level>,<delay>,<hp>,<sp> /// petskillsupport "<skill name>",<level>,<delay>,<hp>,<sp> -BUILDIN(petskillsupport) { +BUILDIN(petskillsupport) +{ struct pet_data *pd; - TBL_PC *sd=script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); - if(sd==NULL || sd->pd==NULL) + if (sd == NULL || sd->pd == NULL) return true; pd=sd->pd; @@ -13501,8 +13488,9 @@ BUILDIN(petskillsupport) { *------------------------------------------*/ /// skilleffect <skill id>,<level> /// skilleffect "<skill name>",<level> -BUILDIN(skilleffect) { - TBL_PC *sd; +BUILDIN(skilleffect) +{ + struct map_session_data *sd; uint16 skill_id=( script_isstringtype(st,2) ? skill->name2id(script_getstr(st,2)) : script_getnum(st,2) ); uint16 skill_lv=script_getnum(st,3); @@ -13553,17 +13541,14 @@ BUILDIN(specialeffect) { if(bl==NULL) return true; - if( script_hasdata(st,4) ) - { - TBL_NPC *nd = npc->name2id(script_getstr(st,4)); - if(nd) + if (script_hasdata(st,4)) { + struct npc_data *nd = npc->name2id(script_getstr(st,4)); + if (nd != NULL) clif->specialeffect(&nd->bl, type, target); - } - else - { + } else { if (target == SELF) { - TBL_PC *sd=script->rid2sd(st); - if (sd) + struct map_session_data *sd = script->rid2sd(st); + if (sd != NULL) clif->specialeffect_single(bl,type,sd->fd); } else { clif->specialeffect(bl, type, target); @@ -13574,7 +13559,7 @@ BUILDIN(specialeffect) { } BUILDIN(specialeffect2) { - TBL_PC *sd; + struct map_session_data *sd; int type = script_getnum(st,2); enum send_target target = script_hasdata(st,3) ? (send_target)script_getnum(st,3) : AREA; @@ -13594,10 +13579,10 @@ BUILDIN(specialeffect2) { *------------------------------------------*/ BUILDIN(nude) { - TBL_PC *sd = script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); int i, calcflag = 0; - if( sd == NULL ) + if (sd == NULL) return true; for( i = 0 ; i < EQI_MAX; i++ ) { @@ -13617,8 +13602,9 @@ BUILDIN(nude) /*========================================== * gmcommand [MouseJstr] *------------------------------------------*/ -BUILDIN(atcommand) { - TBL_PC *sd, *dummy_sd = NULL; +BUILDIN(atcommand) +{ + struct map_session_data *sd, *dummy_sd = NULL; int fd; const char* cmd; bool ret = true; @@ -13638,7 +13624,7 @@ BUILDIN(atcommand) { struct block_list* bl = map->id2bl(st->oid); memcpy(&sd->bl, bl, sizeof(struct block_list)); if (bl->type == BL_NPC) - safestrncpy(sd->status.name, ((TBL_NPC*)bl)->name, NAME_LENGTH); + safestrncpy(sd->status.name, BL_UCAST(BL_NPC, bl)->name, NAME_LENGTH); } } @@ -13660,7 +13646,7 @@ BUILDIN(atcommand) { */ BUILDIN(dispbottom) { - TBL_PC *sd = script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); const char *message = script_getstr(st,2); if (sd == NULL) @@ -13682,12 +13668,11 @@ BUILDIN(dispbottom) *------------------------------------------*/ BUILDIN(recovery) { - TBL_PC* sd; + struct map_session_data *sd; struct s_mapiterator* iter; iter = mapit_getallusers(); - for( sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); sd = (TBL_PC*)mapit->next(iter) ) - { + for (sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); sd = BL_UCAST(BL_PC, mapit->next(iter))) { if(pc_isdead(sd)) status->revive(&sd->bl, 100, 100); else @@ -13704,11 +13689,11 @@ BUILDIN(recovery) *------------------------------------------*/ BUILDIN(getpetinfo) { - TBL_PC *sd=script->rid2sd(st); - TBL_PET *pd; + struct map_session_data *sd = script->rid2sd(st); + struct pet_data *pd; int type=script_getnum(st,2); - if(!sd || !sd->pd) { + if (sd == NULL || sd->pd == NULL) { if (type == 2) script_pushconststr(st,"null"); else @@ -13738,10 +13723,10 @@ BUILDIN(getpetinfo) *------------------------------------------*/ BUILDIN(gethominfo) { - TBL_PC *sd=script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); int type = script_getnum(st,2); - if(!sd || !sd->hd) { + if (sd == NULL || sd->hd == NULL) { if (type == 2) script_pushconststr(st,"null"); else @@ -13820,7 +13805,7 @@ BUILDIN(getmercinfo) BUILDIN(checkequipedcard) { int n,i,c=0; - TBL_PC *sd = script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); if (sd == NULL) return true; @@ -13866,8 +13851,9 @@ BUILDIN(__jump_zero) /*========================================== * movenpc [MouseJstr] *------------------------------------------*/ -BUILDIN(movenpc) { - TBL_NPC *nd = NULL; +BUILDIN(movenpc) +{ + struct npc_data *nd = NULL; const char *npc_name; int x,y; @@ -13890,7 +13876,7 @@ BUILDIN(movenpc) { BUILDIN(message) { const char *message; - TBL_PC *sd = NULL; + struct map_session_data *sd = NULL; if (script_isstringtype(st,2)) sd = script->nick2sd(st, script_getstr(st,2)); @@ -13917,12 +13903,11 @@ BUILDIN(npctalk) if (script_hasdata(st, 3)) { nd = npc->name2id(script_getstr(st, 3)); - } - else { - nd = (struct npc_data *)map->id2bl(st->oid); + } else { + nd = map->id2nd(st->oid); } - if (nd) { + if (nd != NULL) { char name[NAME_LENGTH], message[256]; safestrncpy(name, nd->name, sizeof(name)); strtok(name, "#"); // discard extra name identifier if present @@ -13939,9 +13924,9 @@ BUILDIN(npcspeed) { int speed; speed = script_getnum(st,2); - nd = (struct npc_data *)map->id2bl(st->oid); + nd = map->id2nd(st->oid); - if( nd ) { + if (nd != NULL) { unit->bl2ud2(&nd->bl); // ensure nd->ud is safe to edit nd->speed = speed; nd->ud->state.speed_changed = 1; @@ -13950,14 +13935,15 @@ BUILDIN(npcspeed) { return true; } // make an npc walk to a position [Valaris] -BUILDIN(npcwalkto) { - struct npc_data *nd=(struct npc_data *)map->id2bl(st->oid); +BUILDIN(npcwalkto) +{ + struct npc_data *nd = map->id2nd(st->oid); int x=0,y=0; x=script_getnum(st,2); y=script_getnum(st,3); - if( nd ) { + if (nd != NULL) { unit->bl2ud2(&nd->bl); // ensure nd->ud is safe to edit if (!nd->status.hp) { status_calc_npc(nd, SCO_FIRST); @@ -13970,10 +13956,11 @@ BUILDIN(npcwalkto) { return true; } // stop an npc's movement [Valaris] -BUILDIN(npcstop) { - struct npc_data *nd = (struct npc_data *)map->id2bl(st->oid); +BUILDIN(npcstop) +{ + struct npc_data *nd = map->id2nd(st->oid); - if( nd ) { + if (nd != NULL) { unit->bl2ud2(&nd->bl); // ensure nd->ud is safe to edit unit->stop_walking(&nd->bl, STOPWALKING_FLAG_FIXPOS|STOPWALKING_FLAG_NEXTCELL); } @@ -13982,9 +13969,10 @@ BUILDIN(npcstop) { } // set click npc distance [4144] -BUILDIN(setnpcdistance) { - struct npc_data *nd = (struct npc_data *) map->id2bl (st->oid); - if (!nd) +BUILDIN(setnpcdistance) +{ + struct npc_data *nd = map->id2nd(st->oid); + if (nd == NULL) return false; nd->area_size = script_getnum(st, 2); @@ -13995,23 +13983,20 @@ BUILDIN(setnpcdistance) { // return current npc direction [4144] BUILDIN(getnpcdir) { - struct npc_data *nd = 0; + const struct npc_data *nd = NULL; - if (script_hasdata(st, 2)) - { - nd = npc->name2id (script_getstr(st, 2)); + if (script_hasdata(st, 2)) { + nd = npc->name2id(script_getstr(st, 2)); } - if (!nd && !st->oid) - { + if (nd == NULL && !st->oid) { script_pushint(st, -1); return true; } - if (!nd) - nd = (struct npc_data *) map->id2bl (st->oid); + if (nd == NULL) + nd = map->id2nd(st->oid); - if (!nd) - { + if (nd == NULL) { script_pushint(st, -1); return true; } @@ -14025,22 +14010,19 @@ BUILDIN(getnpcdir) BUILDIN(setnpcdir) { int newdir; - struct npc_data *nd = 0; + struct npc_data *nd = NULL; - if (script_hasdata(st, 3)) - { - nd = npc->name2id (script_getstr(st, 2)); + if (script_hasdata(st, 3)) { + nd = npc->name2id(script_getstr(st, 2)); newdir = script_getnum(st, 3); - } - else if (script_hasdata(st, 2)) - { + } else if (script_hasdata(st, 2)) { if (!st->oid) return false; - nd = (struct npc_data *) map->id2bl (st->oid); + nd = map->id2nd(st->oid); newdir = script_getnum(st, 2); } - if (!nd) + if (nd == NULL) return false; if (newdir < 0) @@ -14061,23 +14043,20 @@ BUILDIN(setnpcdir) // return npc class [4144] BUILDIN(getnpcclass) { - struct npc_data *nd = 0; + const struct npc_data *nd = NULL; - if (script_hasdata(st, 2)) - { - nd = npc->name2id (script_getstr(st, 2)); + if (script_hasdata(st, 2)) { + nd = npc->name2id(script_getstr(st, 2)); } - if (!nd && !st->oid) - { + if (nd == NULL && !st->oid) { script_pushint(st, -1); return false; } - if (!nd) - nd = (struct npc_data *) map->id2bl(st->oid); + if (nd == NULL) + nd = map->id2nd(st->oid); - if (!nd) - { + if (nd == NULL) { script_pushint(st, -1); return false; } @@ -14093,7 +14072,7 @@ BUILDIN(getnpcclass) BUILDIN(getlook) { int type,val = -1; - TBL_PC *sd = script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); if (sd == NULL) return true; @@ -14122,7 +14101,7 @@ BUILDIN(getlook) BUILDIN(getsavepoint) { int type; - TBL_PC *sd = script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); if (sd == NULL) return true; @@ -14165,7 +14144,7 @@ BUILDIN(getsavepoint) BUILDIN(getmapxy) { struct block_list *bl = NULL; - TBL_PC *sd=NULL; + struct map_session_data *sd = NULL; int64 num; const char *name; @@ -14364,7 +14343,7 @@ BUILDIN(getmapxy) BUILDIN(logmes) { const char *str; - TBL_PC *sd = script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); if (sd == NULL) return true; @@ -14378,12 +14357,11 @@ BUILDIN(summon) { int class_, timeout=0; const char *str,*event=""; - TBL_PC *sd; struct mob_data *md; int64 tick = timer->gettick(); - - sd=script->rid2sd(st); - if (!sd) return true; + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) + return true; str = script_getstr(st,2); class_ = script_getnum(st,3); @@ -14426,7 +14404,7 @@ BUILDIN(isequippedcnt) { int i, j, k, id = 1; int ret = 0; - TBL_PC *sd = script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); if (sd == NULL) return true; @@ -14478,7 +14456,7 @@ BUILDIN(isequipped) int ret = -1; //Original hash to reverse it when full check fails. unsigned int setitem_hash = 0, setitem_hash2 = 0; - TBL_PC *sd = script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); if (sd == NULL) return true; @@ -14556,7 +14534,7 @@ BUILDIN(cardscnt) int i, k, id = 1; int ret = 0; int index; - TBL_PC *sd = script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); if (sd == NULL) return true; @@ -14595,7 +14573,7 @@ BUILDIN(cardscnt) *-------------------------------------------------------*/ BUILDIN(getrefine) { - TBL_PC *sd = script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); if (sd == NULL) return true; @@ -14622,7 +14600,7 @@ BUILDIN(day) { BUILDIN(unequip) { size_t num; - TBL_PC *sd; + struct map_session_data *sd; num = script_getnum(st,2); sd = script->rid2sd(st); @@ -14637,11 +14615,9 @@ BUILDIN(unequip) BUILDIN(equip) { int nameid=0,i; - TBL_PC *sd; struct item_data *item_data; - - sd = script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return false; nameid=script_getnum(st,2); @@ -14688,7 +14664,7 @@ BUILDIN(equip2) { int i,nameid,ref,attr,c0,c1,c2,c3; struct item_data *item_data; - TBL_PC *sd = script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); if (sd == NULL) { script_pushint(st,0); @@ -14982,7 +14958,7 @@ BUILDIN(explode) char *temp = NULL; const char *name; - TBL_PC* sd = NULL; + struct map_session_data *sd = NULL; if (!data_isreference(data)) { ShowError("script:explode: not a variable\n"); @@ -15041,7 +15017,7 @@ BUILDIN(implode) const char *name; uint32 array_size, id; - TBL_PC* sd = NULL; + struct map_session_data *sd = NULL; char *output; @@ -15810,7 +15786,7 @@ BUILDIN(swap) BUILDIN(setd) { - TBL_PC *sd=NULL; + struct map_session_data *sd = NULL; char varname[100]; const char *buffer; int elem; @@ -15841,7 +15817,7 @@ BUILDIN(setd) int buildin_query_sql_sub(struct script_state* st, Sql* handle) { int i, j; - TBL_PC* sd = NULL; + struct map_session_data *sd = NULL; const char* query; struct script_data* data; const char* name; @@ -15968,11 +15944,10 @@ BUILDIN(getd) { // Pet stat [Lance] BUILDIN(petstat) { - TBL_PC *sd = NULL; struct pet_data *pd; int flag = script_getnum(st,2); - sd = script->rid2sd(st); - if(!sd || !sd->status.pet_id || !sd->pd) { + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL || sd->status.pet_id == 0 || sd->pd == NULL) { if(flag == 2) script_pushconststr(st, ""); else @@ -15998,7 +15973,7 @@ BUILDIN(callshop) struct npc_data *nd; const char *shopname; int flag = 0; - TBL_PC *sd = script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); if (sd == NULL) return true; @@ -16142,7 +16117,7 @@ BUILDIN(npcshopattach) { } if (flag) - nd->master_nd = ((struct npc_data *)map->id2bl(st->oid)); + nd->master_nd = map->id2nd(st->oid); else nd->master_nd = NULL; @@ -16353,7 +16328,7 @@ BUILDIN(getmonsterinfo) BUILDIN(checkvending) // check vending [Nab4] { - TBL_PC *sd = NULL; + struct map_session_data *sd = NULL; if (script_hasdata(st,2)) sd = script->nick2sd(st, script_getstr(st,2)); @@ -16370,7 +16345,7 @@ BUILDIN(checkvending) // check vending [Nab4] // check chatting [Marka] BUILDIN(checkchatting) { - TBL_PC *sd = NULL; + struct map_session_data *sd = NULL; if (script_hasdata(st,2)) sd = script->nick2sd(st, script_getstr(st,2)); @@ -16386,7 +16361,7 @@ BUILDIN(checkchatting) { } BUILDIN(checkidle) { - TBL_PC *sd = NULL; + struct map_session_data *sd = NULL; if (script_hasdata(st, 2)) sd = script->nick2sd(st, script_getstr(st, 2)); @@ -16412,11 +16387,11 @@ BUILDIN(searchitem) int32 start; int32 id; int32 i; - TBL_PC* sd = NULL; + struct map_session_data *sd = NULL; - if ((items[0] = itemdb->exists(atoi(itemname)))) + if ((items[0] = itemdb->exists(atoi(itemname)))) { count = 1; - else { + } else { count = itemdb->search_name_array(items, ARRAYLENGTH(items), itemname, 0); if (count > MAX_SEARCH) count = MAX_SEARCH; } @@ -16464,17 +16439,18 @@ BUILDIN(searchitem) } // [zBuffer] List of player cont commands ---> -BUILDIN(rid2name) { +BUILDIN(rid2name) +{ struct block_list *bl = NULL; int rid = script_getnum(st,2); if((bl = map->id2bl(rid))) { switch(bl->type) { - case BL_MOB: script_pushstrcopy(st,((TBL_MOB*)bl)->name); break; - case BL_PC: script_pushstrcopy(st,((TBL_PC*)bl)->status.name); break; - case BL_NPC: script_pushstrcopy(st,((TBL_NPC*)bl)->exname); break; - case BL_PET: script_pushstrcopy(st,((TBL_PET*)bl)->pet.name); break; - case BL_HOM: script_pushstrcopy(st,((TBL_HOM*)bl)->homunculus.name); break; - case BL_MER: script_pushstrcopy(st,((TBL_MER*)bl)->db->name); break; + case BL_MOB: script_pushstrcopy(st, BL_UCCAST(BL_MOB, bl)->name); break; + case BL_PC: script_pushstrcopy(st, BL_UCCAST(BL_PC, bl)->status.name); break; + case BL_NPC: script_pushstrcopy(st, BL_UCCAST(BL_NPC, bl)->exname); break; + case BL_PET: script_pushstrcopy(st, BL_UCCAST(BL_PET, bl)->pet.name); break; + case BL_HOM: script_pushstrcopy(st, BL_UCCAST(BL_HOM, bl)->homunculus.name); break; + case BL_MER: script_pushstrcopy(st, BL_UCCAST(BL_MER, bl)->db->name); break; default: ShowError("buildin_rid2name: BL type unknown.\n"); script_pushconststr(st,""); @@ -16489,7 +16465,7 @@ BUILDIN(rid2name) { BUILDIN(pcblockmove) { int id, flag; - TBL_PC *sd = NULL; + struct map_session_data *sd = NULL; id = script_getnum(st,2); flag = script_getnum(st,3); @@ -16505,9 +16481,10 @@ BUILDIN(pcblockmove) { return true; } -BUILDIN(pcfollow) { +BUILDIN(pcfollow) +{ int id, targetid; - TBL_PC *sd = NULL; + struct map_session_data *sd = NULL; id = script_getnum(st,2); targetid = script_getnum(st,3); @@ -16526,7 +16503,7 @@ BUILDIN(pcfollow) { BUILDIN(pcstopfollow) { int id; - TBL_PC *sd = NULL; + struct map_session_data *sd = NULL; id = script_getnum(st,2); @@ -16586,7 +16563,7 @@ BUILDIN(unitwalk) { } if( bl->type == BL_NPC ) { - unit->bl2ud2(bl); // ensure the ((TBL_NPC*)bl)->ud is safe to edit + unit->bl2ud2(bl); // ensure the ((struct npc_data*)bl)->ud is safe to edit } if( script_hasdata(st,4) ) { int x = script_getnum(st,3); @@ -16640,7 +16617,7 @@ BUILDIN(unitwarp) { mapid = map->mapname2mapid(mapname); if( mapid >= 0 && bl != NULL ) { - unit->bl2ud2(bl); // ensure ((TBL_NPC*)bl)->ud is safe to edit + unit->bl2ud2(bl); // ensure ((struct npc_data *)bl)->ud is safe to edit script_pushint(st, unit->warp(bl,mapid,x,y,CLR_OUTSIGHT)); } else { script_pushint(st, 0); @@ -16669,7 +16646,7 @@ BUILDIN(unitattack) { } if (script_isstringtype(st, 3)) { - TBL_PC* sd = script->nick2sd(st, script_getstr(st, 3)); + struct map_session_data *sd = script->nick2sd(st, script_getstr(st, 3)); if (sd != NULL) target_bl = &sd->bl; } else { @@ -16689,14 +16666,14 @@ BUILDIN(unitattack) { switch( unit_bl->type ) { case BL_PC: - clif->pActionRequest_sub(((TBL_PC *)unit_bl), actiontype > 0 ? 0x07 : 0x00, target_bl->id, timer->gettick()); + clif->pActionRequest_sub(BL_UCAST(BL_PC, unit_bl), actiontype > 0 ? 0x07 : 0x00, target_bl->id, timer->gettick()); script_pushint(st, 1); return true; case BL_MOB: - ((TBL_MOB *)unit_bl)->target_id = target_bl->id; + BL_UCAST(BL_MOB, unit_bl)->target_id = target_bl->id; break; case BL_PET: - ((TBL_PET *)unit_bl)->target_id = target_bl->id; + BL_UCAST(BL_PET, unit_bl)->target_id = target_bl->id; break; default: ShowError("script:unitattack: unsupported source unit type %d\n", unit_bl->type); @@ -16718,11 +16695,11 @@ BUILDIN(unitstop) { bl = map->id2bl(unit_id); if( bl != NULL ) { - unit->bl2ud2(bl); // ensure ((TBL_NPC*)bl)->ud is safe to edit + unit->bl2ud2(bl); // ensure ((struct npc_data *)bl)->ud is safe to edit unit->stop_attack(bl); unit->stop_walking(bl, STOPWALKING_FLAG_NEXTCELL); if( bl->type == BL_MOB ) - ((TBL_MOB*)bl)->target_id = 0; + BL_UCAST(BL_MOB, bl)->target_id = 0; } return true; @@ -16788,12 +16765,13 @@ BUILDIN(unitskilluseid) { bl = map->id2bl(unit_id); - if( bl != NULL ) { - if( bl->type == BL_NPC ) { - if (!((TBL_NPC*)bl)->status.hp) { - status_calc_npc(((TBL_NPC*)bl), SCO_FIRST); + if (bl != NULL) { + if (bl->type == BL_NPC) { + struct npc_data *nd = BL_UCAST(BL_NPC, bl); + if (nd->status.hp == 0) { + status_calc_npc(nd, SCO_FIRST); } else { - status_calc_npc(((TBL_NPC*)bl), SCO_NONE); + status_calc_npc(nd, SCO_NONE); } } unit->skilluse_id(bl, target_id, skill_id, skill_lv); @@ -16822,12 +16800,13 @@ BUILDIN(unitskillusepos) { bl = map->id2bl(unit_id); - if( bl != NULL ) { - if( bl->type == BL_NPC ) { - if (!((TBL_NPC*)bl)->status.hp) { - status_calc_npc(((TBL_NPC*)bl), SCO_FIRST); + if (bl != NULL) { + if (bl->type == BL_NPC) { + struct npc_data *nd = BL_UCAST(BL_NPC, bl); + if (nd->status.hp == 0) { + status_calc_npc(nd, SCO_FIRST); } else { - status_calc_npc(((TBL_NPC*)bl), SCO_NONE); + status_calc_npc(nd, SCO_NONE); } } unit->skilluse_pos(bl, skill_x, skill_y, skill_id, skill_lv); @@ -16908,7 +16887,7 @@ BUILDIN(awake) { for( tst = dbi_first(iter); dbi_exists(iter); tst = dbi_next(iter) ) { if( tst->oid == nd->bl.id ) { - TBL_PC* sd = map->id2sd(tst->rid); + struct map_session_data *sd = map->id2sd(tst->rid); if( tst->sleep.timer == INVALID_TIMER ) {// already awake ??? continue; @@ -17023,10 +17002,8 @@ BUILDIN(warpportal) { BUILDIN(openmail) { - TBL_PC* sd; - - sd = script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; mail->openmail(sd); @@ -17036,10 +17013,8 @@ BUILDIN(openmail) BUILDIN(openauction) { - TBL_PC* sd; - - sd = script->rid2sd(st); - if( sd == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; clif->auction_openwindow(sd); @@ -17478,8 +17453,9 @@ BUILDIN(questprogress) return true; } -BUILDIN(showevent) { - TBL_PC *sd = script->rid2sd(st); +BUILDIN(showevent) +{ + struct map_session_data *sd = script->rid2sd(st); struct npc_data *nd = map->id2nd(st->oid); int icon, color = 0; @@ -17522,9 +17498,9 @@ BUILDIN(waitingroom2bg) { if( script_hasdata(st,7) ) nd = npc->name2id(script_getstr(st,7)); else - nd = (struct npc_data *)map->id2bl(st->oid); + nd = map->id2nd(st->oid); - if( nd == NULL || (cd = (struct chat_data *)map->id2bl(nd->chat_id)) == NULL ) { + if (nd == NULL || (cd = map->id2cd(nd->chat_id)) == NULL) { script_pushint(st,0); return true; } @@ -17583,7 +17559,7 @@ BUILDIN(waitingroom2bg_single) { y = script_getnum(st,5); nd = npc->name2id(script_getstr(st,6)); - if( nd == NULL || (cd = (struct chat_data *)map->id2bl(nd->chat_id)) == NULL || cd->users <= 0 ) + if (nd == NULL || (cd = map->id2cd(nd->chat_id)) == NULL || cd->users <= 0) return true; if( (sd = cd->usersd[0]) == NULL ) @@ -17646,15 +17622,15 @@ BUILDIN(bg_monster) return true; } -BUILDIN(bg_monster_set_team) { - struct mob_data *md; - struct block_list *mbl; +BUILDIN(bg_monster_set_team) +{ int id = script_getnum(st,2), bg_id = script_getnum(st,3); + struct block_list *mbl = map->id2bl(id); // TODO: Why does this not use map->id2md? + struct mob_data *md = BL_CAST(BL_MOB, mbl); - if( (mbl = map->id2bl(id)) == NULL || mbl->type != BL_MOB ) + if (md == NULL) return true; - md = (TBL_MOB *)mbl; md->bg_id = bg_id; mob_stop_attack(md); @@ -18036,12 +18012,18 @@ BUILDIN(has_instance) { script_pushconststr(st, map->list[m].name); return true; } -int buildin_instance_warpall_sub(struct block_list *bl,va_list ap) { - struct map_session_data *sd = ((TBL_PC*)bl); + +int buildin_instance_warpall_sub(struct block_list *bl, va_list ap) +{ + struct map_session_data *sd = NULL; int map_index = va_arg(ap,int); int x = va_arg(ap,int); int y = va_arg(ap,int); + nullpo_ret(bl); + Assert_ret(bl->type == BL_PC); + sd = BL_UCAST(BL_PC, bl); + pc->setpos(sd,map_index,x,y,CLR_TELEPORT); return 0; @@ -18211,9 +18193,9 @@ BUILDIN(setfont) return true; } -int buildin_mobuseskill_sub(struct block_list *bl,va_list ap) +int buildin_mobuseskill_sub(struct block_list *bl, va_list ap) { - TBL_MOB* md = (TBL_MOB*)bl; + struct mob_data *md = NULL; struct block_list *tbl; int mobid = va_arg(ap,int); uint16 skill_id = va_arg(ap,int); @@ -18223,6 +18205,10 @@ int buildin_mobuseskill_sub(struct block_list *bl,va_list ap) int emotion = va_arg(ap,int); int target = va_arg(ap,int); + nullpo_ret(bl); + Assert_ret(bl->type == BL_MOB); + md = BL_UCAST(BL_MOB, bl); + if( md->class_ != mobid ) return 0; @@ -18420,9 +18406,10 @@ BUILDIN(showdigit) /** * Rune Knight **/ -BUILDIN(makerune) { - TBL_PC* sd; - if( (sd = script->rid2sd(st)) == NULL ) +BUILDIN(makerune) +{ + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; clif->skill_produce_mix_list(sd,RK_RUNEMASTERY,24); sd->itemid = script_getnum(st,2); @@ -18434,8 +18421,8 @@ BUILDIN(makerune) { **/ BUILDIN(hascashmount) { - TBL_PC* sd; - if( (sd = script->rid2sd(st)) == NULL ) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; if( sd->sc.data[SC_ALL_RIDING] ) script_pushint(st,1); @@ -18453,8 +18440,8 @@ BUILDIN(hascashmount) **/ BUILDIN(setcashmount) { - TBL_PC* sd; - if ((sd = script->rid2sd(st)) == NULL) + struct map_session_data *sd = script->rid2sd(st); + if (sd == NULL) return true; if (pc_hasmount(sd)) { clif->msgtable(sd, MSG_REINS_CANT_USE_MOUNTED); @@ -18715,7 +18702,7 @@ BUILDIN(unbindatcmd) { } BUILDIN(useatcmd) { - TBL_PC *sd, *dummy_sd = NULL; + struct map_session_data *sd, *dummy_sd = NULL; int fd; const char* cmd; @@ -18734,8 +18721,8 @@ BUILDIN(useatcmd) { if( st->oid ) { struct block_list* bl = map->id2bl(st->oid); memcpy(&sd->bl, bl, sizeof(struct block_list)); - if( bl->type == BL_NPC ) - safestrncpy(sd->status.name, ((TBL_NPC*)bl)->name, NAME_LENGTH); + if (bl->type == BL_NPC) + safestrncpy(sd->status.name, BL_UCAST(BL_NPC, bl)->name, NAME_LENGTH); } } @@ -18914,7 +18901,7 @@ BUILDIN(npcskill) if (sd == NULL) return true; - nd = (struct npc_data *)map->id2bl(sd->npc_id); + nd = map->id2nd(sd->npc_id); if (stat_point > battle_config.max_third_parameter) { ShowError("npcskill: stat point exceeded maximum of %d.\n",battle_config.max_third_parameter ); @@ -19584,7 +19571,7 @@ BUILDIN(bg_join_team) { BUILDIN(countbound) { int i, type, j=0, k=0; - TBL_PC *sd = script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); if (sd == NULL) return true; @@ -19620,7 +19607,7 @@ BUILDIN(checkbound) { int i, nameid = script_getnum(st,2); int bound_type = 0; - TBL_PC *sd = script->rid2sd(st); + struct map_session_data *sd = script->rid2sd(st); if (sd == NULL) return true; diff --git a/src/map/script.h b/src/map/script.h index b3e16b1b4..5f71662c6 100644 --- a/src/map/script.h +++ b/src/map/script.h @@ -647,10 +647,10 @@ struct script_interface { bool (*addScript) (char *name, char *args, bool (*func)(struct script_state *st), bool isDeprecated); int (*conv_num) (struct script_state *st,struct script_data *data); const char* (*conv_str) (struct script_state *st,struct script_data *data); - TBL_PC *(*rid2sd) (struct script_state *st); - TBL_PC *(*id2sd) (struct script_state *st, int account_id); - TBL_PC *(*charid2sd) (struct script_state *st, int char_id); - TBL_PC *(*nick2sd) (struct script_state *st, const char *name); + struct map_session_data *(*rid2sd) (struct script_state *st); + struct map_session_data *(*id2sd) (struct script_state *st, int account_id); + struct map_session_data *(*charid2sd) (struct script_state *st, int char_id); + struct map_session_data *(*nick2sd) (struct script_state *st, const char *name); void (*detach_rid) (struct script_state* st); struct script_data* (*push_val)(struct script_stack* stack, enum c_op type, int64 val, struct reg_db *ref); struct script_data *(*get_val) (struct script_state* st, struct script_data* data); @@ -728,7 +728,7 @@ struct script_interface { void (*read_constdb) (void); const char* (*print_line) (StringBuf *buf, const char *p, const char *mark, int line); void (*errorwarning_sub) (StringBuf *buf, const char *src, const char *file, int start_line, const char *error_msg, const char *error_pos); - int (*set_reg) (struct script_state *st, TBL_PC *sd, int64 num, const char *name, const void *value, struct reg_db *ref); + int (*set_reg) (struct script_state *st, struct map_session_data *sd, int64 num, const char *name, const void *value, struct reg_db *ref); void (*set_reg_ref_str) (struct script_state* st, struct reg_db *n, int64 num, const char* name, const char *str); void (*set_reg_scope_str) (struct script_state* st, struct reg_db *n, int64 num, const char* name, const char *str); void (*set_reg_npc_str) (struct script_state* st, struct reg_db *n, int64 num, const char* name, const char *str); diff --git a/src/map/skill.c b/src/map/skill.c index 5462340db..8414ac638 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -260,6 +260,7 @@ int skill_get_casttype2 (uint16 index) { //Returns actual skill range taking into account attack range and AC_OWL [Skotlex] int skill_get_range2 (struct block_list *bl, uint16 skill_id, uint16 skill_lv) { int range; + struct map_session_data *sd = BL_CAST(BL_PC, bl); if( bl->type == BL_MOB && battle_config.mob_ai&0x400 ) return 9; //Mobs have a range of 9 regardless of skill used. @@ -288,8 +289,8 @@ int skill_get_range2 (struct block_list *bl, uint16 skill_id, uint16 skill_lv) { case RA_ARROWSTORM: case RA_AIMEDBOLT: case RA_WUGBITE: - if( bl->type == BL_PC ) - range += pc->checkskill((TBL_PC*)bl, AC_VULTURE); + if (sd != NULL) + range += pc->checkskill(sd, AC_VULTURE); else range += 10; //Assume level 10? break; @@ -299,14 +300,14 @@ int skill_get_range2 (struct block_list *bl, uint16 skill_id, uint16 skill_lv) { case GS_FULLBUSTER: case GS_SPREADATTACK: case GS_GROUNDDRIFT: - if (bl->type == BL_PC) - range += pc->checkskill((TBL_PC*)bl, GS_SNAKEEYE); + if (sd != NULL) + range += pc->checkskill(sd, GS_SNAKEEYE); else range += 10; //Assume level 10? break; case NJ_KIRIKAGE: - if (bl->type == BL_PC) - range = skill->get_range(NJ_SHADOWJUMP,pc->checkskill((TBL_PC*)bl,NJ_SHADOWJUMP)); + if (sd != NULL) + range = skill->get_range(NJ_SHADOWJUMP, pc->checkskill(sd, NJ_SHADOWJUMP)); break; /** * Warlock @@ -323,9 +324,9 @@ int skill_get_range2 (struct block_list *bl, uint16 skill_id, uint16 skill_lv) { case WL_TETRAVORTEX: case WL_EARTHSTRAIN: case WL_RELEASE: - if( bl->type == BL_PC ) - range += pc->checkskill((TBL_PC*)bl, WL_RADIUS); - break; + if (sd != NULL) + range += pc->checkskill(sd, WL_RADIUS); + break; /** * Ranger Bonus **/ @@ -336,8 +337,8 @@ int skill_get_range2 (struct block_list *bl, uint16 skill_id, uint16 skill_lv) { case RA_CLUSTERBOMB: case RA_FIRINGTRAP: case RA_ICEBOUNDTRAP: - if( bl->type == BL_PC ) - range += (1 + pc->checkskill((TBL_PC*)bl, RA_RESEARCHTRAP))/2; + if (sd != NULL) + range += (1 + pc->checkskill(sd, RA_RESEARCHTRAP))/2; } if( !range && bl->type != BL_PC ) @@ -383,7 +384,7 @@ int skill_calc_heal(struct block_list *src, struct block_list *target, uint16 sk #endif // RENEWAL if (sd && (skill2_lv = pc->checkskill(sd, HP_MEDITATIO)) > 0) hp += hp * skill2_lv * 2 / 100; - else if( src->type == BL_HOM && (skill2_lv = homun->checkskill(((TBL_HOM*)src), HLIF_BRAIN)) > 0 ) + else if (src->type == BL_HOM && (skill2_lv = homun->checkskill(BL_UCAST(BL_HOM, src), HLIF_BRAIN)) > 0) hp += hp * skill2_lv * 2 / 100; break; } @@ -1765,8 +1766,8 @@ int skill_counter_additional_effect(struct block_list* src, struct block_list *b break; case HFLI_SBR44: // [orn] case HVAN_EXPLOSION: - if(src->type == BL_HOM){ - TBL_HOM *hd = (TBL_HOM*)src; + if (src->type == BL_HOM) { + struct homun_data *hd = BL_UCAST(BL_HOM, src); hd->homunculus.intimacy = 200; if (hd->master) clif->send_homdata(hd->master,SP_INTIMATE,hd->homunculus.intimacy/100); @@ -1957,8 +1958,7 @@ int skill_break_equip (struct block_list *bl, unsigned short where, int rate, in const enum sc_type scdef[4] = {SC_PROTECTWEAPON, SC_PROTECTARMOR, SC_PROTECTSHIELD, SC_PROTECTHELM}; struct status_change *sc = status->get_sc(bl); int i; - TBL_PC *sd; - sd = BL_CAST(BL_PC, bl); + struct map_session_data *sd = BL_CAST(BL_PC, bl); if (sc && !sc->count) sc = NULL; @@ -2074,9 +2074,9 @@ int skill_strip_equip(struct block_list *bl, unsigned short where, int rate, int - if 'flag&0x1', position update packets must not be sent. - if 'flag&0x2', skill blown ignores players' special_state.no_knockback -------------------------------------------------------------------------*/ -int skill_blown(struct block_list* src, struct block_list* target, int count, int8 dir, int flag) { +int skill_blown(struct block_list* src, struct block_list* target, int count, int8 dir, int flag) +{ int dx = 0, dy = 0; - struct skill_unit* su = NULL; nullpo_ret(src); @@ -2086,26 +2086,30 @@ int skill_blown(struct block_list* src, struct block_list* target, int count, in return 0; // Actual knockback distance is 0. switch (target->type) { - case BL_MOB: { - struct mob_data* md = BL_CAST(BL_MOB, target); - if (md->class_ == MOBID_EMPELIUM) - return 0; - if(src != target && is_boss(target)) // Bosses can't be knocked-back - return 0; - } + case BL_MOB: + { + const struct mob_data *md = BL_UCCAST(BL_MOB, target); + if (md->class_ == MOBID_EMPELIUM) + return 0; + if (src != target && is_boss(target)) // Bosses can't be knocked-back + return 0; + } break; - case BL_PC: { - struct map_session_data *sd = BL_CAST(BL_PC, target); - if( sd->sc.data[SC_BASILICA] && sd->sc.data[SC_BASILICA]->val4 == sd->bl.id && !is_boss(src)) - return 0; // Basilica caster can't be knocked-back by normal monsters. - if( !(flag&0x2) && src != target && sd->special_state.no_knockback ) - return 0; - } + case BL_PC: + { + struct map_session_data *sd = BL_UCAST(BL_PC, target); + if (sd->sc.data[SC_BASILICA] && sd->sc.data[SC_BASILICA]->val4 == sd->bl.id && !is_boss(src)) + return 0; // Basilica caster can't be knocked-back by normal monsters. + if (!(flag&0x2) && src != target && sd->special_state.no_knockback) + return 0; + } break; case BL_SKILL: - su = (struct skill_unit *)target; - if( su->group && (su->group->unit_id == UNT_ANKLESNARE || su->group->unit_id == UNT_REVERBERATION)) + { + struct skill_unit *su = BL_UCAST(BL_SKILL, target); + if (su->group && (su->group->unit_id == UNT_ANKLESNARE || su->group->unit_id == UNT_REVERBERATION)) return 0; // ankle snare cannot be knocked back + } break; } @@ -2232,8 +2236,8 @@ int skill_attack(int attack_type, struct block_list* src, struct block_list *dsr dmg = battle->calc_attack(attack_type,src,bl,skill_id,skill_lv,flag&0xFFF); //Skotlex: Adjusted to the new system - if( src->type == BL_PET ) { // [Valaris] - struct pet_data *pd = (TBL_PET*)src; + if (src->type == BL_PET) { // [Valaris] + struct pet_data *pd = BL_UCAST(BL_PET, src); if (pd->a_skill && pd->a_skill->div_ && pd->a_skill->id == skill_id) { int element = skill->get_ele(skill_id, skill_lv); /*if (skill_id == -1) Does it ever worked? @@ -2770,12 +2774,13 @@ int skill_attack(int attack_type, struct block_list* src, struct block_list *dsr if( sc && sc->data[SC_DEVOTION] && skill_id != PA_PRESSURE ) { struct status_change_entry *sce = sc->data[SC_DEVOTION]; struct block_list *d_bl = map->id2bl(sce->val1); + struct mercenary_data *d_md = BL_CAST(BL_MER, d_bl); + struct map_session_data *d_sd = BL_CAST(BL_PC, d_bl); - if( d_bl && ( - (d_bl->type == BL_MER && ((TBL_MER*)d_bl)->master && ((TBL_MER*)d_bl)->master->bl.id == bl->id) || - (d_bl->type == BL_PC && ((TBL_PC*)d_bl)->devotion[sce->val2] == bl->id) - ) && check_distance_bl(bl, d_bl, sce->val3) ) - { + if (d_bl != NULL + && ((d_md != NULL && d_md->master && d_md->master->bl.id == bl->id) || (d_sd != NULL && d_sd->devotion[sce->val2] == bl->id)) + && check_distance_bl(bl, d_bl, sce->val3) + ) { if(!rmdamage){ clif->damage(d_bl,d_bl, 0, 0, damage, 0, BDT_NORMAL, 0); status_fix_damage(NULL,d_bl, damage, 0); @@ -2876,8 +2881,8 @@ void skill_attack_combo2_unknown(int *attack_type, struct block_list* src, struc void skill_attack_display_unknown(int *attack_type, struct block_list* src, struct block_list *dsrc, struct block_list *bl, uint16 *skill_id, uint16 *skill_lv, int64 *tick, int *flag, int *type, struct Damage *dmg, int64 *damage) { if (*flag & SD_ANIMATION && dmg->div_ < 2) //Disabling skill animation doesn't works on multi-hit. *type = BDT_SPLASH; - if (bl->type == BL_SKILL ) { - TBL_SKILL *su = (TBL_SKILL*)bl; + if (bl->type == BL_SKILL) { + struct skill_unit *su = BL_UCAST(BL_SKILL, bl); if (su->group && skill->get_inf2(su->group->skill_id) & INF2_TRAP) // show damage on trap targets clif->skill_damage(src, bl, *tick, dmg->amotion, dmg->dmotion, *damage, dmg->div_, *skill_id, (*flag & SD_LEVEL) ? -1 : *skill_lv, BDT_SPLASH); } @@ -2895,7 +2900,7 @@ int skill_attack_dir_unknown(int *attack_type, struct block_list* src, struct bl void skill_attack_blow_unknown(int *attack_type, struct block_list* src, struct block_list *dsrc, struct block_list *bl, uint16 *skill_id, uint16 *skill_lv, int64 *tick, int *flag, int *type, struct Damage *dmg, int64 *damage, int8 *dir) { skill->blown(dsrc, bl, dmg->blewcount, *dir, 0x0); if (!dmg->blewcount && bl->type == BL_SKILL && *damage > 0){ - TBL_SKILL *su = (TBL_SKILL*)bl; + struct skill_unit *su = BL_UCAST(BL_SKILL, bl); if (su->group && su->group->skill_id == HT_BLASTMINE) skill->blown(src, bl, 3, -1, 0); } @@ -2938,15 +2943,18 @@ int skill_area_sub(struct block_list *bl, va_list ap) { return 0; } -int skill_check_unit_range_sub (struct block_list *bl, va_list ap) { - struct skill_unit *su; +int skill_check_unit_range_sub(struct block_list *bl, va_list ap) +{ + const struct skill_unit *su = NULL; uint16 skill_id,g_skill_id; - su = (struct skill_unit *)bl; + nullpo_ret(bl); - if(bl->prev == NULL || bl->type != BL_SKILL) + if (bl->type != BL_SKILL || bl->prev == NULL) return 0; + su = BL_UCCAST(BL_SKILL, bl); + if(!su->alive) return 0; @@ -3032,7 +3040,7 @@ int skill_check_unit_range2_sub (struct block_list *bl, va_list ap) { if( skill_id == HP_BASILICA && bl->type == BL_PC ) return 0; - if (skill_id == AM_DEMONSTRATION && bl->type == BL_MOB && ((TBL_MOB*)bl)->class_ == MOBID_EMPELIUM) + if (skill_id == AM_DEMONSTRATION && bl->type == BL_MOB && BL_UCCAST(BL_MOB, bl)->class_ == MOBID_EMPELIUM) return 0; //Allow casting Bomb/Demonstration Right under emperium [Skotlex] return 1; } @@ -3092,8 +3100,8 @@ int skill_check_condition_mercenary(struct block_list *bl, int skill_id, int lv, nullpo_ret(bl); switch( bl->type ) { - case BL_HOM: sd = ((TBL_HOM*)bl)->master; break; - case BL_MER: sd = ((TBL_MER*)bl)->master; break; + case BL_HOM: sd = BL_UCAST(BL_HOM, bl)->master; break; + case BL_MER: sd = BL_UCAST(BL_MER, bl)->master; break; } st = status->get_status_data(bl); @@ -3323,9 +3331,9 @@ int skill_timerskill(int tid, int64 tick, int id, intptr_t data) { break; case LG_MOONSLASHER: case SR_WINDMILL: - if( target->type == BL_PC ) { - struct map_session_data *tsd = NULL; - if( (tsd = ((TBL_PC*)target)) && !pc_issit(tsd) ) { + if (target->type == BL_PC) { + struct map_session_data *tsd = BL_UCAST(BL_PC, target); + if (!pc_issit(tsd)) { pc_setsit(tsd); skill->sit(tsd,1); clif->sitting(&tsd->bl); @@ -3344,11 +3352,12 @@ int skill_timerskill(int tid, int64 tick, int id, intptr_t data) { case SR_FALLENEMPIRE: case SR_TIGERCANNON: case SR_SKYNETBLOW: - if( src->type == BL_PC ) { + if (src->type == BL_PC) { + struct map_session_data *sd = BL_UCAST(BL_PC, src); if( distance_xy(src->x, src->y, target->x, target->y) >= 3 ) break; - skill->castend_damage_id(src, target, skl->skill_id, pc->checkskill(((TBL_PC*)src), skl->skill_id), tick, 0); + skill->castend_damage_id(src, target, skl->skill_id, pc->checkskill(sd, skl->skill_id), tick, 0); } break; case SC_ESCAPE: @@ -3359,12 +3368,14 @@ int skill_timerskill(int tid, int64 tick, int id, intptr_t data) { } break; case RK_HUNDREDSPEAR: - if(src->type == BL_PC) { - int skill_lv = pc->checkskill((TBL_PC *)src, KN_SPEARBOOMERANG); - if(skill_lv > 0) + if (src->type == BL_PC) { + struct map_session_data *sd = BL_UCAST(BL_PC, src); + int skill_lv = pc->checkskill(sd, KN_SPEARBOOMERANG); + if (skill_lv > 0) skill->attack(BF_WEAPON, src, src, target, KN_SPEARBOOMERANG, skill_lv, tick, skl->flag); - } else + } else { skill->attack(BF_WEAPON, src, src, target, KN_SPEARBOOMERANG, 1, tick, skl->flag); + } break; case CH_PALMSTRIKE: { @@ -3506,11 +3517,16 @@ bool skill_cleartimerskill_exception(int skill_id) return false; } -int skill_activate_reverberation(struct block_list *bl, va_list ap) { - struct skill_unit *su = (TBL_SKILL*)bl; - struct skill_unit_group *sg; - if( bl->type != BL_SKILL ) +int skill_activate_reverberation(struct block_list *bl, va_list ap) +{ + struct skill_unit *su = NULL; + struct skill_unit_group *sg = NULL; + + nullpo_ret(bl); + if (bl->type != BL_SKILL) return 0; + su = BL_UCAST(BL_SKILL, bl); + if( su->alive && (sg = su->group) != NULL && sg->skill_id == WM_REVERBERATION && sg->unit_id == UNT_REVERBERATION ) { int64 tick = timer->gettick(); clif->changetraplook(bl,UNT_USED_TRAPS); @@ -3521,8 +3537,14 @@ int skill_activate_reverberation(struct block_list *bl, va_list ap) { return 0; } -int skill_reveal_trap (struct block_list *bl, va_list ap) { - TBL_SKILL *su = (TBL_SKILL*)bl; +int skill_reveal_trap(struct block_list *bl, va_list ap) +{ + struct skill_unit *su = NULL; + + nullpo_ret(bl); + Assert_ret(bl->type == BL_SKILL); + su = BL_UCAST(BL_SKILL, bl); + if (su->alive && su->group && skill->get_inf2(su->group->skill_id)&INF2_TRAP) { //Reveal trap. //Change look is not good enough, the client ignores it as an actual trap still. [Skotlex] //clif->changetraplook(bl, su->group->unit_id); @@ -5000,7 +5022,7 @@ int skill_castend_id(int tid, int64 tick, int id, intptr_t data) { } if (ud->skill_id >= SL_SKE && ud->skill_id <= SL_SKA && target->type == BL_MOB) { - if (((TBL_MOB*)target)->class_ == MOBID_EMPELIUM) + if (BL_UCCAST(BL_MOB, target)->class_ == MOBID_EMPELIUM) break; } else if (inf && battle->check_target(src, target, inf) <= 0) { if (sd) clif->skill_fail(sd,ud->skill_id,USESKILL_FAIL_LEVEL,0); @@ -5560,30 +5582,31 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin abra_skill_lv = min(skill_lv, skill->get_max(abra_skill_id)); clif->skill_nodamage (src, bl, skill_id, skill_lv, 1); - if( sd ) - {// player-casted + if (sd) { + // player-casted sd->state.abra_flag = 1; sd->skillitem = abra_skill_id; sd->skillitemlv = abra_skill_lv; clif->item_skill(sd, abra_skill_id, abra_skill_lv); - } - else - {// mob-casted + } else { + // mob-casted struct unit_data *ud = unit->bl2ud(src); int inf = skill->get_inf(abra_skill_id); - if (!ud) break; + if (ud == NULL) + break; if (inf&INF_SELF_SKILL || inf&INF_SUPPORT_SKILL) { - if (src->type == BL_PET) - bl = (struct block_list*)((TBL_PET*)src)->msd; - if (!bl) bl = src; - unit->skilluse_id(src, bl->id, abra_skill_id, abra_skill_lv); + int id = src->id; + struct pet_data *pd = BL_CAST(BL_PET, src); + if (pd != NULL && pd->msd != NULL) + id = pd->msd->bl.id; + unit->skilluse_id(src, id, abra_skill_id, abra_skill_lv); } else { //Assume offensive skills int target_id = 0; if (ud->target) target_id = ud->target; else switch (src->type) { - case BL_MOB: target_id = ((TBL_MOB*)src)->target_id; break; - case BL_PET: target_id = ((TBL_PET*)src)->target_id; break; + case BL_MOB: target_id = BL_UCAST(BL_MOB, src)->target_id; break; + case BL_PET: target_id = BL_UCAST(BL_PET, src)->target_id; break; } if (!target_id) break; @@ -5817,7 +5840,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin if( sd ) skill->blockpc_start(sd, skill_id, skill->get_time(skill_id, skill_lv)); else if( bl->type == BL_MER ) - skill->blockmerc_start((TBL_MER*)bl, skill_id, skill->get_time(skill_id, skill_lv)); + skill->blockmerc_start(BL_UCAST(BL_MER, bl), skill_id, skill->get_time(skill_id, skill_lv)); break; case TK_JUMPKICK: @@ -7501,10 +7524,10 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin break; case HT_SPRINGTRAP: clif->skill_nodamage(src,bl,skill_id,skill_lv,1); - { - struct skill_unit *su=NULL; - if (bl->type==BL_SKILL && (su=(struct skill_unit *)bl) != NULL && su->group != NULL) { - switch(su->group->unit_id){ + if (bl->type == BL_SKILL) { + struct skill_unit *su = BL_UCAST(BL_SKILL, bl); + if (su->group != NULL) { + switch (su->group->unit_id) { case UNT_ANKLESNARE: if (su->group->val2 != 0) // if it is already trapping something don't spring it, @@ -9002,8 +9025,8 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin if( flag&1 ) { if( is_boss(bl) ) break; if( sc_start2(src,bl, type, 100, skill_lv, src->id, skill->get_time(skill_id, skill_lv))) { - if( bl->type == BL_MOB ) - mob->unlocktarget((TBL_MOB*)bl,timer->gettick()); + if (bl->type == BL_MOB) + mob->unlocktarget(BL_UCAST(BL_MOB, bl), timer->gettick()); unit->stop_attack(bl); clif->bladestop(src, bl->id, 1); map->freeblock_unlock(); @@ -9251,7 +9274,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin improv_skill_lv = 4 + skill_lv; clif->skill_nodamage (src, bl, skill_id, skill_lv, 1); - if( sd ) { + if (sd == NULL) { sd->state.abra_flag = 2; sd->skillitem = improv_skill_id; sd->skillitemlv = improv_skill_lv; @@ -9259,19 +9282,23 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin } else { struct unit_data *ud = unit->bl2ud(src); int inf = skill->get_inf(improv_skill_id); - if (!ud) break; + if (ud == NULL) + break; if (inf&INF_SELF_SKILL || inf&INF_SUPPORT_SKILL) { - if (src->type == BL_PET) - bl = (struct block_list*)((TBL_PET*)src)->msd; - if (!bl) bl = src; - unit->skilluse_id(src, bl->id, improv_skill_id, improv_skill_lv); + int id = src->id; + struct pet_data *pd = BL_CAST(BL_PET, src); + if (pd != NULL && pd->msd != NULL) + id = pd->msd->bl.id; + unit->skilluse_id(src, id, improv_skill_id, improv_skill_lv); } else { int target_id = 0; - if (ud->target) + if (ud->target) { target_id = ud->target; - else switch (src->type) { - case BL_MOB: target_id = ((TBL_MOB*)src)->target_id; break; - case BL_PET: target_id = ((TBL_PET*)src)->target_id; break; + } else { + switch (src->type) { + case BL_MOB: target_id = BL_UCAST(BL_MOB, src)->target_id; break; + case BL_PET: target_id = BL_UCAST(BL_PET, src)->target_id; break; + } } if (!target_id) break; @@ -10049,10 +10076,16 @@ int skill_castend_pos(int tid, int64 tick, int id, intptr_t data) return 0; } -static int check_npc_chaospanic(struct block_list* bl, va_list args) { - TBL_NPC* nd = (TBL_NPC*)bl; - if( nd->option&(OPTION_HIDE|OPTION_INVISIBLE) || nd->class_ != 45 ) +static int check_npc_chaospanic(struct block_list *bl, va_list args) +{ + const struct npc_data *nd = NULL; + + nullpo_ret(bl); + Assert_ret(bl->type == BL_NPC); + nd = BL_UCCAST(BL_NPC, bl); + + if (nd->option&(OPTION_HIDE|OPTION_INVISIBLE) || nd->class_ != WARP_CLASS) return 0; return 1; @@ -10648,9 +10681,10 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui clif->skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); } else { int mob_id = skill_lv < 2 ? MOBID_BLACK_MUSHROOM + rnd()%2 : MOBID_RED_PLANT + rnd()%6; - TBL_MOB* md = mob->once_spawn_sub(src, src->m, x, y, "--ja--", mob_id, "", SZ_SMALL, AI_NONE); + struct mob_data *md = mob->once_spawn_sub(src, src->m, x, y, "--ja--", mob_id, "", SZ_SMALL, AI_NONE); int i; - if (!md) break; + if (md == NULL) + break; if ((i = skill->get_time(skill_id, skill_lv)) > 0) { if( md->deletetimer != INVALID_TIMER ) @@ -10968,11 +11002,16 @@ bool skill_castend_pos2_unknown(struct block_list* src, int *x, int *y, uint16 * } /// transforms 'target' skill unit into dissonance (if conditions are met) -int skill_dance_overlap_sub(struct block_list* bl, va_list ap) { - struct skill_unit* target = (struct skill_unit*)bl; - struct skill_unit* src = va_arg(ap, struct skill_unit*); +int skill_dance_overlap_sub(struct block_list *bl, va_list ap) +{ + struct skill_unit *target = NULL; + struct skill_unit *src = va_arg(ap, struct skill_unit*); int flag = va_arg(ap, int); + nullpo_ret(bl); + Assert_ret(bl->type == BL_SKILL); + target = BL_UCAST(BL_SKILL, bl); + if (src == target) return 0; if (!target->group || !(target->group->state.song_dance&0x1)) @@ -11133,10 +11172,13 @@ struct skill_unit_group* skill_unitsetting(struct block_list *src, uint16 skill_ limit=2000; } else { // previous implementation (not used anymore) //Warp Portal morphing to active mode, extract relevant data from src. [Skotlex] - if( src->type != BL_SKILL ) return NULL; - group = ((TBL_SKILL*)src)->group; + struct skill_unit *su = BL_CAST(BL_SKILL, src); + if (su == NULL) + return NULL; + group = su->group; src = map->id2bl(group->src_id); - if( !src ) return NULL; + if (src == NULL) + return NULL; val2 = group->val2; //Copy the (x,y) position you warp to val3 = group->val3; //as well as the mapindex to warp to. } @@ -11666,11 +11708,9 @@ int skill_unit_onplace(struct skill_unit *src, struct block_list *bl, int64 tick case UNT_WARP_WAITING: { int working = sg->val1&0xffff; - if(bl->type==BL_PC && !working){ - struct map_session_data *sd = (struct map_session_data *)bl; - if((!sd->chatID || battle_config.chat_warpportal) - && sd->ud.to_x == src->bl.x && sd->ud.to_y == src->bl.y) - { + if (bl->type == BL_PC && !working) { + struct map_session_data *sd = BL_UCAST(BL_PC, bl); + if ((!sd->chatID || battle_config.chat_warpportal) && sd->ud.to_x == src->bl.x && sd->ud.to_y == src->bl.y) { int x = sg->val2>>16; int y = sg->val2&0xffff; int count = sg->val1>>16; @@ -11827,7 +11867,7 @@ void skill_unit_onplace_unknown(struct skill_unit *src, struct block_list *bl, i int skill_unit_onplace_timer(struct skill_unit *src, struct block_list *bl, int64 tick) { struct skill_unit_group *sg; struct block_list *ss; - TBL_PC* tsd; + struct map_session_data *tsd; struct status_data *tstatus, *bst; struct status_change *tsc, *ssc; struct skill_unit_group_tickset *ts; @@ -12416,7 +12456,7 @@ int skill_unit_onplace_timer(struct skill_unit *src, struct block_list *bl, int6 break; case UNT_DEMONIC_FIRE: { - TBL_PC* sd = BL_CAST(BL_PC, ss); + struct map_session_data *sd = BL_CAST(BL_PC, ss); switch( sg->val2 ) { case 1: case 2: @@ -12559,7 +12599,7 @@ int skill_unit_onplace_timer(struct skill_unit *src, struct block_list *bl, int6 } if (bl->type == BL_MOB && ss != bl) - mob->skill_event((TBL_MOB*)bl, ss, tick, MSC_SKILLUSED|(skill_id<<16)); + mob->skill_event(BL_UCAST(BL_MOB, bl), ss, tick, MSC_SKILLUSED|(skill_id<<16)); return skill_id; } @@ -12816,21 +12856,21 @@ int skill_unit_ondamaged(struct skill_unit *src, struct block_list *bl, int64 da /*========================================== * *------------------------------------------*/ -int skill_check_condition_char_sub (struct block_list *bl, va_list ap) { - int *c, skill_id; - struct block_list *src; - struct map_session_data *sd; - struct map_session_data *tsd; - int *p_sd; //Contains the list of characters found. +int skill_check_condition_char_sub (struct block_list *bl, va_list ap) +{ + struct map_session_data *tsd = NULL; + struct block_list *src = va_arg(ap, struct block_list *); + struct map_session_data *sd = NULL; + int *c = va_arg(ap, int *); + int *p_sd = va_arg(ap, int *); //Contains the list of characters found. + int skill_id = va_arg(ap, int); nullpo_ret(bl); - nullpo_ret(tsd=(struct map_session_data*)bl); - nullpo_ret(src=va_arg(ap,struct block_list *)); - nullpo_ret(sd=(struct map_session_data*)src); - - c=va_arg(ap,int *); - p_sd = va_arg(ap, int *); - skill_id = va_arg(ap,int); + nullpo_ret(src); + Assert_ret(bl->type == BL_PC); + Assert_ret(src->type == BL_PC); + tsd = BL_UCAST(BL_PC, bl); + sd = BL_UCAST(BL_PC, src); if ( ((skill_id != PR_BENEDICTIO && *c >=1) || *c >=2) && !(skill->get_inf2(skill_id)&INF2_CHORUS_SKILL) ) return 0; //Partner found for ensembles, or the two companions for Benedictio. [Skotlex] @@ -12958,15 +12998,18 @@ int skill_check_pc_partner (struct map_session_data *sd, uint16 skill_id, uint16 /*========================================== * *------------------------------------------*/ -int skill_check_condition_mob_master_sub (struct block_list *bl, va_list ap) { - int *c,src_id,mob_class,skill_id; - struct mob_data *md; +int skill_check_condition_mob_master_sub (struct block_list *bl, va_list ap) +{ + const struct mob_data *md = NULL; + int src_id = va_arg(ap, int); + int mob_class = va_arg(ap, int); + int skill_id = va_arg(ap, int); + int *c = va_arg(ap, int *); + + nullpo_ret(bl); + Assert_ret(bl->type == BL_MOB); + md = BL_UCCAST(BL_MOB, bl); - md=(struct mob_data*)bl; - src_id=va_arg(ap,int); - mob_class=va_arg(ap,int); - skill_id=va_arg(ap,int); - c=va_arg(ap,int *); if( md->master_id != src_id || md->special_state.ai != (skill_id == AM_SPHEREMINE?AI_SPHERE:skill_id == KO_ZANZOU?AI_ZANZOU:skill_id == MH_SUMMON_LEGION?AI_ATTACK:AI_FLORA) ) return 0; //Non alchemist summoned mobs have nothing to do here. @@ -15309,10 +15352,14 @@ int skill_autospell (struct map_session_data *sd, uint16 skill_id) /*========================================== * Sitting skills functions. *------------------------------------------*/ -int skill_sit_count (struct block_list *bl, va_list ap) { - struct map_session_data *sd; - int type =va_arg(ap,int); - sd=(struct map_session_data*)bl; +int skill_sit_count(struct block_list *bl, va_list ap) +{ + int type = va_arg(ap, int); + struct map_session_data *sd = NULL; + + nullpo_ret(bl); + Assert_ret(bl->type == BL_PC); + sd = BL_UCAST(BL_PC, bl); if(!pc_issit(sd)) return 0; @@ -15326,11 +15373,14 @@ int skill_sit_count (struct block_list *bl, va_list ap) { return 0; } -int skill_sit_in (struct block_list *bl, va_list ap) { - struct map_session_data *sd; - int type =va_arg(ap,int); +int skill_sit_in(struct block_list *bl, va_list ap) +{ + int type = va_arg(ap, int); + struct map_session_data *sd = NULL; - sd=(struct map_session_data*)bl; + nullpo_ret(bl); + Assert_ret(bl->type == BL_PC); + sd = BL_UCAST(BL_PC, bl); if(!pc_issit(sd)) return 0; @@ -15347,10 +15397,15 @@ int skill_sit_in (struct block_list *bl, va_list ap) { return 0; } -int skill_sit_out (struct block_list *bl, va_list ap) { - struct map_session_data *sd; - int type =va_arg(ap,int); - sd=(struct map_session_data*)bl; +int skill_sit_out(struct block_list *bl, va_list ap) +{ + int type = va_arg(ap, int); + struct map_session_data *sd = NULL; + + nullpo_ret(bl); + Assert_ret(bl->type == BL_PC); + sd = BL_UCAST(BL_PC, bl); + if(sd->state.gangsterparadise && type&1) sd->state.gangsterparadise=0; if(sd->state.rest && type&2) { @@ -15401,7 +15456,8 @@ int skill_sit (struct map_session_data *sd, int type) /*========================================== * *------------------------------------------*/ -int skill_frostjoke_scream(struct block_list *bl, va_list ap) { +int skill_frostjoke_scream(struct block_list *bl, va_list ap) +{ struct block_list *src; uint16 skill_id,skill_lv; int64 tick; @@ -15417,9 +15473,9 @@ int skill_frostjoke_scream(struct block_list *bl, va_list ap) { if (src == bl || status->isdead(bl)) return 0; if (bl->type == BL_PC) { - struct map_session_data *sd = (struct map_session_data *)bl; - if (sd && (pc_isinvisible(sd) || pc_ismadogear(sd))) - return 0;//Frost Joke / Scream cannot target invisible or MADO Gear characters [Ind] + const struct map_session_data *sd = BL_UCCAST(BL_PC, bl); + if (pc_isinvisible(sd) || pc_ismadogear(sd)) + return 0; //Frost Joke / Scream cannot target invisible or MADO Gear characters [Ind] } //It has been reported that Scream/Joke works the same regardless of woe-setting. [Skotlex] if(battle->check_target(src,bl,BCT_ENEMY) > 0) @@ -15551,15 +15607,15 @@ struct skill_unit_group *skill_locate_element_field(struct block_list *bl) { } // for graffiti cleaner [Valaris] -int skill_graffitiremover (struct block_list *bl, va_list ap) { - struct skill_unit *su=NULL; +int skill_graffitiremover(struct block_list *bl, va_list ap) +{ + struct skill_unit *su = NULL; nullpo_ret(bl); - if(bl->type != BL_SKILL) + if (bl->type != BL_SKILL) return 0; - - su = ((struct skill_unit *)bl); + su = BL_UCAST(BL_SKILL, bl); if((su->group) && (su->group->unit_id == UNT_GRAFFITI)) skill->delunit(su); @@ -15567,30 +15623,35 @@ int skill_graffitiremover (struct block_list *bl, va_list ap) { return 0; } -int skill_greed (struct block_list *bl, va_list ap) { - struct block_list *src; +int skill_greed(struct block_list *bl, va_list ap) +{ + struct block_list *src = va_arg(ap, struct block_list *); nullpo_ret(bl); - nullpo_ret(src = va_arg(ap, struct block_list *)); + nullpo_ret(src); - if(src->type == BL_PC && bl->type==BL_ITEM ) - pc->takeitem(((TBL_PC*)src), ((TBL_ITEM*)bl)); + if (src->type == BL_PC && bl->type == BL_ITEM) { + struct map_session_data *sd = BL_UCAST(BL_PC, src); + struct flooritem_data *fitem = BL_UCAST(BL_ITEM, bl); + pc->takeitem(sd, fitem); + } return 0; } + //For Ranger's Detonator [Jobbie/3CeAM] -int skill_detonator(struct block_list *bl, va_list ap) { - struct skill_unit *su=NULL; - struct block_list *src; +int skill_detonator(struct block_list *bl, va_list ap) +{ + struct skill_unit *su = NULL; + struct block_list *src = va_arg(ap,struct block_list *); int unit_id; nullpo_ret(bl); - src = va_arg(ap,struct block_list *); + nullpo_ret(src); - if( bl->type != BL_SKILL ) + if (bl->type != BL_SKILL) return 0; - - su = (struct skill_unit *)bl; + su = BL_UCAST(BL_SKILL, bl); if( !su->group || su->group->src_id != src->id ) return 0; @@ -15630,16 +15691,21 @@ int skill_detonator(struct block_list *bl, va_list ap) { /*========================================== * *------------------------------------------*/ -int skill_cell_overlap(struct block_list *bl, va_list ap) { +int skill_cell_overlap(struct block_list *bl, va_list ap) +{ uint16 skill_id; int *alive; - struct skill_unit *su; + struct skill_unit *su = NULL; skill_id = va_arg(ap,int); alive = va_arg(ap,int *); - su = (struct skill_unit *)bl; - if( su == NULL || su->group == NULL || (*alive) == 0 ) + nullpo_ret(bl); + Assert_ret(bl->type == BL_SKILL); + nullpo_ret(alive); + su = BL_UCAST(BL_SKILL, bl); + + if (bl->type != BL_SKILL || su->group == NULL || (*alive) == 0) return 0; if( su->group->state.guildaura ) /* guild auras are not canceled! */ @@ -15723,38 +15789,44 @@ int skill_cell_overlap(struct block_list *bl, va_list ap) { /*========================================== * *------------------------------------------*/ -int skill_chastle_mob_changetarget(struct block_list *bl,va_list ap) +int skill_chastle_mob_changetarget(struct block_list *bl, va_list ap) { - struct mob_data* md; - struct unit_data*ud = unit->bl2ud(bl); - struct block_list *from_bl; - struct block_list *to_bl; - md = (struct mob_data*)bl; - from_bl = va_arg(ap,struct block_list *); - to_bl = va_arg(ap,struct block_list *); - - if(ud && ud->target == from_bl->id) + struct unit_data *ud = unit->bl2ud(bl); + struct block_list *from_bl = va_arg(ap, struct block_list *); + struct block_list *to_bl = va_arg(ap, struct block_list *); + + nullpo_ret(bl); + nullpo_ret(from_bl); + nullpo_ret(to_bl); + + if (ud != NULL && ud->target == from_bl->id) ud->target = to_bl->id; - if(md->bl.type == BL_MOB && md->target_id == from_bl->id) - md->target_id = to_bl->id; + if (bl->type == BL_MOB) { + struct mob_data *md = BL_UCAST(BL_MOB, bl); + if (md->target_id == from_bl->id) + md->target_id = to_bl->id; + } return 0; } /*========================================== * *------------------------------------------*/ -int skill_trap_splash(struct block_list *bl, va_list ap) { - struct block_list *src; - int64 tick; - struct skill_unit *src_su; +int skill_trap_splash(struct block_list *bl, va_list ap) +{ + struct block_list *src = va_arg(ap, struct block_list *); + int64 tick = va_arg(ap, int64); + struct skill_unit *src_su = NULL; struct skill_unit_group *sg; struct block_list *ss; - src = va_arg(ap,struct block_list *); - src_su = (struct skill_unit *)src; - tick = va_arg(ap,int64); - if( !src_su->alive || bl->prev == NULL ) + nullpo_ret(bl); + nullpo_ret(src); + Assert_ret(src->type == BL_SKILL); + src_su = BL_UCAST(BL_SKILL, src); + + if (!src_su->alive || bl->prev == NULL) return 0; nullpo_ret(sg = src_su->group); @@ -15807,21 +15879,24 @@ int skill_trap_splash(struct block_list *bl, va_list ap) { break; case UNT_FIRINGTRAP: case UNT_ICEBOUNDTRAP: - if( src->id == bl->id ) break; - if( bl->type == BL_SKILL ){ - struct skill_unit *su = (struct skill_unit *)bl; - if( su->group->unit_id == UNT_USED_TRAPS ) + if (src->id == bl->id) + break; + if (bl->type == BL_SKILL) { + struct skill_unit *su = BL_UCAST(BL_SKILL, bl); + if (su->group->unit_id == UNT_USED_TRAPS) break; } + /* Fall through */ case UNT_CLUSTERBOMB: if( ss != bl ) skill->attack(BF_MISC,ss,src,bl,sg->skill_id,sg->skill_lv,tick,sg->val1|SD_LEVEL); break; case UNT_CLAYMORETRAP: - if( src->id == bl->id ) break; - if( bl->type == BL_SKILL ){ - struct skill_unit *su = (struct skill_unit *)bl; - switch( su->group->unit_id ){ + if (src->id == bl->id) + break; + if (bl->type == BL_SKILL) { + struct skill_unit *su = BL_UCAST(BL_SKILL, bl); + switch (su->group->unit_id) { case UNT_CLAYMORETRAP: case UNT_LANDMINE: case UNT_BLASTMINE: @@ -15837,6 +15912,7 @@ int skill_trap_splash(struct block_list *bl, va_list ap) { } break; } + /* Fall through */ default: skill->attack(skill->get_type(sg->skill_id),ss,src,bl,sg->skill_id,sg->skill_lv,tick,0); break; @@ -15918,8 +15994,9 @@ bool skill_can_cloak(struct map_session_data *sd) { * Verifies if an user can still be cloaked (AS_CLOAKING) * Is called via map->foreachinrange when any kind of wall disapears **/ -int skill_check_cloaking_end(struct block_list *bl, va_list ap) { - TBL_PC *sd = BL_CAST(BL_PC, bl); +int skill_check_cloaking_end(struct block_list *bl, va_list ap) +{ + struct map_session_data *sd = BL_CAST(BL_PC, bl); if (sd && sd->sc.data[SC_CLOAKING] && !skill->can_cloak(sd)) status_change_end(bl, SC_CLOAKING, INVALID_TIMER); @@ -15964,6 +16041,7 @@ bool skill_check_shadowform(struct block_list *bl, int64 damage, int hit) if (sc && sc->data[SC__SHADOWFORM] && damage) { struct block_list *src = map->id2bl(sc->data[SC__SHADOWFORM]->val2); + struct map_session_data *sd = BL_CAST(BL_PC, src); if( !src || src->m != bl->m ) { status_change_end(bl, SC__SHADOWFORM, INVALID_TIMER); @@ -15971,8 +16049,8 @@ bool skill_check_shadowform(struct block_list *bl, int64 damage, int hit) } if( src && (status->isdead(src) || !battle->check_target(bl,src,BCT_ENEMY)) ){ - if( src->type == BL_PC ) - ((TBL_PC*)src)->shadowform_id = 0; + if (sd != NULL) + sd->shadowform_id = 0; status_change_end(bl, SC__SHADOWFORM, INVALID_TIMER); return false; } @@ -15982,8 +16060,8 @@ bool skill_check_shadowform(struct block_list *bl, int64 damage, int hit) /* because damage can cancel it */ if( sc->data[SC__SHADOWFORM] && (--sc->data[SC__SHADOWFORM]->val3) <= 0 ) { status_change_end(bl, SC__SHADOWFORM, INVALID_TIMER); - if( src->type == BL_PC ) - ((TBL_PC*)src)->shadowform_id = 0; + if (sd != NULL) + sd->shadowform_id = 0; } return true; } @@ -16180,7 +16258,7 @@ struct skill_unit_group* skill_initunitgroup (struct block_list* src, int count, group->guild_id = status->get_guild_id(src); group->bg_id = bg->team_get_id(src); group->group_id = skill->get_new_group_id(); - group->unit.data = (struct skill_unit *)aCalloc(count,sizeof(struct skill_unit)); + CREATE(group->unit.data, struct skill_unit, 1); group->unit.count = count; group->alive_count = 0; group->val1 = 0; @@ -16207,24 +16285,27 @@ struct skill_unit_group* skill_initunitgroup (struct block_list* src, int count, /*========================================== * *------------------------------------------*/ -int skill_delunitgroup(struct skill_unit_group *group, const char* file, int line, const char* func) { +int skill_delunitgroup(struct skill_unit_group *group, const char *file, int line, const char *func) +{ struct block_list* src; struct unit_data *ud; int i,j; + struct map_session_data *sd = NULL; if( group == NULL ) { ShowDebug("skill_delunitgroup: group is NULL (source=%s:%d, %s)! Please report this! (#3504)\n", file, line, func); return 0; } - src=map->id2bl(group->src_id); + src = map->id2bl(group->src_id); ud = unit->bl2ud(src); - if(!src || !ud) { + sd = BL_CAST(BL_PC, src); + if (src == NULL || ud == NULL) { ShowError("skill_delunitgroup: Group's source not found! (src_id: %d skill_id: %d)\n", group->src_id, group->skill_id); return 0; } - if( src->type == BL_PC && !status->isdead(src) && ((TBL_PC*)src)->state.warping && !((TBL_PC*)src)->state.changemap ) { + if (sd != NULL && !status->isdead(src) && sd->state.warping && !sd->state.changemap) { switch( group->skill_id ) { case BA_DISSONANCE: case BA_POEMBRAGI: @@ -16236,7 +16317,7 @@ int skill_delunitgroup(struct skill_unit_group *group, const char* file, int lin case DC_DONTFORGETME: case DC_FORTUNEKISS: case DC_SERVICEFORYOU: - skill->usave_add(((TBL_PC*)src), group->skill_id, group->skill_lv); + skill->usave_add(sd, group->skill_id, group->skill_lv); break; } } @@ -16301,8 +16382,8 @@ int skill_delunitgroup(struct skill_unit_group *group, const char* file, int lin break; } - if (src->type==BL_PC && group->state.ammo_consume) - battle->consume_ammo((TBL_PC*)src, group->skill_id, group->skill_lv); + if (sd != NULL && group->state.ammo_consume) + battle->consume_ammo(sd, group->skill_id, group->skill_lv); group->alive_count=0; @@ -16646,9 +16727,10 @@ int skill_unit_timer(int tid, int64 tick, int id, intptr_t data) { /*========================================== * *------------------------------------------*/ -int skill_unit_move_sub(struct block_list* bl, va_list ap) { - struct skill_unit* su = (struct skill_unit *)bl; - struct skill_unit_group* group = su->group; +int skill_unit_move_sub(struct block_list* bl, va_list ap) +{ + struct skill_unit *su = NULL; + struct skill_unit_group *group = NULL; struct block_list* target = va_arg(ap,struct block_list*); int64 tick = va_arg(ap,int64); @@ -16658,6 +16740,10 @@ int skill_unit_move_sub(struct block_list* bl, va_list ap) { uint16 skill_id; int i; + nullpo_ret(bl); + Assert_ret(bl->type == BL_SKILL); + su = BL_UCAST(BL_SKILL, bl); + group = su->group; nullpo_ret(group); if( !su->alive || target->prev == NULL ) @@ -17607,9 +17693,10 @@ void skill_toggle_magicpower(struct block_list *bl, uint16 skill_id) { sc->data[SC_MAGICPOWER]->val4 = 1; status_calc_bl(bl, status->sc2scb_flag(SC_MAGICPOWER)); #ifndef RENEWAL - if(bl->type == BL_PC){// update current display. - clif->updatestatus(((TBL_PC *)bl),SP_MATK1); - clif->updatestatus(((TBL_PC *)bl),SP_MATK2); + if (bl->type == BL_PC) {// update current display. + struct map_session_data *sd = BL_UCAST(BL_PC, bl); + clif->updatestatus(sd, SP_MATK1); + clif->updatestatus(sd, SP_MATK2); } #endif } @@ -17857,13 +17944,15 @@ int skill_changematerial(struct map_session_data *sd, int n, unsigned short *ite /** * for Royal Guard's LG_TRAMPLE **/ -int skill_destroy_trap(struct block_list *bl, va_list ap) { - struct skill_unit *su = (struct skill_unit *)bl; +int skill_destroy_trap(struct block_list *bl, va_list ap) +{ + struct skill_unit *su = NULL; struct skill_unit_group *sg; - int64 tick; + int64 tick = va_arg(ap, int64); - nullpo_ret(su); - tick = va_arg(ap, int64); + nullpo_ret(bl); + Assert_ret(bl->type == BL_SKILL); + su = BL_UCAST(BL_SKILL, bl); if (su->alive && (sg = su->group) != NULL && skill->get_inf2(sg->skill_id)&INF2_TRAP) { switch( sg->unit_id ) { @@ -18025,11 +18114,14 @@ int skill_blockpc_start_(struct map_session_data *sd, uint16 skill_id, int tick) return 0; } -int skill_blockhomun_end(int tid, int64 tick, int id, intptr_t data) { // [orn] - struct homun_data *hd = (TBL_HOM*)map->id2bl(id); +// [orn] +int skill_blockhomun_end(int tid, int64 tick, int id, intptr_t data) +{ + struct homun_data *hd = map->id2hd(id); if (data <= 0 || data >= MAX_SKILL) return 0; - if (hd) hd->blockskill[data] = 0; + if (hd != NULL) + hd->blockskill[data] = 0; return 1; } @@ -18049,11 +18141,14 @@ int skill_blockhomun_start(struct homun_data *hd, uint16 skill_id, int tick) { / return timer->add(timer->gettick() + tick, skill->blockhomun_end, hd->bl.id, idx); } -int skill_blockmerc_end(int tid, int64 tick, int id, intptr_t data) {// [orn] - struct mercenary_data *md = (TBL_MER*)map->id2bl(id); - if( data <= 0 || data >= MAX_SKILL ) +// [orn] +int skill_blockmerc_end(int tid, int64 tick, int id, intptr_t data) +{ + struct mercenary_data *md = map->id2mc(id); + if (data <= 0 || data >= MAX_SKILL) return 0; - if( md ) md->blockskill[data] = 0; + if (md != NULL) + md->blockskill[data] = 0; return 1; } @@ -19106,7 +19201,7 @@ void skill_reload(void) chrif->skillid2idx(0); /* lets update all players skill tree : so that if any skill modes were changed they're properly updated */ iter = mapit_getallusers(); - for( sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); sd = (TBL_PC*)mapit->next(iter) ) + for (sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); sd = BL_UCAST(BL_PC, mapit->next(iter))) clif->skillinfoblock(sd); mapit->free(iter); diff --git a/src/map/status.c b/src/map/status.c index e96b881dd..c755d8eb0 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -1310,7 +1310,7 @@ int status_damage(struct block_list *src,struct block_list *target,int64 in_hp, } if (target->type == BL_SKILL) - return skill->unit_ondamaged((struct skill_unit *)target, src, hp, timer->gettick()); + return skill->unit_ondamaged(BL_UCAST(BL_SKILL, target), src, hp, timer->gettick()); st = status->get_status_data(target); if( st == &status->dummy ) @@ -1350,9 +1350,14 @@ int status_damage(struct block_list *src,struct block_list *target,int64 in_hp, #ifdef DEVOTION_REFLECT_DAMAGE if (src && (sce = sc->data[SC_DEVOTION]) != NULL) { struct block_list *d_bl = map->id2bl(sce->val1); + struct mercenary_data *d_md = BL_CAST(BL_MER, d_bl); + struct map_session_data *d_sd = BL_CAST(BL_PC, d_bl); - if(d_bl &&((d_bl->type == BL_MER && ((TBL_MER *)d_bl)->master && ((TBL_MER *)d_bl)->master->bl.id == target->id) - || (d_bl->type == BL_PC && ((TBL_PC *)d_bl)->devotion[sce->val2] == target->id)) && check_distance_bl(target, d_bl, sce->val3)) { + if (d_bl != NULL + && ((d_md != NULL && d_md->master != NULL && d_md->master->bl.id == target->id) + || (d_sd != NULL && d_sd->devotion[sce->val2] == target->id)) + && check_distance_bl(target, d_bl, sce->val3) + ) { clif->damage(d_bl, d_bl, 0, 0, hp, 0, BDT_NORMAL, 0); status_fix_damage(NULL, d_bl, hp, 0); return 0; @@ -1412,14 +1417,15 @@ int status_damage(struct block_list *src,struct block_list *target,int64 in_hp, } switch (target->type) { - case BL_PC: pc->damage((TBL_PC*)target,src,hp,sp); break; - case BL_MOB: mob->damage((TBL_MOB*)target, src, hp); break; - case BL_HOM: homun->damaged((TBL_HOM*)target); break; - case BL_MER: mercenary->heal((TBL_MER*)target,hp,sp); break; - case BL_ELEM: elemental->heal((TBL_ELEM*)target,hp,sp); break; + case BL_PC: pc->damage(BL_UCAST(BL_PC, target), src, hp, sp); break; + case BL_MOB: mob->damage(BL_UCAST(BL_MOB, target), src, hp); break; + case BL_HOM: homun->damaged(BL_UCAST(BL_HOM, target)); break; + case BL_MER: mercenary->heal(BL_UCAST(BL_MER, target), hp, sp); break; + case BL_ELEM: elemental->heal(BL_UCAST(BL_ELEM, target), hp, sp); break; } - if( src && target->type == BL_PC && (((TBL_PC*)target)->disguise) > 0 ) {// stop walking when attacked in disguise to prevent walk-delay bug + if (src != NULL && target->type == BL_PC && BL_UCAST(BL_PC, target)->disguise > 0) { + // stop walking when attacked in disguise to prevent walk-delay bug unit->stop_walking(target, STOPWALKING_FLAG_FIXPOS); } @@ -1437,11 +1443,11 @@ int status_damage(struct block_list *src,struct block_list *target,int64 in_hp, //&2: Also remove object from map. //&4: Also delete object from memory. switch (target->type) { - case BL_PC: flag = pc->dead((TBL_PC*)target,src); break; - case BL_MOB: flag = mob->dead((TBL_MOB*)target, src, (flag&4) ? 3 : 0); break; - case BL_HOM: flag = homun->dead((TBL_HOM*)target); break; - case BL_MER: flag = mercenary->dead((TBL_MER*)target); break; - case BL_ELEM: flag = elemental->dead((TBL_ELEM*)target); break; + case BL_PC: flag = pc->dead(BL_UCAST(BL_PC, target), src); break; + case BL_MOB: flag = mob->dead(BL_UCAST(BL_MOB, target), src, (flag&4) ? 3 : 0); break; + case BL_HOM: flag = homun->dead(BL_UCAST(BL_HOM, target)); break; + case BL_MER: flag = mercenary->dead(BL_UCAST(BL_MER, target)); break; + case BL_ELEM: flag = elemental->dead(BL_UCAST(BL_ELEM, target)); break; default: //Unhandled case, do nothing to object. flag = 0; break; @@ -1481,18 +1487,21 @@ int status_damage(struct block_list *src,struct block_list *target,int64 in_hp, sc_start(target,target,status->skill2sc(PR_KYRIE),100,10,time); if( target->type == BL_MOB ) - ((TBL_MOB*)target)->state.rebirth = 1; + BL_UCAST(BL_MOB, target)->state.rebirth = 1; return (int)(hp+sp); } - if (target->type == BL_MOB && sc && sc->data[SC_REBIRTH] && !((TBL_MOB*) target)->state.rebirth) { - // Ensure the monster has not already rebirthed before doing so. - status->revive(target, sc->data[SC_REBIRTH]->val2, 0); - status->change_clear(target,0); - ((TBL_MOB*)target)->state.rebirth = 1; + if (target->type == BL_MOB && sc != NULL && sc->data[SC_REBIRTH] != NULL) { + struct mob_data *t_md = BL_UCAST(BL_MOB, target); + if (!t_md->state.rebirth) { + // Ensure the monster has not already reborn before doing so. + status->revive(target, sc->data[SC_REBIRTH]->val2, 0); + status->change_clear(target,0); + t_md->state.rebirth = 1; - return (int)(hp+sp); + return (int)(hp+sp); + } } status->change_clear(target,0); @@ -1577,11 +1586,11 @@ int status_heal(struct block_list *bl,int64 in_hp,int64 in_sp, int flag) { // send hp update to client switch(bl->type) { - case BL_PC: pc->heal((TBL_PC*)bl,hp,sp,(flag&2) ? 1 : 0); break; - case BL_MOB: mob->heal((TBL_MOB*)bl,hp); break; - case BL_HOM: homun->healed((TBL_HOM*)bl); break; - case BL_MER: mercenary->heal((TBL_MER*)bl,hp,sp); break; - case BL_ELEM: elemental->heal((TBL_ELEM*)bl,hp,sp); break; + case BL_PC: pc->heal(BL_UCAST(BL_PC, bl), hp, sp, (flag&2) ? 1 : 0); break; + case BL_MOB: mob->heal(BL_UCAST(BL_MOB, bl), hp); break; + case BL_HOM: homun->healed(BL_UCAST(BL_HOM, bl)); break; + case BL_MER: mercenary->heal(BL_UCAST(BL_MER, bl), hp, sp); break; + case BL_ELEM: elemental->heal(BL_UCAST(BL_ELEM, bl), hp, sp); break; } return (int)(hp+sp); @@ -1674,9 +1683,9 @@ int status_revive(struct block_list *bl, unsigned char per_hp, unsigned char per clif->resurrection(bl, 1); switch (bl->type) { - case BL_PC: pc->revive((TBL_PC*)bl, hp, sp); break; - case BL_MOB: mob->revive((TBL_MOB*)bl, hp); break; - case BL_HOM: homun->revive((TBL_HOM*)bl, hp, sp); break; + case BL_PC: pc->revive(BL_UCAST(BL_PC, bl), hp, sp); break; + case BL_MOB: mob->revive(BL_UCAST(BL_MOB, bl), hp); break; + case BL_HOM: homun->revive(BL_UCAST(BL_HOM, bl), hp, sp); break; } return 1; } @@ -1709,9 +1718,9 @@ int status_fixed_revive(struct block_list *bl, unsigned int per_hp, unsigned int if (bl->prev) //Animation only if character is already on a map. clif->resurrection(bl, 1); switch (bl->type) { - case BL_PC: pc->revive((TBL_PC*)bl, hp, sp); break; - case BL_MOB: mob->revive((TBL_MOB*)bl, hp); break; - case BL_HOM: homun->revive((TBL_HOM*)bl, hp, sp); break; + case BL_PC: pc->revive(BL_UCAST(BL_PC, bl), hp, sp); break; + case BL_MOB: mob->revive(BL_UCAST(BL_MOB, bl), hp); break; + case BL_HOM: homun->revive(BL_UCAST(BL_HOM, bl), hp, sp); break; } return 1; } @@ -1731,10 +1740,11 @@ int status_check_skilluse(struct block_list *src, struct block_list *target, uin struct status_data *st; struct status_change *sc=NULL, *tsc; int hide_flag; + struct map_session_data *sd = BL_CAST(BL_PC, src); st = src ? status->get_status_data(src) : &status->dummy; - if (src && src->type != BL_PC && status->isdead(src)) + if (src != NULL && src->type != BL_PC && status->isdead(src)) return 0; if (!skill_id) { //Normal attack checks. @@ -1749,14 +1759,14 @@ int status_check_skilluse(struct block_list *src, struct block_list *target, uin } if( skill_id ) { - - if( src && !(src->type == BL_PC && ((TBL_PC*)src)->skillitem)) { // Items that cast skills using 'itemskill' will not be handled by map_zone_db. + if (src != NULL && (sd == NULL || sd->skillitem == 0)) { + // Items that cast skills using 'itemskill' will not be handled by map_zone_db. int i; for(i = 0; i < map->list[src->m].zone->disabled_skills_count; i++) { if( skill_id == map->list[src->m].zone->disabled_skills[i]->nameid && (map->list[src->m].zone->disabled_skills[i]->type&src->type) ) { if (src->type == BL_PC) { - clif->msgtable((TBL_PC*)src, MSG_SKILL_CANT_USE_AREA); // This skill cannot be used within this area + clif->msgtable(sd, MSG_SKILL_CANT_USE_AREA); // This skill cannot be used within this area } else if (src->type == BL_MOB && map->list[src->m].zone->disabled_skills[i]->subtype != MZS_NONE) { if( st->mode&MD_BOSS ) { /* is boss */ if( !( map->list[src->m].zone->disabled_skills[i]->subtype&MZS_BOSS ) ) @@ -1786,9 +1796,10 @@ int status_check_skilluse(struct block_list *src, struct block_list *target, uin break; case AL_TELEPORT: //Should fail when used on top of Land Protector [Skotlex] - if (src && map->getcell(src->m, src, src->x, src->y, CELL_CHKLANDPROTECTOR) - && !(st->mode&MD_BOSS) - && (src->type != BL_PC || ((TBL_PC*)src)->skillitem != skill_id)) + if (src != NULL + && map->getcell(src->m, src, src->x, src->y, CELL_CHKLANDPROTECTOR) + && !(st->mode&MD_BOSS) + && (src->type != BL_PC || sd->skillitem != skill_id)) return 0; break; default: @@ -1818,7 +1829,7 @@ int status_check_skilluse(struct block_list *src, struct block_list *target, uin struct block_list *winkcharm_target = map->id2bl(sc->data[SC_DC_WINKCHARM]->val2); if (winkcharm_target != NULL) { if (unit->bl2ud(src) && (unit->bl2ud(src))->walktimer == INVALID_TIMER) - unit->walktobl(src, map->id2bl(sc->data[SC_DC_WINKCHARM]->val2), 3, 1); + unit->walktobl(src, winkcharm_target, 3, 1); clif->emotion(src, E_LV); return 0; } else { @@ -1838,9 +1849,9 @@ int status_check_skilluse(struct block_list *src, struct block_list *target, uin } if (sc->data[SC_DANCING] && flag!=2) { - if( src->type == BL_PC && skill_id >= WA_SWING_DANCE && skill_id <= WM_UNLIMITED_HUMMING_VOICE ) - { // Lvl 5 Lesson or higher allow you use 3rd job skills while dancing.v - if( pc->checkskill((TBL_PC*)src,WM_LESSON) < 5 ) + if (src->type == BL_PC && skill_id >= WA_SWING_DANCE && skill_id <= WM_UNLIMITED_HUMMING_VOICE) { + // Lvl 5 Lesson or higher allow you use 3rd job skills while dancing.v + if (pc->checkskill(sd, WM_LESSON) < 5) return 0; } else if(sc->data[SC_LONGING]) { //Allow everything except dancing/re-dancing. [Skotlex] if (skill_id == BD_ENCORE || @@ -1862,48 +1873,45 @@ int status_check_skilluse(struct block_list *src, struct block_list *target, uin return 0; //Can't amp out of Wand of Hermode :/ [Skotlex] } - if (skill_id && //Do not block item-casted skills. - (src->type != BL_PC || ((TBL_PC*)src)->skillitem != skill_id) - ) { + if (skill_id != 0 /* Do not block item-casted skills.*/ && (src->type != BL_PC || sd->skillitem != skill_id)) { //Skills blocked through status changes... - if (!flag && ( //Blocked only from using the skill (stuff like autospell may still go through - sc->data[SC_SILENCE] || - sc->data[SC_STEELBODY] || - sc->data[SC_BERSERK] || - sc->data[SC_OBLIVIONCURSE] || - sc->data[SC_WHITEIMPRISON] || - sc->data[SC__INVISIBILITY] || - (sc->data[SC_COLD] && src->type != BL_MOB) || - sc->data[SC__IGNORANCE] || - sc->data[SC_DEEP_SLEEP] || - sc->data[SC_SATURDAY_NIGHT_FEVER] || - sc->data[SC_CURSEDCIRCLE_TARGET] || - (sc->data[SC_MARIONETTE_MASTER] && skill_id != CG_MARIONETTE) || //Only skill you can use is marionette again to cancel it - (sc->data[SC_MARIONETTE] && skill_id == CG_MARIONETTE) || //Cannot use marionette if you are being buffed by another - (sc->data[SC_STASIS] && skill->block_check(src, SC_STASIS, skill_id)) || - (sc->data[SC_KG_KAGEHUMI] && skill->block_check(src, SC_KG_KAGEHUMI, skill_id)) - )) - return 0; + if (!flag && ( //Blocked only from using the skill (stuff like autospell may still go through + sc->data[SC_SILENCE] || + sc->data[SC_STEELBODY] || + sc->data[SC_BERSERK] || + sc->data[SC_OBLIVIONCURSE] || + sc->data[SC_WHITEIMPRISON] || + sc->data[SC__INVISIBILITY] || + (sc->data[SC_COLD] && src->type != BL_MOB) || + sc->data[SC__IGNORANCE] || + sc->data[SC_DEEP_SLEEP] || + sc->data[SC_SATURDAY_NIGHT_FEVER] || + sc->data[SC_CURSEDCIRCLE_TARGET] || + (sc->data[SC_MARIONETTE_MASTER] && skill_id != CG_MARIONETTE) || //Only skill you can use is marionette again to cancel it + (sc->data[SC_MARIONETTE] && skill_id == CG_MARIONETTE) || //Cannot use marionette if you are being buffed by another + (sc->data[SC_STASIS] && skill->block_check(src, SC_STASIS, skill_id)) || + (sc->data[SC_KG_KAGEHUMI] && skill->block_check(src, SC_KG_KAGEHUMI, skill_id)) + )) + return 0; - //Skill blocking. - if ( - (sc->data[SC_VOLCANO] && skill_id == WZ_ICEWALL) || - (sc->data[SC_ROKISWEIL] && skill_id != BD_ADAPTATION) || - (sc->data[SC_HERMODE] && skill->get_inf(skill_id) & INF_SUPPORT_SKILL) || - pc_ismuted(sc, MANNER_NOSKILL) - ) - return 0; + //Skill blocking. + if ( + (sc->data[SC_VOLCANO] && skill_id == WZ_ICEWALL) || + (sc->data[SC_ROKISWEIL] && skill_id != BD_ADAPTATION) || + (sc->data[SC_HERMODE] && skill->get_inf(skill_id) & INF_SUPPORT_SKILL) || + pc_ismuted(sc, MANNER_NOSKILL) + ) + return 0; - if( sc->data[SC__MANHOLE] || ((tsc = status->get_sc(target)) && tsc->data[SC__MANHOLE]) ) { - switch(skill_id) {//##TODO## make this a flag in skill_db? - // Skills that can be used even under Man Hole effects. - case SC_SHADOWFORM: - break; - default: - return 0; - } + if( sc->data[SC__MANHOLE] || ((tsc = status->get_sc(target)) && tsc->data[SC__MANHOLE]) ) { + switch(skill_id) {//##TODO## make this a flag in skill_db? + // Skills that can be used even under Man Hole effects. + case SC_SHADOWFORM: + break; + default: + return 0; } - + } } } @@ -1963,23 +1971,26 @@ int status_check_skilluse(struct block_list *src, struct block_list *target, uin hide_flag &= ~OPTION_HIDE; switch( target->type ) { - case BL_PC: { - struct map_session_data *sd = (TBL_PC*) target; - bool is_boss = (st->mode&MD_BOSS); - bool is_detect = ((st->mode&MD_DETECTOR)?true:false);//god-knows-why gcc doesn't shut up until this happens - if (pc_isinvisible(sd)) + case BL_PC: + { + const struct map_session_data *tsd = BL_UCCAST(BL_PC, target); + bool is_boss = (st->mode&MD_BOSS); + bool is_detect = ((st->mode&MD_DETECTOR)?true:false);//god-knows-why gcc doesn't shut up until this happens + if (pc_isinvisible(tsd)) + return 0; + if (tsc != NULL) { + if (tsc->option&hide_flag + && !is_boss + && ((tsd->special_state.perfect_hiding || !is_detect) + || (tsc->data[SC_CLOAKINGEXCEED] != NULL && is_detect) + )) + return 0; + if (tsc->data[SC_CAMOUFLAGE] && !(is_boss || is_detect) && (!skill_id || (flag == 0 && src && src->type != BL_PC))) + return 0; + if (tsc->data[SC_STEALTHFIELD] && !is_boss) return 0; - if( tsc ) { - if (tsc->option&hide_flag && !is_boss && - ((sd->special_state.perfect_hiding || !is_detect) || - (tsc->data[SC_CLOAKINGEXCEED] && is_detect))) - return 0; - if( tsc->data[SC_CAMOUFLAGE] && !(is_boss || is_detect) && (!skill_id || (flag == 0 && src && src->type != BL_PC)) ) - return 0; - if( tsc->data[SC_STEALTHFIELD] && !is_boss ) - return 0; - } } + } break; case BL_ITEM: //Allow targeting of items to pick'em up (or in the case of mobs, to loot them). @@ -2052,7 +2063,7 @@ int status_calc_mob_(struct mob_data* md, enum e_status_calc_opt opt) { return 0; } if (!md->base_status) - md->base_status = (struct status_data*)aCalloc(1, sizeof(struct status_data)); + CREATE(md->base_status, struct status_data, 1); mstatus = md->base_status; memcpy(mstatus, &md->db->status, sizeof(struct status_data)); @@ -2074,7 +2085,7 @@ int status_calc_mob_(struct mob_data* md, enum e_status_calc_opt opt) { //Max HP setting from Summon Flora/marine Sphere struct unit_data *ud = unit->bl2ud(mbl); //Remove special AI when this is used by regular mobs. - if (mbl->type == BL_MOB && ((TBL_MOB*)mbl)->special_state.ai == AI_NONE) + if (mbl->type == BL_MOB && BL_UCAST(BL_MOB, mbl)->special_state.ai == AI_NONE) md->special_state.ai = AI_NONE; if (ud) { // different levels of HP according to skill level @@ -3426,8 +3437,8 @@ void status_calc_regen(struct block_list *bl, struct status_data *st, struct reg sregen->sp = cap_value(val, 0, SHRT_MAX); } - if( bl->type == BL_HOM ) { - struct homun_data *hd = (TBL_HOM*)bl; + if (bl->type == BL_HOM) { + struct homun_data *hd = BL_UCAST(BL_HOM, bl); if( (skill_lv = homun->checkskill(hd,HAMI_SKIN)) > 0 ) { val = regen->hp*(100+5*skill_lv)/100; regen->hp = cap_value(val, 1, SHRT_MAX); @@ -3492,10 +3503,17 @@ void status_calc_regen_rate(struct block_list *bl, struct regen_data *regen, str ) regen->flag = 0; //No regen - if ( sc->data[SC_DANCING] || sc->data[SC_OBLIVIONCURSE] || sc->data[SC_MAXIMIZEPOWER] || sc->data[SC_REBOUND] - || ( bl->type == BL_PC && (((TBL_PC*)bl)->class_&MAPID_UPPERMASK) == MAPID_MONK - && (sc->data[SC_EXTREMITYFIST] || (sc->data[SC_EXPLOSIONSPIRITS] && (!sc->data[SC_SOULLINK] || sc->data[SC_SOULLINK]->val2 != SL_MONK))) + if (sc->data[SC_DANCING] != NULL + || sc->data[SC_OBLIVIONCURSE] != NULL + || sc->data[SC_MAXIMIZEPOWER] != NULL + || sc->data[SC_REBOUND] != NULL + || (bl->type == BL_PC && (BL_UCAST(BL_PC, bl)->class_&MAPID_UPPERMASK) == MAPID_MONK + && (sc->data[SC_EXTREMITYFIST] != NULL + || (sc->data[SC_EXPLOSIONSPIRITS] != NULL + && (sc->data[SC_SOULLINK] == NULL || sc->data[SC_SOULLINK]->val2 != SL_MONK) ) + ) + ) ) { regen->flag &=~RGN_SP; //No natural SP regen } @@ -3542,13 +3560,21 @@ void status_calc_regen_rate(struct block_list *bl, struct regen_data *regen, str regen->rate.sp += regen->rate.sp * sc->data[SC_BUCHEDENOEL]->val2 / 100; } } + +#define status_get_homstr(st, hd) ((st)->str + (hd)->homunculus.str_value) +#define status_get_homagi(st, hd) ((st)->agi + (hd)->homunculus.agi_value) +#define status_get_homvit(st, hd) ((st)->vit + (hd)->homunculus.vit_value) +#define status_get_homint(st, hd) ((st)->int_ + (hd)->homunculus.int_value) +#define status_get_homdex(st, hd) ((st)->dex + (hd)->homunculus.dex_value) +#define status_get_homluk(st, hd) ((st)->luk + (hd)->homunculus.luk_value) + /// Recalculates parts of an object's battle status according to the specified flags. /// @param flag bitfield of values from enum scb_flag void status_calc_bl_main(struct block_list *bl, /*enum scb_flag*/int flag) { const struct status_data *bst = status->get_base_status(bl); struct status_data *st = status->get_status_data(bl); struct status_change *sc = status->get_sc(bl); - TBL_PC *sd = BL_CAST(BL_PC,bl); + struct map_session_data *sd = BL_CAST(BL_PC,bl); int temp; if (!bst || !st) @@ -3744,8 +3770,11 @@ void status_calc_bl_main(struct block_list *bl, /*enum scb_flag*/int flag) { if( bl->type&BL_PC && !(sd && sd->state.permanent_speed) && st->speed < battle_config.max_walk_speed ) st->speed = battle_config.max_walk_speed; - if( bl->type&BL_HOM && battle_config.hom_setting&0x8 && ((TBL_HOM*)bl)->master) - st->speed = status->get_speed(&((TBL_HOM*)bl)->master->bl); + if (bl->type&BL_HOM && battle_config.hom_setting&0x8) { + struct homun_data *hd = BL_UCAST(BL_HOM, bl); + if (hd->master != NULL) + st->speed = status->get_speed(&hd->master->bl); + } } if(flag&SCB_CRI && bst->cri) { @@ -3754,7 +3783,7 @@ void status_calc_bl_main(struct block_list *bl, /*enum scb_flag*/int flag) { else st->cri = status->calc_critical(bl, sc, bst->cri + 3*(st->luk - bst->luk), true); } - if (battle_config.show_katar_crit_bonus && bl->type == BL_PC && ((TBL_PC*)bl)->status.weapon == W_KATAR) + if (battle_config.show_katar_crit_bonus && bl->type == BL_PC && BL_UCAST(BL_PC, bl)->status.weapon == W_KATAR) st->cri <<= 1; if(flag&SCB_FLEE2 && bst->flee2) { @@ -3860,12 +3889,13 @@ void status_calc_bl_main(struct block_list *bl, /*enum scb_flag*/int flag) { if(flag&SCB_ASPD) { int amotion; if ( bl->type&BL_HOM ) { + const struct homun_data *hd = BL_UCCAST(BL_HOM, bl); #ifdef RENEWAL - amotion = ((TBL_HOM*)bl)->homunculusDB->baseASPD; - amotion = amotion - amotion * status_get_homdex(bl) / 1000 - status_get_homagi(bl) * amotion / 250; + amotion = hd->homunculusDB->baseASPD; + amotion = amotion - amotion * status_get_homdex(st, hd) / 1000 - status_get_homagi(st, hd) * amotion / 250; amotion = (amotion * status->calc_aspd(bl, sc, 1) + status->calc_aspd(bl, sc, 2)) / -100 + amotion; #else - amotion = (1000 - 4 * st->agi - st->dex) * ((TBL_HOM*)bl)->homunculusDB->baseASPD / 1000; + amotion = (1000 - 4 * st->agi - st->dex) * hd->homunculusDB->baseASPD / 1000; amotion = status->calc_aspd_rate(bl, sc, amotion); @@ -3918,16 +3948,20 @@ void status_calc_bl_main(struct block_list *bl, /*enum scb_flag*/int flag) { /// Also sends updates to the client wherever applicable. /// @param flag bitfield of values from enum scb_flag /// @param first if true, will cause status_calc_* functions to run their base status initialization code -void status_calc_bl_(struct block_list *bl, enum scb_flag flag, enum e_status_calc_opt opt) { +void status_calc_bl_(struct block_list *bl, enum scb_flag flag, enum e_status_calc_opt opt) +{ struct status_data bst; // previous battle status struct status_data *st; // pointer to current battle status - if( bl->type == BL_PC && ((TBL_PC*)bl)->delayed_damage != 0 ) { - if( opt&SCO_FORCE ) - ((TBL_PC*)bl)->state.hold_recalc = 0;/* clear and move on */ - else { - ((TBL_PC*)bl)->state.hold_recalc = 1;/* flag and stop */ - return; + if (bl->type == BL_PC) { + struct map_session_data *sd = BL_UCAST(BL_PC, bl); + if (sd->delayed_damage != 0) { + if (opt&SCO_FORCE) { + sd->state.hold_recalc = 0;/* clear and move on */ + } else { + sd->state.hold_recalc = 1;/* flag and stop */ + return; + } } } @@ -3964,7 +3998,7 @@ void status_calc_bl_(struct block_list *bl, enum scb_flag flag, enum e_status_ca // compare against new values and send client updates if( bl->type == BL_PC ) { - TBL_PC* sd = BL_CAST(BL_PC, bl); + struct map_session_data *sd = BL_CAST(BL_PC, bl); if(bst.str != st->str) clif->updatestatus(sd,SP_STR); if(bst.agi != st->agi) @@ -4055,11 +4089,11 @@ void status_calc_bl_(struct block_list *bl, enum scb_flag flag, enum e_status_ca clif->updatestatus(sd,SP_ATK2); #endif } else if( bl->type == BL_HOM ) { - TBL_HOM* hd = BL_CAST(BL_HOM, bl); - if( hd->master && memcmp(&bst, st, sizeof(struct status_data)) != 0 ) + struct homun_data *hd = BL_CAST(BL_HOM, bl); + if (hd->master != NULL && memcmp(&bst, st, sizeof(struct status_data)) != 0) clif->hominfo(hd->master,hd,0); } else if( bl->type == BL_MER ) { - TBL_MER* md = BL_CAST(BL_MER, bl); + struct mercenary_data *md = BL_CAST(BL_MER, bl); if( bst.rhw.atk != st->rhw.atk || bst.rhw.atk2 != st->rhw.atk2 ) clif->mercenary_updatestatus(md->master, SP_ATK1); if( bst.matk_max != st->matk_max ) @@ -4085,7 +4119,7 @@ void status_calc_bl_(struct block_list *bl, enum scb_flag flag, enum e_status_ca if( bst.sp != st->sp ) clif->mercenary_updatestatus(md->master, SP_SP); } else if( bl->type == BL_ELEM ) { - TBL_ELEM* ed = BL_CAST(BL_ELEM, bl); + struct elemental_data *ed = BL_CAST(BL_ELEM, bl); if( bst.max_hp != st->max_hp ) clif->elemental_updatestatus(ed->master, SP_MAXHP); if( bst.max_sp != st->max_sp ) @@ -4103,10 +4137,10 @@ int status_check_visibility(struct block_list *src, struct block_list *target) { switch ( src->type ) { case BL_MOB: - view_range = ((TBL_MOB*)src)->min_chase; + view_range = BL_UCCAST(BL_MOB, src)->min_chase; break; case BL_PET: - view_range = ((TBL_PET*)src)->db->range2; + view_range = BL_UCCAST(BL_PET, src)->db->range2; break; default: view_range = AREA_SIZE; @@ -4125,8 +4159,13 @@ int status_check_visibility(struct block_list *src, struct block_list *target) { case BL_PC: if ( tsc->data[SC_CLOAKINGEXCEED] && !(st->mode&MD_BOSS) ) return 0; - if ( (tsc->option&(OPTION_HIDE | OPTION_CLOAK | OPTION_CHASEWALK) || tsc->data[SC_STEALTHFIELD] || tsc->data[SC__INVISIBILITY] || tsc->data[SC_CAMOUFLAGE]) && !(st->mode&MD_BOSS) && - (((TBL_PC*)target)->special_state.perfect_hiding || !(st->mode&MD_DETECTOR)) ) + if ((tsc->option&(OPTION_HIDE | OPTION_CLOAK | OPTION_CHASEWALK) + || tsc->data[SC_STEALTHFIELD] != NULL + || tsc->data[SC__INVISIBILITY] != NULL + || tsc->data[SC_CAMOUFLAGE] != NULL + ) + && !(st->mode&MD_BOSS) + && (BL_UCCAST(BL_PC, target)->special_state.perfect_hiding || !(st->mode&MD_DETECTOR))) return 0; break; default: @@ -4192,8 +4231,8 @@ unsigned short status_base_atk(const struct block_list *bl, const struct status_ if ( !(bl->type&battle_config.enable_baseatk) ) return 0; - if ( bl->type == BL_PC ) - switch ( ((TBL_PC*)bl)->status.weapon ) { + if (bl->type == BL_PC) { + switch (BL_UCCAST(BL_PC, bl)->status.weapon) { case W_BOW: case W_MUSICAL: case W_WHIP: @@ -4203,36 +4242,39 @@ unsigned short status_base_atk(const struct block_list *bl, const struct status_ case W_SHOTGUN: case W_GRENADE: flag = 1; + } } if ( flag ) { -#ifdef RENEWAL - dstr = -#endif - str = st->dex; + str = st->dex; dex = st->str; } else { -#ifdef RENEWAL - dstr = -#endif - str = st->str; + str = st->str; dex = st->dex; } +#ifdef RENEWAL + dstr = str; +#endif //Normally only players have base-atk, but homunc have a different batk // equation, hinting that perhaps non-players should use this for batk. // [Skotlex] #ifdef RENEWAL - if ( bl->type == BL_HOM ) - str = 2 * (((TBL_HOM*)bl)->homunculus.level + status_get_homstr(bl)); + if (bl->type == BL_HOM) { + const struct homun_data *hd = BL_UCCAST(BL_HOM, bl); + str = 2 * (hd->homunculus.level + status_get_homstr(st, hd)); + } #else dstr = str / 10; str += dstr*dstr; #endif - if ( bl->type == BL_PC ) #ifdef RENEWAL - str = (int)(dstr + (float)dex / 5 + (float)st->luk / 3 + (float)((TBL_PC*)bl)->status.base_level / 4); - else if ( bl->type == BL_MOB || bl->type == BL_MER ) - str = dstr + ((TBL_MOB*)bl)->level; + if (bl->type == BL_PC) + str = (int)(dstr + (float)dex / 5 + (float)st->luk / 3 + (float)BL_UCCAST(BL_PC, bl)->status.base_level / 4); + else if (bl->type == BL_MOB) + str = dstr + BL_UCCAST(BL_MOB, bl)->level; + //else if (bl->type == BL_MER) // FIXME: What should go here? + // str = dstr + BL_UCCAST(BL_MER, bl)->level; #else + if (bl->type == BL_PC) str += dex / 5 + st->luk / 5; #endif return cap_value(str, 0, USHRT_MAX); @@ -4249,7 +4291,7 @@ unsigned short status_base_matk(struct block_list *bl, const struct status_data case BL_MOB: return st->int_ + level; case BL_HOM: - return status_get_homint(bl) + level; + return status_get_homint(st, BL_UCCAST(BL_HOM, bl)) + level; case BL_MER: return st->int_ + st->int_ / 5 * st->int_ / 5; case BL_PC: @@ -4272,14 +4314,15 @@ void status_calc_misc(struct block_list *bl, struct status_data *st, int level) #ifdef RENEWAL // renewal formulas if ( bl->type == BL_HOM ) { - st->def2 = status_get_homvit(bl) + status_get_homagi(bl) / 2; - st->mdef2 = (status_get_homvit(bl) + status_get_homint(bl)) / 2; - st->def += status_get_homvit(bl) + level / 2; // Increase. Already initialized in status_calc_homunculus_ - st->mdef = (int)(((float)status_get_homvit(bl) + level) / 4 + (float)status_get_homint(bl) / 2); + const struct homun_data *hd = BL_UCCAST(BL_HOM, bl); + st->def2 = status_get_homvit(st, hd) + status_get_homagi(st, hd) / 2; + st->mdef2 = (status_get_homvit(st, hd) + status_get_homint(st, hd)) / 2; + st->def += status_get_homvit(st, hd) + level / 2; // Increase. Already initialized in status_calc_homunculus_ + st->mdef = (int)(((float)status_get_homvit(st, hd) + level) / 4 + (float)status_get_homint(st, hd) / 2); st->hit = level + st->dex + 150; - st->flee = level + status_get_homagi(bl); - st->rhw.atk = (status_get_homstr(bl) + status_get_homdex(bl)) / 5; - st->rhw.atk2 = (status_get_homluk(bl) + status_get_homstr(bl) + status_get_homdex(bl)) / 3; + st->flee = level + status_get_homagi(st, hd); + st->rhw.atk = (status_get_homstr(st, hd) + status_get_homdex(st, hd)) / 5; + st->rhw.atk2 = (status_get_homluk(st, hd) + status_get_homstr(st, hd) + status_get_homdex(st, hd)) / 3; } else { st->hit += level + st->dex + (bl->type == BL_PC ? st->luk / 3 + 175 : 150); //base level + ( every 1 dex = +1 hit ) + (every 3 luk = +1 hit) + 175 st->flee += level + st->agi + (bl->type == BL_MER ? 0: (bl->type == BL_PC ? st->luk / 5 : 0) + 100); //base level + ( every 1 agi = +1 flee ) + (every 5 luk = +1 flee) + 100 @@ -4833,10 +4876,10 @@ unsigned short status_calc_watk(struct block_list *bl, struct status_change *sc, #ifndef RENEWAL if(sc->data[SC_NIBELUNGEN]) { - if (bl->type != BL_PC) + if (bl->type != BL_PC) { watk += sc->data[SC_NIBELUNGEN]->val2; - else { - TBL_PC *sd = (TBL_PC*)bl; + } else { + const struct map_session_data *sd = BL_UCCAST(BL_PC, bl); int index = sd->equip_index[sd->state.lr_flag?EQI_HAND_L:EQI_HAND_R]; if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->wlv == 4) watk += sc->data[SC_NIBELUNGEN]->val2; @@ -5469,7 +5512,7 @@ signed short status_calc_mdef2(struct block_list *bl, struct status_change *sc, unsigned short status_calc_speed(struct block_list *bl, struct status_change *sc, int speed) { - TBL_PC* sd = BL_CAST(BL_PC, bl); + struct map_session_data *sd = BL_CAST(BL_PC, bl); int speed_rate; if( sc == NULL || ( sd && sd->state.permanent_speed ) ) @@ -5698,11 +5741,10 @@ short status_calc_aspd(struct block_list *bl, struct status_change *sc, short fl } if (sc->data[SC_ASSNCROS] && bonus < sc->data[SC_ASSNCROS]->val2) { - if (bl->type!=BL_PC) + if (bl->type != BL_PC) { bonus = sc->data[SC_ASSNCROS]->val2; - else { - switch (((TBL_PC*)bl)->status.weapon) - { + } else { + switch (BL_UCCAST(BL_PC, bl)->status.weapon) { case W_BOW: case W_REVOLVER: case W_RIFLE: @@ -5798,11 +5840,10 @@ short status_calc_fix_aspd(struct block_list *bl, struct status_change *sc, int if (!sc || !sc->count) return cap_value(aspd, 0, 2000); - if ((sc->data[SC_GUST_OPTION] || sc->data[SC_BLAST_OPTION] - || sc->data[SC_WILD_STORM_OPTION])) + if (sc->data[SC_GUST_OPTION] != NULL || sc->data[SC_BLAST_OPTION] != NULL || sc->data[SC_WILD_STORM_OPTION] != NULL) aspd -= 50; // +5 ASPD - if (sc->data[SC_FIGHTINGSPIRIT] && sc->data[SC_FIGHTINGSPIRIT]->val2) - aspd -= (bl->type==BL_PC?pc->checkskill((TBL_PC *)bl, RK_RUNEMASTERY):10) / 10 * 40; + if (sc->data[SC_FIGHTINGSPIRIT] != NULL && sc->data[SC_FIGHTINGSPIRIT]->val2 != 0) + aspd -= (bl->type == BL_PC ? pc->checkskill(BL_UCAST(BL_PC, bl), RK_RUNEMASTERY) : 10) / 10 * 40; if (sc->data[SC_MTF_ASPD]) aspd -= sc->data[SC_MTF_ASPD]->val1; @@ -5857,14 +5898,11 @@ short status_calc_aspd_rate(struct block_list *bl, struct status_change *sc, int max < sc->data[SC_HLIF_FLEET]->val2) max = sc->data[SC_HLIF_FLEET]->val2; - if(sc->data[SC_ASSNCROS] && - max < sc->data[SC_ASSNCROS]->val2) - { - if (bl->type!=BL_PC) + if (sc->data[SC_ASSNCROS] && max < sc->data[SC_ASSNCROS]->val2) { + if (bl->type != BL_PC) { max = sc->data[SC_ASSNCROS]->val2; - else - switch(((TBL_PC*)bl)->status.weapon) - { + } else { + switch (BL_UCCAST(BL_PC, bl)->status.weapon) { case W_BOW: case W_REVOLVER: case W_RIFLE: @@ -5874,6 +5912,7 @@ short status_calc_aspd_rate(struct block_list *bl, struct status_change *sc, int break; default: max = sc->data[SC_ASSNCROS]->val2; + } } } @@ -5957,9 +5996,10 @@ short status_calc_aspd_rate(struct block_list *bl, struct status_change *sc, int return (short)cap_value(aspd_rate,0,SHRT_MAX); } -unsigned short status_calc_dmotion(struct block_list *bl, struct status_change *sc, int dmotion) { +unsigned short status_calc_dmotion(struct block_list *bl, struct status_change *sc, int dmotion) +{ // It has been confirmed on official servers that MvP mobs have no dmotion even without endure - if( bl->type == BL_MOB && (((TBL_MOB*)bl)->status.mode&MD_BOSS) ) + if (bl->type == BL_MOB && (BL_UCCAST(BL_MOB, bl)->status.mode&MD_BOSS)) return 0; if( !sc || !sc->count || map_flag_gvg2(bl->m) || map->list[bl->m].flag.battleground ) @@ -6183,14 +6223,21 @@ unsigned short status_calc_mode(struct block_list *bl, struct status_change *sc, return cap_value(mode,0,USHRT_MAX); } -const char* status_get_name(struct block_list *bl) { +const char *status_get_name(struct block_list *bl) +{ nullpo_ret(bl); switch (bl->type) { - case BL_PC: return ((TBL_PC *)bl)->fakename[0] != '\0' ? ((TBL_PC*)bl)->fakename : ((TBL_PC*)bl)->status.name; - case BL_MOB: return ((TBL_MOB*)bl)->name; - case BL_PET: return ((TBL_PET*)bl)->pet.name; - case BL_HOM: return ((TBL_HOM*)bl)->homunculus.name; - case BL_NPC: return ((TBL_NPC*)bl)->name; + case BL_PC: + { + const struct map_session_data *sd = BL_UCCAST(BL_PC, bl); + if (sd->fakename[0] != '\0') + return sd->fakename; + return sd->status.name; + } + case BL_MOB: return BL_UCCAST(BL_MOB, bl)->name; + case BL_PET: return BL_UCCAST(BL_PET, bl)->pet.name; + case BL_HOM: return BL_UCCAST(BL_HOM, bl)->homunculus.name; + case BL_NPC: return BL_UCCAST(BL_NPC, bl)->name; } return "Unknown"; } @@ -6201,16 +6248,17 @@ const char* status_get_name(struct block_list *bl) { * 0 = fail * class_id = success *------------------------------------------*/ -int status_get_class(struct block_list *bl) { +int status_get_class(struct block_list *bl) +{ nullpo_ret(bl); - switch( bl->type ) { - case BL_PC: return ((TBL_PC*)bl)->status.class_; - case BL_MOB: return ((TBL_MOB*)bl)->vd->class_; //Class used on all code should be the view class of the mob. - case BL_PET: return ((TBL_PET*)bl)->pet.class_; - case BL_HOM: return ((TBL_HOM*)bl)->homunculus.class_; - case BL_MER: return ((TBL_MER*)bl)->mercenary.class_; - case BL_NPC: return ((TBL_NPC*)bl)->class_; - case BL_ELEM: return ((TBL_ELEM*)bl)->elemental.class_; + switch (bl->type) { + case BL_PC: return BL_UCCAST(BL_PC, bl)->status.class_; + case BL_MOB: return BL_UCCAST(BL_MOB, bl)->vd->class_; //Class used on all code should be the view class of the mob. + case BL_PET: return BL_UCCAST(BL_PET, bl)->pet.class_; + case BL_HOM: return BL_UCCAST(BL_HOM, bl)->homunculus.class_; + case BL_MER: return BL_UCCAST(BL_MER, bl)->mercenary.class_; + case BL_NPC: return BL_UCCAST(BL_NPC, bl)->class_; + case BL_ELEM: return BL_UCCAST(BL_ELEM, bl)->elemental.class_; } return 0; } @@ -6220,16 +6268,17 @@ int status_get_class(struct block_list *bl) { * 1 = fail * level = success *------------------------------------------*/ -int status_get_lv(struct block_list *bl) { +int status_get_lv(struct block_list *bl) +{ nullpo_ret(bl); switch (bl->type) { - case BL_PC: return ((TBL_PC*)bl)->status.base_level; - case BL_MOB: return ((TBL_MOB*)bl)->level; - case BL_PET: return ((TBL_PET*)bl)->pet.level; - case BL_HOM: return ((TBL_HOM*)bl)->homunculus.level; - case BL_MER: return ((TBL_MER*)bl)->db->lv; - case BL_ELEM: return ((TBL_ELEM*)bl)->db->lv; - case BL_NPC: return ((TBL_NPC*)bl)->level; + case BL_PC: return BL_UCCAST(BL_PC, bl)->status.base_level; + case BL_MOB: return BL_UCCAST(BL_MOB, bl)->level; + case BL_PET: return BL_UCCAST(BL_PET, bl)->pet.level; + case BL_HOM: return BL_UCCAST(BL_HOM, bl)->homunculus.level; + case BL_MER: return BL_UCCAST(BL_MER, bl)->db->lv; + case BL_ELEM: return BL_UCCAST(BL_ELEM, bl)->db->lv; + case BL_NPC: return BL_UCCAST(BL_NPC, bl)->level; } return 1; } @@ -6238,10 +6287,10 @@ struct regen_data *status_get_regen_data(struct block_list *bl) { nullpo_retr(NULL, bl); switch (bl->type) { - case BL_PC: return &((TBL_PC*)bl)->regen; - case BL_HOM: return &((TBL_HOM*)bl)->regen; - case BL_MER: return &((TBL_MER*)bl)->regen; - case BL_ELEM: return &((TBL_ELEM*)bl)->regen; + case BL_PC: return &BL_UCAST(BL_PC, bl)->regen; + case BL_HOM: return &BL_UCAST(BL_HOM, bl)->regen; + case BL_MER: return &BL_UCAST(BL_MER, bl)->regen; + case BL_ELEM: return &BL_UCAST(BL_ELEM, bl)->regen; default: return NULL; } @@ -6252,13 +6301,17 @@ struct status_data *status_get_status_data(struct block_list *bl) nullpo_retr(&status->dummy, bl); switch (bl->type) { - case BL_PC: return &((TBL_PC*)bl)->battle_status; - case BL_MOB: return &((TBL_MOB*)bl)->status; - case BL_PET: return &((TBL_PET*)bl)->status; - case BL_HOM: return &((TBL_HOM*)bl)->battle_status; - case BL_MER: return &((TBL_MER*)bl)->battle_status; - case BL_ELEM: return &((TBL_ELEM*)bl)->battle_status; - case BL_NPC: return ((mob->db_checkid(((TBL_NPC*)bl)->class_) == 0) ? &((TBL_NPC*)bl)->status : &status->dummy); + case BL_PC: return &BL_UCAST(BL_PC, bl)->battle_status; + case BL_MOB: return &BL_UCAST(BL_MOB, bl)->status; + case BL_PET: return &BL_UCAST(BL_PET, bl)->status; + case BL_HOM: return &BL_UCAST(BL_HOM, bl)->battle_status; + case BL_MER: return &BL_UCAST(BL_MER, bl)->battle_status; + case BL_ELEM: return &BL_UCAST(BL_ELEM, bl)->battle_status; + case BL_NPC: + { + struct npc_data *nd = BL_UCAST(BL_NPC, bl); + return mob->db_checkid(nd->class_) == 0 ? &nd->status : &status->dummy; + } default: return &status->dummy; } @@ -6268,13 +6321,21 @@ struct status_data *status_get_base_status(struct block_list *bl) { nullpo_retr(NULL, bl); switch (bl->type) { - case BL_PC: return &((TBL_PC*)bl)->base_status; - case BL_MOB: return ((TBL_MOB*)bl)->base_status ? ((TBL_MOB*)bl)->base_status : &((TBL_MOB*)bl)->db->status; - case BL_PET: return &((TBL_PET*)bl)->db->status; - case BL_HOM: return &((TBL_HOM*)bl)->base_status; - case BL_MER: return &((TBL_MER*)bl)->base_status; - case BL_ELEM: return &((TBL_ELEM*)bl)->base_status; - case BL_NPC: return ((mob->db_checkid(((TBL_NPC*)bl)->class_) == 0) ? &((TBL_NPC*)bl)->status : NULL); + case BL_PC: return &BL_UCAST(BL_PC, bl)->base_status; + case BL_MOB: + { + struct mob_data *md = BL_UCAST(BL_MOB, bl); + return md->base_status ? md->base_status : &md->db->status; + } + case BL_PET: return &BL_UCAST(BL_PET, bl)->db->status; + case BL_HOM: return &BL_UCAST(BL_HOM, bl)->base_status; + case BL_MER: return &BL_UCAST(BL_MER, bl)->base_status; + case BL_ELEM: return &BL_UCAST(BL_ELEM, bl)->base_status; + case BL_NPC: + { + struct npc_data *nd = BL_UCAST(BL_NPC, bl); + return mob->db_checkid(nd->class_) == 0 ? &nd->status : NULL; + } default: return NULL; } @@ -6290,9 +6351,10 @@ defType status_get_def(struct block_list *bl) { return cap_value(def, DEFTYPE_MIN, DEFTYPE_MAX); } -unsigned short status_get_speed(struct block_list *bl) { - if(bl->type==BL_NPC)//Only BL with speed data but no status_data [Skotlex] - return ((struct npc_data *)bl)->speed; +unsigned short status_get_speed(struct block_list *bl) +{ + if (bl->type == BL_NPC) //Only BL with speed data but no status_data [Skotlex] + return BL_UCCAST(BL_NPC, bl)->speed; return status->get_status_data(bl)->speed; } @@ -6300,81 +6362,118 @@ int status_get_party_id(struct block_list *bl) { nullpo_ret(bl); switch (bl->type) { case BL_PC: - return ((TBL_PC*)bl)->status.party_id; + return BL_UCCAST(BL_PC, bl)->status.party_id; case BL_PET: - if (((TBL_PET*)bl)->msd) - return ((TBL_PET*)bl)->msd->status.party_id; + { + const struct pet_data *pd = BL_UCCAST(BL_PET, bl); + if (pd->msd != NULL) + return pd->msd->status.party_id; + } break; - case BL_MOB: { - struct mob_data *md=(TBL_MOB*)bl; - if( md->master_id > 0 ) { - struct map_session_data *msd; + case BL_MOB: + { + const struct mob_data *md = BL_UCCAST(BL_MOB, bl); + if (md->master_id > 0) { + const struct map_session_data *msd = NULL; if (md->special_state.ai != AI_NONE && (msd = map->id2sd(md->master_id)) != NULL) return msd->status.party_id; return -md->master_id; } - } - break; + } + break; case BL_HOM: - if (((TBL_HOM*)bl)->master) - return ((TBL_HOM*)bl)->master->status.party_id; + { + const struct homun_data *hd = BL_UCCAST(BL_HOM, bl); + if (hd->master != NULL) + return hd->master->status.party_id; + } break; case BL_MER: - if (((TBL_MER*)bl)->master) - return ((TBL_MER*)bl)->master->status.party_id; + { + const struct mercenary_data *mc = BL_UCCAST(BL_MER, bl); + if (mc->master != NULL) + return mc->master->status.party_id; + } break; case BL_SKILL: - if (((TBL_SKILL*)bl)->group) - return ((TBL_SKILL*)bl)->group->party_id; + { + const struct skill_unit *su = BL_UCCAST(BL_SKILL, bl); + if (su->group != NULL) + return su->group->party_id; + } break; case BL_ELEM: - if (((TBL_ELEM*)bl)->master) - return ((TBL_ELEM*)bl)->master->status.party_id; + { + const struct elemental_data *ed = BL_UCCAST(BL_ELEM, bl); + if (ed->master != NULL) + return ed->master->status.party_id; + } break; } return 0; } -int status_get_guild_id(struct block_list *bl) { +int status_get_guild_id(struct block_list *bl) +{ nullpo_ret(bl); switch (bl->type) { case BL_PC: - return ((TBL_PC*)bl)->status.guild_id; + return BL_UCCAST(BL_PC, bl)->status.guild_id; case BL_PET: - if (((TBL_PET*)bl)->msd) - return ((TBL_PET*)bl)->msd->status.guild_id; + { + const struct pet_data *pd = BL_UCCAST(BL_PET, bl); + if (pd->msd != NULL) + return pd->msd->status.guild_id; + } break; case BL_MOB: { - struct map_session_data *msd; - struct mob_data *md = (struct mob_data *)bl; - if( md->guardian_data ) { //Guardian's guild [Skotlex] + const struct mob_data *md = BL_UCCAST(BL_MOB, bl); + const struct map_session_data *msd = NULL; + if (md->guardian_data != NULL) { //Guardian's guild [Skotlex] // Guardian guild data may not been available yet, castle data is always set - return (md->guardian_data->g)?md->guardian_data->g->guild_id:md->guardian_data->castle->guild_id; + if (md->guardian_data->g != NULL) + return md->guardian_data->g->guild_id; + return md->guardian_data->castle->guild_id; } if (md->special_state.ai != AI_NONE && (msd = map->id2sd(md->master_id)) != NULL) return msd->status.guild_id; //Alchemist's mobs [Skotlex] break; } case BL_HOM: - if (((TBL_HOM*)bl)->master) - return ((TBL_HOM*)bl)->master->status.guild_id; + { + const struct homun_data *hd = BL_UCCAST(BL_HOM, bl); + if (hd->master != NULL) + return hd->master->status.guild_id; + } break; case BL_MER: - if (((TBL_MER*)bl)->master) - return ((TBL_MER*)bl)->master->status.guild_id; + { + const struct mercenary_data *mc = BL_UCCAST(BL_MER, bl); + if (mc->master != NULL) + return mc->master->status.guild_id; + } break; case BL_NPC: - if (((TBL_NPC*)bl)->subtype == SCRIPT) - return ((TBL_NPC*)bl)->u.scr.guild_id; + { + const struct npc_data *nd = BL_UCCAST(BL_NPC, bl); + if (nd->subtype == SCRIPT) + return nd->u.scr.guild_id; + } break; case BL_SKILL: - if (((TBL_SKILL*)bl)->group) - return ((TBL_SKILL*)bl)->group->guild_id; + { + const struct skill_unit *su = BL_UCCAST(BL_SKILL, bl); + if (su->group != NULL) + return su->group->guild_id; + } break; case BL_ELEM: - if (((TBL_ELEM*)bl)->master) - return ((TBL_ELEM*)bl)->master->status.guild_id; + { + const struct elemental_data *ed = BL_UCCAST(BL_ELEM, bl); + if (ed->master != NULL) + return ed->master->status.guild_id; + } break; } return 0; @@ -6384,38 +6483,58 @@ int status_get_emblem_id(struct block_list *bl) { nullpo_ret(bl); switch (bl->type) { case BL_PC: - return ((TBL_PC*)bl)->guild_emblem_id; + return BL_UCCAST(BL_PC, bl)->guild_emblem_id; case BL_PET: - if (((TBL_PET*)bl)->msd) - return ((TBL_PET*)bl)->msd->guild_emblem_id; + { + const struct pet_data *pd = BL_UCCAST(BL_PET, bl); + if (pd->msd != NULL) + return pd->msd->guild_emblem_id; + } break; - case BL_MOB: { - struct map_session_data *msd; - struct mob_data *md = (struct mob_data *)bl; - if (md->guardian_data) //Guardian's guild [Skotlex] - return (md->guardian_data->g) ? md->guardian_data->g->emblem_id:0; + case BL_MOB: + { + const struct mob_data *md = BL_UCCAST(BL_MOB, bl); + const struct map_session_data *msd = NULL; + if (md->guardian_data != NULL) { + //Guardian's guild [Skotlex] + if (md->guardian_data->g != NULL) + return md->guardian_data->g->emblem_id; + return 0; + } if (md->special_state.ai != AI_NONE && (msd = map->id2sd(md->master_id)) != NULL) return msd->guild_emblem_id; //Alchemist's mobs [Skotlex] - } - break; + } + break; case BL_HOM: - if (((TBL_HOM*)bl)->master) - return ((TBL_HOM*)bl)->master->guild_emblem_id; + { + const struct homun_data *hd = BL_UCCAST(BL_HOM, bl); + if (hd->master) + return hd->master->guild_emblem_id; + } break; case BL_MER: - if (((TBL_MER*)bl)->master) - return ((TBL_MER*)bl)->master->guild_emblem_id; + { + const struct mercenary_data *mc = BL_UCCAST(BL_MER, bl); + if (mc->master) + return mc->master->guild_emblem_id; + } break; case BL_NPC: - if (((TBL_NPC*)bl)->subtype == SCRIPT && ((TBL_NPC*)bl)->u.scr.guild_id > 0) { - struct guild *g = guild->search(((TBL_NPC*)bl)->u.scr.guild_id); - if (g) + { + const struct npc_data *nd = BL_UCCAST(BL_NPC, bl); + if (nd->subtype == SCRIPT && nd->u.scr.guild_id > 0) { + struct guild *g = guild->search(nd->u.scr.guild_id); + if (g != NULL) return g->emblem_id; } + } break; case BL_ELEM: - if (((TBL_ELEM*)bl)->master) - return ((TBL_ELEM*)bl)->master->guild_emblem_id; + { + const struct elemental_data *ed = BL_UCCAST(BL_ELEM, bl); + if (ed->master) + return ed->master->guild_emblem_id; + } break; } return 0; @@ -6424,19 +6543,20 @@ int status_get_emblem_id(struct block_list *bl) { int status_get_mexp(struct block_list *bl) { nullpo_ret(bl); - if(bl->type==BL_MOB) - return ((struct mob_data *)bl)->db->mexp; - if(bl->type==BL_PET) - return ((struct pet_data *)bl)->db->mexp; + if (bl->type == BL_MOB) + return BL_UCCAST(BL_MOB, bl)->db->mexp; + if (bl->type == BL_PET) + return BL_UCCAST(BL_PET, bl)->db->mexp; return 0; } + int status_get_race2(struct block_list *bl) { nullpo_ret(bl); - if(bl->type == BL_MOB) - return ((struct mob_data *)bl)->db->race2; - if(bl->type==BL_PET) - return ((struct pet_data *)bl)->db->race2; + if (bl->type == BL_MOB) + return BL_UCCAST(BL_MOB, bl)->db->race2; + if (bl->type == BL_PET) + return BL_UCCAST(BL_PET, bl)->db->race2; return 0; } @@ -6445,28 +6565,34 @@ int status_isdead(struct block_list *bl) { return status->get_status_data(bl)->hp == 0; } -int status_isimmune(struct block_list *bl) { - struct status_change *sc = status->get_sc(bl); - if (sc && sc->data[SC_HERMODE]) +int status_isimmune(struct block_list *bl) +{ + struct status_change *sc = NULL; + nullpo_ret(bl); + sc = status->get_sc(bl); + + if (sc != NULL && sc->data[SC_HERMODE] != NULL) return 100; - if (bl->type == BL_PC && - ((TBL_PC*)bl)->special_state.no_magic_damage >= battle_config.gtb_sc_immunity) - return ((TBL_PC*)bl)->special_state.no_magic_damage; + if (bl->type == BL_PC) { + const struct map_session_data *sd = BL_UCCAST(BL_PC, bl); + if (sd->special_state.no_magic_damage >= battle_config.gtb_sc_immunity) + return sd->special_state.no_magic_damage; + } return 0; } -struct view_data* status_get_viewdata(struct block_list *bl) +struct view_data *status_get_viewdata(struct block_list *bl) { nullpo_retr(NULL, bl); switch (bl->type) { - case BL_PC: return &((TBL_PC*)bl)->vd; - case BL_MOB: return ((TBL_MOB*)bl)->vd; - case BL_PET: return &((TBL_PET*)bl)->vd; - case BL_NPC: return ((TBL_NPC*)bl)->vd; - case BL_HOM: return ((TBL_HOM*)bl)->vd; - case BL_MER: return ((TBL_MER*)bl)->vd; - case BL_ELEM: return ((TBL_ELEM*)bl)->vd; + case BL_PC: return &BL_UCAST(BL_PC, bl)->vd; + case BL_MOB: return BL_UCAST(BL_MOB, bl)->vd; + case BL_PET: return &BL_UCAST(BL_PET, bl)->vd; + case BL_NPC: return BL_UCAST(BL_NPC, bl)->vd; + case BL_HOM: return BL_UCAST(BL_HOM, bl)->vd; + case BL_MER: return BL_UCAST(BL_MER, bl)->vd; + case BL_ELEM: return BL_UCAST(BL_ELEM, bl)->vd; } return NULL; } @@ -6490,142 +6616,147 @@ void status_set_viewdata(struct block_list *bl, int class_) switch (bl->type) { case BL_PC: - { - TBL_PC* sd = (TBL_PC*)bl; - if (pc->db_checkid(class_)) { - if (pc_isridingpeco(sd)) { - switch (class_) { - //Adapt class to a Mounted one. - case JOB_KNIGHT: - class_ = JOB_KNIGHT2; - break; - case JOB_CRUSADER: - class_ = JOB_CRUSADER2; - break; - case JOB_LORD_KNIGHT: - class_ = JOB_LORD_KNIGHT2; - break; - case JOB_PALADIN: - class_ = JOB_PALADIN2; - break; - case JOB_BABY_KNIGHT: - class_ = JOB_BABY_KNIGHT2; - break; - case JOB_BABY_CRUSADER: - class_ = JOB_BABY_CRUSADER2; - break; - } - } - sd->vd.class_ = class_; - clif->get_weapon_view(sd, &sd->vd.weapon, &sd->vd.shield); - sd->vd.head_top = sd->status.head_top; - sd->vd.head_mid = sd->status.head_mid; - sd->vd.head_bottom = sd->status.head_bottom; - sd->vd.hair_style = cap_value(sd->status.hair,0,battle_config.max_hair_style); - sd->vd.hair_color = cap_value(sd->status.hair_color,0,battle_config.max_hair_color); - sd->vd.cloth_color = cap_value(sd->status.clothes_color,0,battle_config.max_cloth_color); - sd->vd.robe = sd->status.robe; - sd->vd.body_style = sd->status.body; - sd->vd.sex = sd->status.sex; - - if ( sd->vd.cloth_color ) { - if( sd->sc.option&OPTION_WEDDING && battle_config.wedding_ignorepalette ) - sd->vd.cloth_color = 0; - if( sd->sc.option&OPTION_XMAS && battle_config.xmas_ignorepalette ) - sd->vd.cloth_color = 0; - if( sd->sc.option&OPTION_SUMMER && battle_config.summer_ignorepalette ) - sd->vd.cloth_color = 0; - if( sd->sc.option&OPTION_HANBOK && battle_config.hanbok_ignorepalette ) - sd->vd.cloth_color = 0; - if( sd->sc.option&OPTION_OKTOBERFEST /* TODO: config? */ ) - sd->vd.cloth_color = 0; + { + struct map_session_data *sd = BL_UCAST(BL_PC, bl); + if (pc->db_checkid(class_)) { + if (pc_isridingpeco(sd)) { + switch (class_) { + //Adapt class to a Mounted one. + case JOB_KNIGHT: + class_ = JOB_KNIGHT2; + break; + case JOB_CRUSADER: + class_ = JOB_CRUSADER2; + break; + case JOB_LORD_KNIGHT: + class_ = JOB_LORD_KNIGHT2; + break; + case JOB_PALADIN: + class_ = JOB_PALADIN2; + break; + case JOB_BABY_KNIGHT: + class_ = JOB_BABY_KNIGHT2; + break; + case JOB_BABY_CRUSADER: + class_ = JOB_BABY_CRUSADER2; + break; } - if ( sd->vd.body_style && ( - sd->sc.option&OPTION_WEDDING || sd->sc.option&OPTION_XMAS || - sd->sc.option&OPTION_SUMMER || sd->sc.option&OPTION_HANBOK || - sd->sc.option&OPTION_OKTOBERFEST)) - sd->vd.body_style = 0; - } else if (vd) - memcpy(&sd->vd, vd, sizeof(struct view_data)); - else - ShowError("status_set_viewdata (PC): No view data for class %d\n", class_); + } + sd->vd.class_ = class_; + clif->get_weapon_view(sd, &sd->vd.weapon, &sd->vd.shield); + sd->vd.head_top = sd->status.head_top; + sd->vd.head_mid = sd->status.head_mid; + sd->vd.head_bottom = sd->status.head_bottom; + sd->vd.hair_style = cap_value(sd->status.hair,0,battle_config.max_hair_style); + sd->vd.hair_color = cap_value(sd->status.hair_color,0,battle_config.max_hair_color); + sd->vd.cloth_color = cap_value(sd->status.clothes_color,0,battle_config.max_cloth_color); + sd->vd.robe = sd->status.robe; + sd->vd.body_style = sd->status.body; + sd->vd.sex = sd->status.sex; + + if (sd->vd.cloth_color) { + if (sd->sc.option&OPTION_WEDDING && battle_config.wedding_ignorepalette) + sd->vd.cloth_color = 0; + if (sd->sc.option&OPTION_XMAS && battle_config.xmas_ignorepalette) + sd->vd.cloth_color = 0; + if (sd->sc.option&OPTION_SUMMER && battle_config.summer_ignorepalette) + sd->vd.cloth_color = 0; + if (sd->sc.option&OPTION_HANBOK && battle_config.hanbok_ignorepalette) + sd->vd.cloth_color = 0; + if (sd->sc.option&OPTION_OKTOBERFEST /* TODO: config? */) + sd->vd.cloth_color = 0; + } + if (sd->vd.body_style + && (sd->sc.option&OPTION_WEDDING + || sd->sc.option&OPTION_XMAS + || sd->sc.option&OPTION_SUMMER + || sd->sc.option&OPTION_HANBOK + || sd->sc.option&OPTION_OKTOBERFEST)) + sd->vd.body_style = 0; + } else if (vd != NULL) { + memcpy(&sd->vd, vd, sizeof(struct view_data)); + } else { + ShowError("status_set_viewdata (PC): No view data for class %d\n", class_); } + } break; case BL_MOB: - { - TBL_MOB* md = (TBL_MOB*)bl; - if (vd) - md->vd = vd; - else - ShowError("status_set_viewdata (MOB): No view data for class %d\n", class_); - } + { + struct mob_data *md = BL_UCAST(BL_MOB, bl); + if (vd != NULL) + md->vd = vd; + else + ShowError("status_set_viewdata (MOB): No view data for class %d\n", class_); + } break; case BL_PET: - { - TBL_PET* pd = (TBL_PET*)bl; - if (vd) { - memcpy(&pd->vd, vd, sizeof(struct view_data)); - if (!pc->db_checkid(vd->class_)) { - pd->vd.hair_style = battle_config.pet_hair_style; - if(pd->pet.equip) { - pd->vd.head_bottom = itemdb_viewid(pd->pet.equip); - if (!pd->vd.head_bottom) - pd->vd.head_bottom = pd->pet.equip; - } + { + struct pet_data *pd = BL_UCAST(BL_PET, bl); + if (vd != NULL) { + memcpy(&pd->vd, vd, sizeof(struct view_data)); + if (!pc->db_checkid(vd->class_)) { + pd->vd.hair_style = battle_config.pet_hair_style; + if(pd->pet.equip) { + pd->vd.head_bottom = itemdb_viewid(pd->pet.equip); + if (!pd->vd.head_bottom) + pd->vd.head_bottom = pd->pet.equip; } - } else - ShowError("status_set_viewdata (PET): No view data for class %d\n", class_); + } + } else { + ShowError("status_set_viewdata (PET): No view data for class %d\n", class_); } + } break; case BL_NPC: - { - TBL_NPC* nd = (TBL_NPC*)bl; - if (vd) - nd->vd = vd; - else - ShowError("status_set_viewdata (NPC): No view data for class %d (name=%s)\n", class_, nd->name); - } + { + struct npc_data *nd = BL_UCAST(BL_NPC, bl); + if (vd != NULL) + nd->vd = vd; + else + ShowError("status_set_viewdata (NPC): No view data for class %d (name=%s)\n", class_, nd->name); + } break; case BL_HOM: //[blackhole89] - { - struct homun_data *hd = (struct homun_data*)bl; - if (vd) - hd->vd = vd; - else - ShowError("status_set_viewdata (HOMUNCULUS): No view data for class %d\n", class_); - } + { + struct homun_data *hd = BL_UCAST(BL_HOM, bl); + if (vd != NULL) + hd->vd = vd; + else + ShowError("status_set_viewdata (HOMUNCULUS): No view data for class %d\n", class_); + } break; case BL_MER: - { - struct mercenary_data *md = (struct mercenary_data*)bl; - if (vd) - md->vd = vd; - else - ShowError("status_set_viewdata (MERCENARY): No view data for class %d\n", class_); - } + { + struct mercenary_data *md = BL_UCAST(BL_MER, bl); + if (vd != NULL) + md->vd = vd; + else + ShowError("status_set_viewdata (MERCENARY): No view data for class %d\n", class_); + } break; case BL_ELEM: - { - struct elemental_data *ed = (struct elemental_data*)bl; - if (vd) - ed->vd = vd; - else - ShowError("status_set_viewdata (ELEMENTAL): No view data for class %d\n", class_); - } + { + struct elemental_data *ed = BL_UCAST(BL_ELEM, bl); + if (vd != NULL) + ed->vd = vd; + else + ShowError("status_set_viewdata (ELEMENTAL): No view data for class %d\n", class_); + } break; } } /// Returns the status_change data of bl or NULL if it doesn't exist. -struct status_change *status_get_sc(struct block_list *bl) { - if( bl ) { +struct status_change *status_get_sc(struct block_list *bl) +{ + if (bl != NULL) { switch (bl->type) { - case BL_PC: return &((TBL_PC*)bl)->sc; - case BL_MOB: return &((TBL_MOB*)bl)->sc; + case BL_PC: return &BL_UCAST(BL_PC, bl)->sc; + case BL_MOB: return &BL_UCAST(BL_MOB, bl)->sc; case BL_NPC: return NULL; - case BL_HOM: return &((TBL_HOM*)bl)->sc; - case BL_MER: return &((TBL_MER*)bl)->sc; - case BL_ELEM: return &((TBL_ELEM*)bl)->sc; + case BL_HOM: return &BL_UCAST(BL_HOM, bl)->sc; + case BL_MER: return &BL_UCAST(BL_MER, bl)->sc; + case BL_ELEM: return &BL_UCAST(BL_ELEM, bl)->sc; } } return NULL; @@ -6876,13 +7007,13 @@ int status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_typ sc_def = (st->vit + st->luk)*20; break; case SC_SIREN: - tick_def2 = (status->get_lv(bl) * 100) + ((bl->type == BL_PC)?((TBL_PC*)bl)->status.job_level : 0); + tick_def2 = status->get_lv(bl) * 100 + (bl->type == BL_PC ? BL_UCCAST(BL_PC, bl)->status.job_level : 0); break; case SC_NEEDLE_OF_PARALYZE: tick_def2 = (st->vit + st->luk) * 50; break; case SC_NETHERWORLD: - tick_def2 = 1000 * (((bl->type == BL_PC) ? ((TBL_PC*)bl)->status.job_level : 0) / 10 + status->get_lv(bl) / 50); + tick_def2 = 1000 * ((bl->type == BL_PC ? BL_UCCAST(BL_PC, bl)->status.job_level : 0) / 10 + status->get_lv(bl) / 50); break; default: //Effect that cannot be reduced? Likely a buff. @@ -7894,8 +8025,11 @@ int status_change_start(struct block_list *src, struct block_list *bl, enum sc_t if (sd->devotion[i] && (tsd = map->id2sd(sd->devotion[i])) != NULL) status->change_start(bl, &tsd->bl, type, 10000, val1, val2, val3, val4, tick, SCFLAG_ALL); } - } else if (bl->type == BL_MER && ((TBL_MER*)bl)->devotion_flag && (tsd = ((TBL_MER*)bl)->master) != NULL) { - status->change_start(bl, &tsd->bl, type, 10000, val1, val2, val3, val4, tick, SCFLAG_ALL); + } else if (bl->type == BL_MER) { + struct mercenary_data *mc = BL_UCAST(BL_MER, bl); + if (mc->devotion_flag && (tsd = mc->master) != NULL) { + status->change_start(bl, &tsd->bl, type, 10000, val1, val2, val3, val4, tick, SCFLAG_ALL); + } } } //val4 signals infinite endure (if val4 == 2 it is infinite endure from Berserk) @@ -7994,8 +8128,11 @@ int status_change_start(struct block_list *src, struct block_list *bl, enum sc_t if (sd->devotion[i] && (tsd = map->id2sd(sd->devotion[i])) != NULL) status->change_start(bl, &tsd->bl, type, 10000, val1, val2, 0, 0, tick, SCFLAG_ALL); } - } else if (bl->type == BL_MER && ((TBL_MER*)bl)->devotion_flag && (tsd = ((TBL_MER*)bl)->master) != NULL) { - status->change_start(bl, &tsd->bl, type, 10000, val1, val2, 0, 0, tick, SCFLAG_ALL); + } else if (bl->type == BL_MER) { + struct mercenary_data *mc = BL_UCAST(BL_MER, bl); + if (mc->devotion_flag && (tsd = mc->master) != NULL) { + status->change_start(bl, &tsd->bl, type, 10000, val1, val2, 0, 0, tick, SCFLAG_ALL); + } } } break; @@ -8137,7 +8274,7 @@ int status_change_start(struct block_list *src, struct block_list *bl, enum sc_t if( val2 && bl->type == BL_MOB ) { struct block_list* src2 = map->id2bl(val2); if( src2 ) - mob->log_damage((TBL_MOB*)bl,src2,diff); + mob->log_damage(BL_UCAST(BL_MOB, bl), src2, diff); } status_zap(bl, diff, 0); } @@ -8211,7 +8348,7 @@ int status_change_start(struct block_list *src, struct block_list *bl, enum sc_t //val4&1 signals the presence of a wall. //val4&2 makes cloak not end on normal attacks [Skotlex] //val4&4 makes cloak not end on using skills - if (bl->type == BL_PC || (bl->type == BL_MOB && ((TBL_MOB*)bl)->special_state.clone) ) //Standard cloaking. + if (bl->type == BL_PC || (bl->type == BL_MOB && BL_UCCAST(BL_MOB, bl)->special_state.clone)) //Standard cloaking. val4 |= battle_config.pc_cloak_check_type&7; else val4 |= battle_config.monster_cloak_check_type&7; @@ -8255,9 +8392,11 @@ int status_change_start(struct block_list *src, struct block_list *bl, enum sc_t if (sd->devotion[i] && (tsd = map->id2sd(sd->devotion[i])) != NULL) status->change_start(bl, &tsd->bl, type, 10000, val1, val2, 0, 0, tick, SCFLAG_ALL); } - } - else if (bl->type == BL_MER && ((TBL_MER*)bl)->devotion_flag && (tsd = ((TBL_MER*)bl)->master) != NULL) { - status->change_start(bl, &tsd->bl, type, 10000, val1, val2, 0, 0, tick, SCFLAG_ALL); + } else if (bl->type == BL_MER) { + struct mercenary_data *mc = BL_UCAST(BL_MER, bl); + if (mc->devotion_flag && (tsd = mc->master) != NULL) { + status->change_start(bl, &tsd->bl, type, 10000, val1, val2, 0, 0, tick, SCFLAG_ALL); + } } } } @@ -8432,7 +8571,7 @@ int status_change_start(struct block_list *src, struct block_list *bl, enum sc_t if( val3 && bl->type == BL_MOB ) { struct block_list* src2 = map->id2bl(val3); if( src2 ) - mob->log_damage((TBL_MOB*)bl,src2,st->hp - 1); + mob->log_damage(BL_UCAST(BL_MOB, bl), src2, st->hp - 1); } status_zap(bl, st->hp-1, val2 ? 0 : st->sp); return 1; @@ -10205,11 +10344,14 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const if (sd->devotion[i] && (tsd = map->id2sd(sd->devotion[i])) != NULL && tsd->sc.data[type]) status_change_end(&tsd->bl, type, INVALID_TIMER); } - } else if( bl->type == BL_MER && ((TBL_MER*)bl)->devotion_flag ) { - // Clear Status from Master - tsd = ((TBL_MER*)bl)->master; - if( tsd && tsd->sc.data[type] ) - status_change_end(&tsd->bl, type, INVALID_TIMER); + } else if (bl->type == BL_MER) { + struct mercenary_data *mc = BL_UCAST(BL_MER, bl); + if (mc->devotion_flag) { + // Clear Status from Master + tsd = mc->master; + if (tsd != NULL && tsd->sc.data[type] != NULL) + status_change_end(&tsd->bl, type, INVALID_TIMER); + } } } break; @@ -10217,10 +10359,10 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const { struct block_list *d_bl = map->id2bl(sce->val1); if( d_bl ) { - if( d_bl->type == BL_PC ) - ((TBL_PC*)d_bl)->devotion[sce->val2] = 0; - else if( d_bl->type == BL_MER ) - ((TBL_MER*)d_bl)->devotion_flag = 0; + if (d_bl->type == BL_PC) + BL_UCAST(BL_PC, d_bl)->devotion[sce->val2] = 0; + else if (d_bl->type == BL_MER) + BL_UCAST(BL_MER, d_bl)->devotion_flag = 0; clif->devotion(d_bl, NULL); } @@ -10975,8 +11117,8 @@ int status_change_timer(int tid, int64 tick, int id, intptr_t data) { if (!sc->data[SC_SLOWPOISON]) { if( sce->val2 && bl->type == BL_MOB ) { struct block_list* src = map->id2bl(sce->val2); - if( src ) - mob->log_damage((TBL_MOB*)bl,src,sce->val4); + if (src != NULL) + mob->log_damage(BL_UCAST(BL_MOB, bl), src, sce->val4); } map->freeblock_lock(); status_zap(bl, sce->val4, 0); @@ -11015,7 +11157,7 @@ int status_change_timer(int tid, int64 tick, int id, intptr_t data) { int hp = rnd()%600 + 200; struct block_list* src = map->id2bl(sce->val2); if( src && bl && bl->type == BL_MOB ) { - mob->log_damage((TBL_MOB*)bl,src,sd||hp<st->hp?hp:st->hp-1); + mob->log_damage(BL_UCAST(BL_MOB, bl), src, sd != NULL || hp < st->hp ? hp : st->hp-1); } map->freeblock_lock(); status_fix_damage(src, bl, sd||hp<st->hp?hp:st->hp-1, 1); @@ -11760,9 +11902,12 @@ int status_change_timer_sub(struct block_list* bl, va_list ap) { if (battle->check_target( src, bl, BCT_ENEMY ) > 0 && status->check_skilluse(src, bl, WZ_SIGHTBLASTER, 2) ) { - struct skill_unit *su = (struct skill_unit *)bl; - if (sce && skill->attack(BF_MAGIC,src,src,bl,WZ_SIGHTBLASTER,sce->val1,tick,0x4000) - && (!su || !su->group || !(skill->get_inf2(su->group->skill_id)&INF2_TRAP))) { // The hit is not counted if it's against a trap + const struct skill_unit *su = BL_CCAST(BL_SKILL, bl); + if (sce != NULL + && skill->attack(BF_MAGIC,src,src,bl,WZ_SIGHTBLASTER,sce->val1,tick,0x4000) + && (su == NULL || su->group == NULL || !(skill->get_inf2(su->group->skill_id)&INF2_TRAP)) + ) { + // The hit is not counted if it's against a trap sce->val2 = 0; // This signals it to end. } else if ((bl->type&BL_SKILL) && sce && sce->val4%2 == 0) { //Remove trap immunity temporarily so it triggers if you still stand on it @@ -11828,7 +11973,7 @@ int status_get_weapon_atk(struct block_list *bl, struct weapon_atk *watk, int fl } if ( bl->type == BL_PC && !(flag & 2) ) { - struct map_session_data *sd = (struct map_session_data *)bl; + const struct map_session_data *sd = BL_UCCAST(BL_PC, bl); short index = sd->equip_index[EQI_HAND_R], refine; if ( index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == IT_WEAPON && (refine = sd->status.inventory[index].refine) < 16 && refine ) { @@ -11899,16 +12044,25 @@ void status_get_matk_sub(struct block_list *bl, int flag, unsigned short *matk_m } break; case BL_MER: - *matk_min += 70 * ((TBL_MER*)bl)->battle_status.rhw.atk2 / 100; - *matk_max += 130 * ((TBL_MER*)bl)->battle_status.rhw.atk2 / 100; + { + const struct mercenary_data *mc = BL_UCCAST(BL_MER, bl); + *matk_min += 70 * mc->battle_status.rhw.atk2 / 100; + *matk_max += 130 * mc->battle_status.rhw.atk2 / 100; + } break; case BL_MOB: - *matk_min += 70 * ((TBL_MOB*)bl)->status.rhw.atk2 / 100; - *matk_max += 130 * ((TBL_MOB*)bl)->status.rhw.atk2 / 100; + { + const struct mob_data *md = BL_UCCAST(BL_MOB, bl); + *matk_min += 70 * md->status.rhw.atk2 / 100; + *matk_max += 130 * md->status.rhw.atk2 / 100; + } break; case BL_HOM: - *matk_min += (status_get_homint(bl) + status_get_homdex(bl)) / 5; - *matk_max += (status_get_homluk(bl) + status_get_homint(bl) + status_get_homdex(bl)) / 3; + { + const struct homun_data *hd = BL_UCCAST(BL_HOM, bl); + *matk_min += (status_get_homint(st, hd) + status_get_homdex(st, hd)) / 5; + *matk_max += (status_get_homluk(st, hd) + status_get_homint(st, hd) + status_get_homdex(st, hd)) / 3; + } break; } @@ -11944,6 +12098,13 @@ void status_get_matk_sub(struct block_list *bl, int flag, unsigned short *matk_m return; } +#undef status_get_homstr +#undef status_get_homagi +#undef status_get_homvit +#undef status_get_homint +#undef status_get_homdex +#undef status_get_homluk + /** * Gets a random matk value depending on min matk and max matk **/ diff --git a/src/map/status.h b/src/map/status.h index 55df4cdab..51ca1e78b 100644 --- a/src/map/status.h +++ b/src/map/status.h @@ -2123,13 +2123,6 @@ struct status_change { #define status_get_size(bl) (status->get_status_data(bl)->size) #define status_get_mode(bl) (status->get_status_data(bl)->mode) -#define status_get_homstr(bl) (st->str + ((TBL_HOM*)bl)->homunculus.str_value) -#define status_get_homagi(bl) (st->agi + ((TBL_HOM*)bl)->homunculus.agi_value) -#define status_get_homvit(bl) (st->vit + ((TBL_HOM*)bl)->homunculus.vit_value) -#define status_get_homint(bl) (st->int_ + ((TBL_HOM*)bl)->homunculus.int_value) -#define status_get_homdex(bl) (st->dex + ((TBL_HOM*)bl)->homunculus.dex_value) -#define status_get_homluk(bl) (st->luk + ((TBL_HOM*)bl)->homunculus.luk_value) - //Short version, receives rate in 1->100 range, and does not uses a flag setting. #define sc_start(src, bl, type, rate, val1, tick) (status->change_start((src),(bl),(type),100*(rate),(val1),0,0,0,(tick),SCFLAG_NONE)) #define sc_start2(src, bl, type, rate, val1, val2, tick) (status->change_start((src),(bl),(type),100*(rate),(val1),(val2),0,0,(tick),SCFLAG_NONE)) diff --git a/src/map/unit.c b/src/map/unit.c index 4c5254373..03334f7f3 100644 --- a/src/map/unit.c +++ b/src/map/unit.c @@ -73,15 +73,16 @@ struct unit_interface *unit; * @param bl block_list to process * @return a pointer to the given object's unit_data **/ -struct unit_data* unit_bl2ud(struct block_list *bl) { - if( bl == NULL) return NULL; - if( bl->type == BL_PC) return &((struct map_session_data*)bl)->ud; - if( bl->type == BL_MOB) return &((struct mob_data*)bl)->ud; - if( bl->type == BL_PET) return &((struct pet_data*)bl)->ud; - if( bl->type == BL_NPC) return ((struct npc_data*)bl)->ud; - if( bl->type == BL_HOM) return &((struct homun_data*)bl)->ud; - if( bl->type == BL_MER) return &((struct mercenary_data*)bl)->ud; - if( bl->type == BL_ELEM) return &((struct elemental_data*)bl)->ud; +struct unit_data* unit_bl2ud(struct block_list *bl) +{ + if (bl == NULL) return NULL; + if (bl->type == BL_PC) return &BL_UCAST(BL_PC, bl)->ud; + if (bl->type == BL_MOB) return &BL_UCAST(BL_MOB, bl)->ud; + if (bl->type == BL_PET) return &BL_UCAST(BL_PET, bl)->ud; + if (bl->type == BL_NPC) return BL_UCAST(BL_NPC, bl)->ud; + if (bl->type == BL_HOM) return &BL_UCAST(BL_HOM, bl)->ud; + if (bl->type == BL_MER) return &BL_UCAST(BL_MER, bl)->ud; + if (bl->type == BL_ELEM) return &BL_UCAST(BL_ELEM, bl)->ud; return NULL; } @@ -92,9 +93,10 @@ struct unit_data* unit_bl2ud(struct block_list *bl) { * @param bl block_list to process * @return a pointer to the given object's unit_data */ -struct unit_data* unit_bl2ud2(struct block_list *bl) { - if( bl && bl->type == BL_NPC && ((struct npc_data*)bl)->ud == &npc->base_ud ) { - struct npc_data *nd = (struct npc_data *)bl; +struct unit_data *unit_bl2ud2(struct block_list *bl) +{ + struct npc_data *nd = BL_CAST(BL_NPC, bl); + if (nd != NULL && nd->ud == &npc->base_ud) { nd->ud = NULL; CREATE(nd->ud, struct unit_data, 1); unit->dataset(&nd->bl); @@ -148,8 +150,9 @@ int unit_walktoxy_sub(struct block_list *bl) ud->state.change_walk_target=0; if (bl->type == BL_PC) { - ((TBL_PC *)bl)->head_dir = 0; - clif->walkok((TBL_PC*)bl); + struct map_session_data *sd = BL_UCAST(BL_PC, bl); + sd->head_dir = 0; + clif->walkok(sd); } clif->move(ud); @@ -448,7 +451,7 @@ int unit_walktoxy_timer(int tid, int64 tick, int id, intptr_t data) { //Cancel chase. ud->to_x = bl->x; ud->to_y = bl->y; - if (tbl && bl->type == BL_MOB && mob->warpchase((TBL_MOB*)bl, tbl) ) + if (tbl && bl->type == BL_MOB && mob->warpchase(BL_UCAST(BL_MOB, bl), tbl)) return 0; ud->target_to = 0; return 0; @@ -813,7 +816,7 @@ int unit_setdir(struct block_list *bl,unsigned char dir) if (!ud) return 0; ud->dir = dir; if (bl->type == BL_PC) - ((TBL_PC *)bl)->head_dir = 0; + BL_UCAST(BL_PC, bl)->head_dir = 0; clif->changed_dir(bl, AREA); return 0; } @@ -823,7 +826,7 @@ uint8 unit_getdir(struct block_list *bl) { nullpo_ret(bl); if( bl->type == BL_NPC ) - return ((TBL_NPC*)bl)->dir; + return BL_UCCAST(BL_NPC, bl)->dir; ud = unit->bl2ud(bl); if (!ud) return 0; return ud->dir; @@ -917,10 +920,13 @@ int unit_warp(struct block_list *bl,short m,short x,short y,clr_type type) switch (bl->type) { case BL_MOB: - if (map->list[bl->m].flag.monster_noteleport && ((TBL_MOB*)bl)->master_id == 0) + { + const struct mob_data *md = BL_UCCAST(BL_MOB, bl); + if (map->list[bl->m].flag.monster_noteleport && md->master_id == 0) return 1; - if (m != bl->m && map->list[m].flag.nobranch && battle_config.mob_warp&4 && !(((TBL_MOB *)bl)->master_id)) + if (m != bl->m && map->list[m].flag.nobranch && battle_config.mob_warp&4 && md->master_id == 0) return 1; + } break; case BL_PC: if (map->list[bl->m].flag.noteleport) @@ -947,7 +953,7 @@ int unit_warp(struct block_list *bl,short m,short x,short y,clr_type type) } if (bl->type == BL_PC) //Use pc_setpos - return pc->setpos((TBL_PC*)bl, map_id2index(m), x, y, type); + return pc->setpos(BL_UCAST(BL_PC, bl), map_id2index(m), x, y, type); if (!unit->remove_map(bl, type, ALC_MARK)) return 3; @@ -1137,7 +1143,7 @@ int unit_can_move(struct block_list *bl) { int unit_resume_running(int tid, int64 tick, int id, intptr_t data) { struct unit_data *ud = (struct unit_data *)data; - TBL_PC * sd = map->id2sd(id); + struct map_session_data *sd = map->id2sd(id); if(sd && pc_isridingwug(sd)) clif->skill_nodamage(ud->bl,ud->bl,RA_WUGDASH,ud->skill_lv, @@ -1164,7 +1170,7 @@ int unit_set_walkdelay(struct block_list *bl, int64 tick, int delay, int type) { if (type) { //Bosses can ignore skill induced walkdelay (but not damage induced) - if(bl->type == BL_MOB && (((TBL_MOB*)bl)->status.mode&MD_BOSS)) + if (bl->type == BL_MOB && (BL_UCCAST(BL_MOB, bl)->status.mode&MD_BOSS)) return 0; //Make sure walk delay is not decreased if (DIFF_TICK(ud->canmove_tick, tick+delay) > 0) @@ -1256,13 +1262,17 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui break; case WE_MALE: case WE_FEMALE: + { + struct map_session_data *p_sd = NULL; if (!sd->status.partner_id) return 0; - target = (struct block_list*)map->charid2sd(sd->status.partner_id); - if (!target) { + p_sd = map->charid2sd(sd->status.partner_id); + if (p_sd == NULL) { clif->skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); return 0; } + target = &p_sd->bl; + } break; case GC_WEAPONCRUSH: if( sc && sc->data[SC_COMBOATTACK] && sc->data[SC_COMBOATTACK]->val1 == GC_WEAPONBLOCKING ) { @@ -1381,14 +1391,16 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui return 0; } - if( src->type == BL_MOB ) - switch( skill_id ) { + if (src->type == BL_MOB) { + const struct mob_data *src_md = BL_UCCAST(BL_MOB, src); + switch (skill_id) { case NPC_SUMMONSLAVE: case NPC_SUMMONMONSTER: case AL_TELEPORT: - if (((TBL_MOB*)src)->master_id && ((TBL_MOB*)src)->special_state.ai != AI_NONE) + if (src_md->master_id != 0 && src_md->special_state.ai != AI_NONE) return 0; } + } if (src->type == BL_NPC) // NPC-objects can override cast distance range = AREA_SIZE; // Maximum visible distance before NPC goes out of sight @@ -1564,9 +1576,8 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui clif->skillcasting(src, src->id, target_id, 0,0, skill_id, skill->get_ele(skill_id, skill_lv), casttime); if( casttime > 0 || temp ) { - if (sd && target->type == BL_MOB) - { - TBL_MOB *md = (TBL_MOB*)target; + if (sd != NULL && target->type == BL_MOB) { + struct mob_data *md = BL_UCAST(BL_MOB, target); mob->skill_event(md, src, tick, -1); //Cast targeted skill event. if (tstatus->mode&(MD_CASTSENSOR_IDLE|MD_CASTSENSOR_CHASE) && battle->check_target(target, src, BCT_ENEMY) > 0) @@ -1848,10 +1859,10 @@ int unit_unattackable(struct block_list *bl) unit->set_target(ud, 0); } - if(bl->type == BL_MOB) - mob->unlocktarget((struct mob_data*)bl, timer->gettick()) ; - else if(bl->type == BL_PET) - pet->unlocktarget((struct pet_data*)bl); + if (bl->type == BL_MOB) + mob->unlocktarget(BL_UCAST(BL_MOB, bl), timer->gettick()); + else if (bl->type == BL_PET) + pet->unlocktarget(BL_UCAST(BL_PET, bl)); return 0; } @@ -1872,10 +1883,10 @@ int unit_attack(struct block_list *src,int target_id,int continuous) { return 1; } - if( src->type == BL_PC ) { - TBL_PC* sd = (TBL_PC*)src; + if (src->type == BL_PC) { + struct map_session_data *sd = BL_UCAST(BL_PC, src); if( target->type == BL_NPC ) { // monster npcs [Valaris] - npc->click(sd,(TBL_NPC*)target); // submitted by leinsirk10 [Celest] + npc->click(sd, BL_UCAST(BL_NPC, target)); // submitted by leinsirk10 [Celest] return 0; } if( pc_is90overweight(sd) || pc_isridingwug(sd) ) { // overweight or mounted on warg - stop attacking @@ -2086,9 +2097,8 @@ int unit_attack_timer_sub(struct block_list* src, int tid, int64 tick) { ) return 0; // can't attack under these conditions - if( src->m != target->m ) - { - if( src->type == BL_MOB && mob->warpchase((TBL_MOB*)src, target) ) + if (src->m != target->m) { + if (src->type == BL_MOB && mob->warpchase(BL_UCAST(BL_MOB, src), target)) return 1; // Follow up. return 0; } @@ -2161,7 +2171,7 @@ int unit_attack_timer_sub(struct block_list* src, int tid, int64 tick) { map->foreachinrange(mob->linksearch, src, md->db->range2, BL_MOB, md->class_, target, tick); } } - if(src->type == BL_PET && pet->attackskill((TBL_PET*)src, target->id)) + if (src->type == BL_PET && pet->attackskill(BL_UCAST(BL_PET, src), target->id)) return 1; map->freeblock_lock(); @@ -2256,7 +2266,8 @@ int unit_skillcastcancel(struct block_list *bl,int type) } } - if(bl->type==BL_MOB) ((TBL_MOB*)bl)->skill_idx = -1; + if (bl->type == BL_MOB) + BL_UCAST(BL_MOB, bl)->skill_idx = -1; clif->skillcastcancel(bl); return 1; @@ -2311,9 +2322,9 @@ int unit_changeviewsize(struct block_list *bl,short size) size=(size<0)?-1:(size>0)?1:0; if(bl->type == BL_PC) { - ((TBL_PC*)bl)->state.size=size; + BL_UCAST(BL_PC, bl)->state.size = size; } else if(bl->type == BL_MOB) { - ((TBL_MOB*)bl)->special_state.size=size; + BL_UCAST(BL_MOB, bl)->special_state.size = size; } else return 0; if(size!=0) @@ -2398,8 +2409,9 @@ int unit_remove_map(struct block_list *bl, clr_type clrtype, const char* file, i } switch( bl->type ) { - case BL_PC: { - struct map_session_data *sd = (struct map_session_data*)bl; + case BL_PC: + { + struct map_session_data *sd = BL_UCAST(BL_PC, bl); if(sd->shadowform_id) { struct block_list *d_bl = map->id2bl(sd->shadowform_id); @@ -2494,8 +2506,9 @@ int unit_remove_map(struct block_list *bl, clr_type clrtype, const char* file, i break; } - case BL_MOB: { - struct mob_data *md = (struct mob_data*)bl; + case BL_MOB: + { + struct mob_data *md = BL_UCAST(BL_MOB, bl); // Drop previous target mob_slave_keep_target: no. if (!battle_config.mob_slave_keep_target) md->target_id=0; @@ -2505,8 +2518,9 @@ int unit_remove_map(struct block_list *bl, clr_type clrtype, const char* file, i break; } - case BL_PET: { - struct pet_data *pd = (struct pet_data*)bl; + case BL_PET: + { + struct pet_data *pd = BL_UCAST(BL_PET, bl); if( pd->pet.intimate <= 0 && !(pd->msd && !pd->msd->state.active) ) { //If logging out, this is deleted on unit->free clif->clearunit_area(bl,clrtype); @@ -2519,7 +2533,7 @@ int unit_remove_map(struct block_list *bl, clr_type clrtype, const char* file, i break; } case BL_HOM: { - struct homun_data *hd = (struct homun_data *)bl; + struct homun_data *hd = BL_UCAST(BL_HOM, bl); if( !hd->homunculus.intimacy && !(hd->master && !hd->master->state.active) ) { //If logging out, this is deleted on unit->free clif->emotion(bl, E_SOB); @@ -2532,7 +2546,7 @@ int unit_remove_map(struct block_list *bl, clr_type clrtype, const char* file, i break; } case BL_MER: { - struct mercenary_data *md = (struct mercenary_data *)bl; + struct mercenary_data *md = BL_UCAST(BL_MER, bl); ud->canact_tick = ud->canmove_tick; if( mercenary->get_lifetime(md) <= 0 && !(md->master && !md->master->state.active) ) { clif->clearunit_area(bl,clrtype); @@ -2544,7 +2558,7 @@ int unit_remove_map(struct block_list *bl, clr_type clrtype, const char* file, i break; } case BL_ELEM: { - struct elemental_data *ed = (struct elemental_data *)bl; + struct elemental_data *ed = BL_UCAST(BL_ELEM, bl); ud->canact_tick = ud->canmove_tick; if( elemental->get_lifetime(ed) <= 0 && !(ed->master && !ed->master->state.active) ) { clif->clearunit_area(bl,clrtype); @@ -2608,7 +2622,7 @@ int unit_free(struct block_list *bl, clr_type clrtype) { switch( bl->type ) { case BL_PC: { - struct map_session_data *sd = (struct map_session_data*)bl; + struct map_session_data *sd = BL_UCAST(BL_PC, bl); sd->state.loggingout = 1; @@ -2672,7 +2686,7 @@ int unit_free(struct block_list *bl, clr_type clrtype) { } case BL_PET: { - struct pet_data *pd = (struct pet_data*)bl; + struct pet_data *pd = BL_UCAST(BL_PET, bl); struct map_session_data *sd = pd->msd; pet->hungry_timer_delete(pd); if( pd->a_skill ) @@ -2723,7 +2737,7 @@ int unit_free(struct block_list *bl, clr_type clrtype) { } case BL_MOB: { - struct mob_data *md = (struct mob_data*)bl; + struct mob_data *md = BL_UCAST(BL_MOB, bl); if( md->spawn_timer != INVALID_TIMER ) { timer->delete(md->spawn_timer,mob->delayspawn); @@ -2783,7 +2797,7 @@ int unit_free(struct block_list *bl, clr_type clrtype) { } case BL_HOM: { - struct homun_data *hd = (TBL_HOM*)bl; + struct homun_data *hd = BL_UCAST(BL_HOM, bl); struct map_session_data *sd = hd->master; homun->hunger_timer_delete(hd); if( hd->homunculus.intimacy > 0 ) @@ -2799,7 +2813,7 @@ int unit_free(struct block_list *bl, clr_type clrtype) { } case BL_MER: { - struct mercenary_data *md = (TBL_MER*)bl; + struct mercenary_data *md = BL_UCAST(BL_MER, bl); struct map_session_data *sd = md->master; if( mercenary->get_lifetime(md) > 0 ) mercenary->save(md); @@ -2816,7 +2830,7 @@ int unit_free(struct block_list *bl, clr_type clrtype) { break; } case BL_ELEM: { - struct elemental_data *ed = (TBL_ELEM*)bl; + struct elemental_data *ed = BL_UCAST(BL_ELEM, bl); struct map_session_data *sd = ed->master; if( elemental->get_lifetime(ed) > 0 ) elemental->save(ed); |