BorizzK можно проще, получаем вещи персонажа в зоне прописанной со слотов на персонаже, типа ноги, лицо, куртка, и т.п. Сверяем их с 'эталонным вариантом'. Если соответствует списку - выполняем для всех этих вещей проверку дамажности, по результату которого высчитываем коэфициент нанесения урона. И уже этот коэфициент используем в нанесении урона по вещам на игроке или игроку.
Вроде не сложно объяснил, но, вроде, именнно такое ребята и хотят.
Вот накидал примерный код:
array<string> slots_inv = {"Mask","Headgear","Body","Legs","Feet","Gloves"};
array<string> defend_items_idd = {"NBC_jacket", "NBC_gloves", "NBC_hood", "NBC_boots", "NBC_pant", 'GP5_Mask"};
ref array<ItemBase> ItemsInPlayerForCheck = new array<ItemBase>;
bool Check_Defend_player_fullset(PlayerBase player, array<string> items_check_in_set, array<string> slots_ids)
{
ItemsInPlayerForCheck.Clear();
EntityAI attachment;
ItemBase item;
string className;
foreach(string selected_slot_inv: slots_ids)
{
attachment = player.FindAttachmentBySlotName(selected_slot_inv);
if ( attachment && attachment.IsItemBase() ) {
item = Class.Cast(attachment);
className = item.GetType();
if (!Check_Type_in_Massive(className,items_check_in_set))
{
return false;
} else
{
ItemsInPlayerForCheck.Insert(item);
}
}
}
return true;
}
bool Check_Type_in_Massive(string type_id, array<string> massive_id)
{
private int element_index = massive_id.Find(type_id);
if ( element_index < 0 )
{
return false;
} else
{
return true;
}
}
bool check_set_item(array<ItemBase> itemList,float coef_check)
{
foreach(ItemBase selected_item: itemList)
{
if (selected_item)
{
if ((selected_item.GetHealth("", "")) <= coef_check)
{
return true;
}
} else
{
return true;
}
}
return false;
}
float Check_damage_coef()
{
float return_value = 0.0;
if (check_set_item(ItemsInPlayerForCheck,0.80))
{
if (check_set_item(ItemsInPlayerForCheck,0.60))
{
if (check_set_item(ItemsInPlayerForCheck,0.40))
{
if (check_set_item(ItemsInPlayerForCheck,0.20))
{
return_value = 1.00;
} else
{
return_value = 0.70;
}
} else
{
return_value = 0.40;
}
} else
{
return_value = 0.30;
}
} else
{
return_value = 0.0;
}
return return_value;
}
void Check_player(PlayerBase player)
{
float damage_coef = 0;
if (Check_Defend_player_fullset(player, defend_items_idd, slots_inv))
{
damage_coef = Check_damage_coef();
}
}
остается лишь после
if (Check_Defend_player_fullset(player, defend_items_idd, slots_inv))
{
damage_coef = Check_damage_coef();
}
добавить работу нанесения дамага игроку с учетом полученного коэфициента