Refactored get/set unitdata (#8483)

Fixes #8481

Thanks to @Hyroshima
This commit is contained in:
Lemongrass3110 2024-07-03 17:05:15 +02:00 committed by GitHub
parent 2206d1a960
commit 25b9126644
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -18822,21 +18822,8 @@ BUILDIN_FUNC(getunittype)
/// getunitdata <unit id>,<arrayname>;
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<mob_data*>( 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<homun_data*>( 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<pet_data*>( 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<s_mercenary_data*>( 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<s_elemental_data*>( 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<npc_data*>( 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<mob_data*>( 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<homun_data*>( 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<pet_data*>( 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<s_mercenary_data*>( 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<s_elemental_data*>( 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<npc_data*>( 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;
}