From 25b91266444c3b82f80ee1b3e2f7cd390196d46f Mon Sep 17 00:00:00 2001 From: Lemongrass3110 Date: Wed, 3 Jul 2024 17:05:15 +0200 Subject: [PATCH] Refactored get/set unitdata (#8483) Fixes #8481 Thanks to @Hyroshima --- src/map/script.cpp | 217 ++++++++++++++++----------------------------- 1 file changed, 78 insertions(+), 139 deletions(-) diff --git a/src/map/script.cpp b/src/map/script.cpp index 8d6475838f..df88919962 100644 --- a/src/map/script.cpp +++ b/src/map/script.cpp @@ -18822,21 +18822,8 @@ BUILDIN_FUNC(getunittype) /// getunitdata ,; BUILDIN_FUNC(getunitdata) { - TBL_PC *sd = st->rid ? map_id2sd(st->rid) : nullptr; + map_session_data* sd; struct block_list* bl; - TBL_MOB* md = nullptr; - TBL_HOM* hd = nullptr; - TBL_MER* mc = nullptr; - TBL_PET* pd = nullptr; - TBL_ELEM* ed = nullptr; - TBL_NPC* nd = nullptr; - char* name; - struct script_data *data = script_getdata(st, 3); - - if (!data_isreference(data)) { - ShowWarning("buildin_getunitdata: Error in argument! Please give a variable to store values in.\n"); - return SCRIPT_CMD_FAILURE; - } if(!script_rid2bl(2,bl)) { @@ -18844,33 +18831,28 @@ BUILDIN_FUNC(getunitdata) return SCRIPT_CMD_FAILURE; } - switch (bl->type) { - case BL_MOB: md = map_id2md(bl->id); break; - case BL_HOM: hd = map_id2hd(bl->id); break; - case BL_PET: pd = map_id2pd(bl->id); break; - case BL_MER: mc = map_id2mc(bl->id); break; - case BL_ELEM: ed = map_id2ed(bl->id); break; - case BL_NPC: nd = map_id2nd(bl->id); break; - default: - ShowWarning("buildin_getunitdata: Invalid object type!\n"); - return SCRIPT_CMD_FAILURE; + struct script_data *data = script_getdata(st, 3); + + if (!data_isreference(data)) { + ShowWarning("buildin_getunitdata: Error in argument! Please give a variable to store values in.\n"); + return SCRIPT_CMD_FAILURE; } - name = reference_getname(data); + char* name = reference_getname(data); if (not_server_variable(*name) && !script_rid2sd(sd)) { ShowError("buildin_getunitdata: Cannot use a player variable '%s' if no player is attached.\n", name); return SCRIPT_CMD_FAILURE; + }else{ + sd = nullptr; } #define getunitdata_sub(idx__,var__) setd_sub_num(st,sd,name,(idx__),(var__),data->ref) switch(bl->type) { - case BL_MOB: - if (!md) { - ShowWarning("buildin_getunitdata: Error in finding object BL_MOB!\n"); - return SCRIPT_CMD_FAILURE; - } + case BL_MOB: { + mob_data* md = reinterpret_cast( bl ); + getunitdata_sub(UMOB_SIZE, md->status.size); getunitdata_sub(UMOB_LEVEL, md->level); getunitdata_sub(UMOB_HP, md->status.hp); @@ -18928,13 +18910,11 @@ BUILDIN_FUNC(getunitdata) getunitdata_sub(UMOB_RES, md->status.res); getunitdata_sub(UMOB_MRES, md->status.mres); getunitdata_sub(UMOB_DAMAGETAKEN, md->damagetaken); - break; + } break; + + case BL_HOM: { + homun_data* hd = reinterpret_cast( bl ); - case BL_HOM: - if (!hd) { - ShowWarning("buildin_getunitdata: Error in finding object BL_HOM!\n"); - return SCRIPT_CMD_FAILURE; - } getunitdata_sub(UHOM_SIZE, hd->base_status.size); getunitdata_sub(UHOM_LEVEL, hd->homunculus.level); getunitdata_sub(UHOM_HP, hd->homunculus.hp); @@ -18976,13 +18956,11 @@ BUILDIN_FUNC(getunitdata) getunitdata_sub(UHOM_DMOTION, hd->battle_status.dmotion); getunitdata_sub(UHOM_TARGETID, hd->ud.target); getunitdata_sub(UHOM_GROUP_ID, hd->ud.group_id); - break; + } break; + + case BL_PET: { + pet_data* pd = reinterpret_cast( bl ); - case BL_PET: - if (!pd) { - ShowWarning("buildin_getunitdata: Error in finding object BL_PET!\n"); - return SCRIPT_CMD_FAILURE; - } getunitdata_sub(UPET_SIZE, pd->status.size); getunitdata_sub(UPET_LEVEL, pd->pet.level); getunitdata_sub(UPET_HP, pd->status.hp); @@ -19021,13 +18999,11 @@ BUILDIN_FUNC(getunitdata) getunitdata_sub(UPET_ADELAY, pd->status.adelay); getunitdata_sub(UPET_DMOTION, pd->status.dmotion); getunitdata_sub(UPET_GROUP_ID, pd->ud.group_id); - break; + } break; + + case BL_MER: { + s_mercenary_data* mc = reinterpret_cast( bl ); - case BL_MER: - if (!mc) { - ShowWarning("buildin_getunitdata: Error in finding object BL_MER!\n"); - return SCRIPT_CMD_FAILURE; - } getunitdata_sub(UMER_SIZE, mc->base_status.size); getunitdata_sub(UMER_HP, mc->base_status.hp); getunitdata_sub(UMER_MAXHP, mc->base_status.max_hp); @@ -19066,13 +19042,11 @@ BUILDIN_FUNC(getunitdata) getunitdata_sub(UMER_DMOTION, mc->base_status.dmotion); getunitdata_sub(UMER_TARGETID, mc->ud.target); getunitdata_sub(UMER_GROUP_ID, mc->ud.group_id); - break; + } break; + + case BL_ELEM: { + s_elemental_data* ed = reinterpret_cast( bl ); - case BL_ELEM: - if (!ed) { - ShowWarning("buildin_getunitdata: Error in finding object BL_ELEM!\n"); - return SCRIPT_CMD_FAILURE; - } getunitdata_sub(UELE_SIZE, ed->base_status.size); getunitdata_sub(UELE_HP, ed->elemental.hp); getunitdata_sub(UELE_MAXHP, ed->elemental.max_hp); @@ -19113,13 +19087,11 @@ BUILDIN_FUNC(getunitdata) getunitdata_sub(UELE_DMOTION, ed->base_status.dmotion); getunitdata_sub(UELE_TARGETID, ed->ud.target); getunitdata_sub(UELE_GROUP_ID, ed->ud.group_id); - break; + } break; + + case BL_NPC: { + npc_data* nd = reinterpret_cast( bl ); - case BL_NPC: - if (!nd) { - ShowWarning("buildin_getunitdata: Error in finding object BL_NPC!\n"); - return SCRIPT_CMD_FAILURE; - } getunitdata_sub(UNPC_LEVEL, nd->level); getunitdata_sub(UNPC_HP, nd->status.hp); getunitdata_sub(UNPC_MAXHP, nd->status.max_hp); @@ -19166,7 +19138,7 @@ BUILDIN_FUNC(getunitdata) getunitdata_sub(UNPC_BODY2, nd->vd.body_style); getunitdata_sub(UNPC_DEADSIT, nd->vd.dead_sit); getunitdata_sub(UNPC_GROUP_ID, nd->ud.group_id); - break; + } break; default: ShowWarning("buildin_getunitdata: Unknown object type!\n"); @@ -19191,31 +19163,6 @@ BUILDIN_FUNC(setunitdata) return SCRIPT_CMD_FAILURE; } - TBL_MOB* md; - TBL_HOM* hd; - TBL_MER* mc; - TBL_PET* pd; - TBL_ELEM* ed; - TBL_NPC* nd; - - switch (bl->type) { - case BL_MOB: md = map_id2md(bl->id); break; - case BL_HOM: hd = map_id2hd(bl->id); break; - case BL_PET: pd = map_id2pd(bl->id); break; - case BL_MER: mc = map_id2mc(bl->id); break; - case BL_ELEM: ed = map_id2ed(bl->id); break; - case BL_NPC: - nd = map_id2nd(bl->id); - if (!nd->status.hp) - status_calc_npc(nd, SCO_FIRST); - else - status_calc_npc(nd, SCO_NONE); - break; - default: - ShowError("buildin_setunitdata: Invalid object!\n"); - return SCRIPT_CMD_FAILURE; - } - int type = script_getnum(st, 3), value = 0; const char *mapname = nullptr; bool calc_status = false; @@ -19226,11 +19173,9 @@ BUILDIN_FUNC(setunitdata) value = script_getnum(st, 4); switch (bl->type) { - case BL_MOB: - if (!md) { - ShowWarning("buildin_setunitdata: Error in finding object BL_MOB!\n"); - return SCRIPT_CMD_FAILURE; - } + case BL_MOB: { + mob_data* md = reinterpret_cast( bl ); + if (!md->base_status) { md->base_status = (struct status_data*)aCalloc(1, sizeof(struct status_data)); memcpy(md->base_status, &md->db->status, sizeof(struct status_data)); @@ -19347,13 +19292,11 @@ BUILDIN_FUNC(setunitdata) } if (calc_status) status_calc_bl_(&md->bl, status_db.getSCB_BATTLE()); - break; + } break; + + case BL_HOM: { + homun_data* hd = reinterpret_cast( bl ); - case BL_HOM: - if (!hd) { - ShowWarning("buildin_setunitdata: Error in finding object BL_HOM!\n"); - return SCRIPT_CMD_FAILURE; - } switch (type) { case UHOM_SIZE: hd->battle_status.size = hd->base_status.size = (unsigned char)value; break; case UHOM_LEVEL: hd->homunculus.level = (unsigned short)value; break; @@ -19414,13 +19357,14 @@ BUILDIN_FUNC(setunitdata) } if (calc_status) status_calc_bl_(&hd->bl, status_db.getSCB_BATTLE()); - break; - case BL_PET: - if (!pd) { - ShowWarning("buildin_setunitdata: Error in finding object BL_PET!\n"); - return SCRIPT_CMD_FAILURE; - } + // Client information update + clif_send_homdata( *hd, SP_ACK ); + } break; + + case BL_PET: { + pet_data* pd = reinterpret_cast( bl ); + switch (type) { case UPET_SIZE: pd->status.size = (unsigned char)value; break; case UPET_LEVEL: pd->pet.level = (unsigned short)value; break; @@ -19428,7 +19372,7 @@ BUILDIN_FUNC(setunitdata) case UPET_MAXHP: pd->status.hp = pd->status.max_hp = (unsigned int)value; status_set_maxhp(bl, (unsigned int)value, 0); break; case UPET_MASTERAID: pd->pet.account_id = (unsigned int)value; break; case UPET_MAPID: if (mapname) value = map_mapname2mapid(mapname); unit_warp(bl, (short)value, 0, 0, CLR_TELEPORT); break; - case UPET_X: if (!unit_walktoxy(bl, (short)value, pd->bl.y, 2)) unit_movepos(bl, (short)value, md->bl.y, 0, 0); break; + case UPET_X: if (!unit_walktoxy(bl, (short)value, pd->bl.y, 2)) unit_movepos(bl, (short)value, pd->bl.y, 0, 0); break; case UPET_Y: if (!unit_walktoxy(bl, pd->bl.x, (short)value, 2)) unit_movepos(bl, pd->bl.x, (short)value, 0, 0); break; case UPET_HUNGER: pd->pet.hungry = cap_value((short)value, 0, 100); clif_send_petdata(map_id2sd(pd->pet.account_id), pd, 2, pd->pet.hungry); break; case UPET_INTIMACY: pet_set_intimate(pd, (unsigned int)value); clif_send_petdata(map_id2sd(pd->pet.account_id), pd, 1, pd->pet.intimate); break; @@ -19464,13 +19408,14 @@ BUILDIN_FUNC(setunitdata) ShowError("buildin_setunitdata: Unknown data identifier %d for BL_PET.\n", type); return SCRIPT_CMD_FAILURE; } - break; - case BL_MER: - if (!mc) { - ShowWarning("buildin_setunitdata: Error in finding object BL_MER!\n"); - return SCRIPT_CMD_FAILURE; - } + // Client information update + clif_send_petstatus( pd->master ); + } break; + + case BL_MER: { + s_mercenary_data* mc = reinterpret_cast( bl ); + switch (type) { case UMER_SIZE: mc->battle_status.size = mc->base_status.size = (unsigned char)value; break; case UMER_HP: mc->base_status.hp = (unsigned int)value; status_set_hp(bl, (unsigned int)value, 0); break; @@ -19528,13 +19473,17 @@ BUILDIN_FUNC(setunitdata) } if (calc_status) status_calc_bl_(&mc->bl, status_db.getSCB_BATTLE()); - break; - case BL_ELEM: - if (!ed) { - ShowWarning("buildin_setunitdata: Error in finding object BL_ELEM!\n"); - return SCRIPT_CMD_FAILURE; - } + // Client information update + if( map_session_data* sd = map_charid2sd( mc->mercenary.char_id ); sd != nullptr ){ + clif_mercenary_info( sd ); + clif_mercenary_skillblock( sd ); + } + } break; + + case BL_ELEM: { + s_elemental_data* ed = reinterpret_cast( bl ); + switch (type) { case UELE_SIZE: ed->battle_status.size = ed->base_status.size = (unsigned char)value; break; case UELE_HP: ed->base_status.hp = (unsigned int)value; status_set_hp(bl, (unsigned int)value, 0); break; @@ -19595,13 +19544,20 @@ BUILDIN_FUNC(setunitdata) } if (calc_status) status_calc_bl_(&ed->bl, status_db.getSCB_BATTLE()); - break; - case BL_NPC: - if (!nd) { - ShowWarning("buildin_setunitdata: Error in finding object BL_NPC!\n"); - return SCRIPT_CMD_FAILURE; + // Client information update + clif_elemental_info( ed->master ); + } break; + + case BL_NPC: { + npc_data* nd = reinterpret_cast( bl ); + + if( nd->status.hp == 0 ){ + status_calc_npc( nd, SCO_FIRST ); + }else{ + status_calc_npc( nd, SCO_NONE ); } + switch (type) { case UNPC_LEVEL: nd->level = (unsigned int)value; break; case UNPC_HP: nd->status.hp = (unsigned int)value; status_set_hp(bl, (unsigned int)value, 0); break; @@ -19652,30 +19608,13 @@ BUILDIN_FUNC(setunitdata) ShowError("buildin_setunitdata: Unknown data identifier %d for BL_NPC.\n", type); return SCRIPT_CMD_FAILURE; } - break; + } break; default: ShowWarning("buildin_setunitdata: Unknown object type!\n"); return SCRIPT_CMD_FAILURE; } - // Client information updates - switch (bl->type) { - case BL_HOM: - clif_send_homdata( *hd, SP_ACK ); - break; - case BL_PET: - clif_send_petstatus(pd->master); - break; - case BL_MER: - clif_mercenary_info(map_charid2sd(mc->mercenary.char_id)); - clif_mercenary_skillblock(map_charid2sd(mc->mercenary.char_id)); - break; - case BL_ELEM: - clif_elemental_info(ed->master); - break; - } - return SCRIPT_CMD_SUCCESS; }