Procházet zdrojové kódy

Refactored get/set unitdata (#8483)

Fixes #8481

Thanks to @Hyroshima
Lemongrass3110 před 10 měsíci
rodič
revize
25b9126644
1 změnil soubory, kde provedl 78 přidání a 139 odebrání
  1. 78 139
      src/map/script.cpp

+ 78 - 139
src/map/script.cpp

@@ -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;
 }