HughJanus 244 Posted May 15, 2020 Posted May 15, 2020 (edited) What I am trying to do is giving back health to NPCs if they got hit in certain bones - this way I try to implement body part specific damage. Example: if NPC01 was hit in the leg, check how much health it lost and give it back a part of it. Somehow it wont work, though. Here is the code I am using: //modifiers for health not deducted for the affected body parts float ini_legdamagemod = 0.99; // 99% of deducted health will be given back float ini_armdamagemod = 0.99; // 99% of deducted health will be given back float ini_torsodamagemod = 0.0; // 0% of deducted health will be given back float ini_headdamagemod = 0.0; // 0% of deducted health will be given back float ini_neckdamagemod = 0.0; // 0% of deducted health will be given back //container for peds and a health value to calculate the body part damage std::map<Ped, int> pedmaplimbhealth; //container for affected bones vector<int> legbones, armbones, torsobones, headbones, neckbones; legbones.push_back(6884); legbones.push_back(65478); legbones.push_back(51120); legbones.push_back(33646); legbones.push_back(43312); armbones.push_back(54187); armbones.push_back(53675); armbones.push_back(41357); armbones.push_back(41341); armbones.push_back(41405); armbones.push_back(41326); armbones.push_back(41325); armbones.push_back(35876); armbones.push_back(16829); armbones.push_back(16781); armbones.push_back(16765); armbones.push_back(16749); armbones.push_back(11300); torsobones.push_back(14410); torsobones.push_back(14411); torsobones.push_back(14412); torsobones.push_back(14413); torsobones.push_back(14414); torsobones.push_back(14415); headbones.push_back(21030); neckbones.push_back(14284); neckbones.push_back(14285); neckbones.push_back(14286); neckbones.push_back(14287); neckbones.push_back(14288); while(true) { if (MOD IS ENABLED) { //get all peds near player const int ARR_SIZE = 1024; Ped peds[ARR_SIZE]; int count = worldGetAllPeds(peds, ARR_SIZE); //filling the ped container for (int i = 0; i < count; i++) { if (pedmaplimbhealth.find(peds[i]) == pedmaplimbhealth.end()) { pedmaplimbhealth[peds[i]] = ENTITY::GET_ENTITY_HEALTH(peds[i]); } } //checking if ped health has decreased and if so, give health back according to modifiers if (pedmaplimbhealth[peds[i]] > ENTITY::GET_ENTITY_HEALTH(peds[i])) { float damagedone = pedmaplimbhealth[peds[i]] - ENTITY::GET_ENTITY_HEALTH(peds[i]); int act_Bone; if (PED::GET_PED_LAST_DAMAGE_BONE(peds[i], &act_Bone)) { for (vector<int>::size_type i = 0; i != legbones.size(); i++) { if (act_Bone == PED::GET_PED_BONE_INDEX(peds[i], legbones[i])) { int healthback = (int)(damagedone * ini_legdamagemod); if (ENTITY::GET_ENTITY_HEALTH(peds[i]) < ini_dyingmovementthreshold && (healthback + ENTITY::GET_ENTITY_HEALTH(peds[i])) > ini_dyingmovementthreshold) ENTITY::SET_ENTITY_HEALTH(peds[i], ini_dyingthreshold - 1, 0); else ENTITY::SET_ENTITY_HEALTH(peds[i], ENTITY::GET_ENTITY_HEALTH(peds[i]) + healthback, 0); pedmaplimbhealth[peds[i]] = ENTITY::GET_ENTITY_HEALTH(peds[i]); PED::CLEAR_PED_LAST_DAMAGE_BONE(peds[i]); } } for (vector<int>::size_type i = 0; i != armbones.size(); i++) { if (act_Bone == PED::GET_PED_BONE_INDEX(peds[i], armbones[i])) { int healthback = (int)(damagedone * ini_armdamagemod); if (ENTITY::GET_ENTITY_HEALTH(peds[i]) < ini_dyingmovementthreshold && (healthback + ENTITY::GET_ENTITY_HEALTH(peds[i])) > ini_dyingmovementthreshold) ENTITY::SET_ENTITY_HEALTH(peds[i], ini_dyingthreshold - 1, 0); else ENTITY::SET_ENTITY_HEALTH(peds[i], ENTITY::GET_ENTITY_HEALTH(peds[i]) + healthback, 0); pedmaplimbhealth[peds[i]] = ENTITY::GET_ENTITY_HEALTH(peds[i]); PED::CLEAR_PED_LAST_DAMAGE_BONE(peds[i]); } } for (vector<int>::size_type i = 0; i != torsobones.size(); i++) { if (act_Bone == PED::GET_PED_BONE_INDEX(peds[i], torsobones[i])) { int healthback = (int)(damagedone * ini_torsodamagemod); if (ENTITY::GET_ENTITY_HEALTH(peds[i]) < ini_dyingmovementthreshold && (healthback + ENTITY::GET_ENTITY_HEALTH(peds[i])) > ini_dyingmovementthreshold) ENTITY::SET_ENTITY_HEALTH(peds[i], ini_dyingthreshold - 1, 0); else ENTITY::SET_ENTITY_HEALTH(peds[i], ENTITY::GET_ENTITY_HEALTH(peds[i]) + healthback, 0); pedmaplimbhealth[peds[i]] = ENTITY::GET_ENTITY_HEALTH(peds[i]); PED::CLEAR_PED_LAST_DAMAGE_BONE(peds[i]); } } for (vector<int>::size_type i = 0; i != headbones.size(); i++) { if (act_Bone == PED::GET_PED_BONE_INDEX(peds[i], headbones[i])) { int healthback = (int)(damagedone * ini_headdamagemod); if (ENTITY::GET_ENTITY_HEALTH(peds[i]) < ini_dyingmovementthreshold && (healthback + ENTITY::GET_ENTITY_HEALTH(peds[i])) > ini_dyingmovementthreshold) ENTITY::SET_ENTITY_HEALTH(peds[i], ini_dyingthreshold - 1, 0); else ENTITY::SET_ENTITY_HEALTH(peds[i], ENTITY::GET_ENTITY_HEALTH(peds[i]) + healthback, 0); pedmaplimbhealth[peds[i]] = ENTITY::GET_ENTITY_HEALTH(peds[i]); PED::CLEAR_PED_LAST_DAMAGE_BONE(peds[i]); } } for (vector<int>::size_type i = 0; i != neckbones.size(); i++) { if (act_Bone == PED::GET_PED_BONE_INDEX(peds[i], neckbones[i])) { int healthback = (int)(damagedone * ini_neckdamagemod); if (ENTITY::GET_ENTITY_HEALTH(peds[i]) < ini_dyingmovementthreshold && (healthback + ENTITY::GET_ENTITY_HEALTH(peds[i])) > ini_dyingmovementthreshold) ENTITY::SET_ENTITY_HEALTH(peds[i], ini_dyingthreshold - 1, 0); else ENTITY::SET_ENTITY_HEALTH(peds[i], ENTITY::GET_ENTITY_HEALTH(peds[i]) + healthback, 0); pedmaplimbhealth[peds[i]] = ENTITY::GET_ENTITY_HEALTH(peds[i]); PED::CLEAR_PED_LAST_DAMAGE_BONE(peds[i]); } } } } } } For some reason the NPCs still keep dying from three or four leg shots (if health is set to 100). Does anyone have any idea why that is the case? Edited May 16, 2020 by HughJanus Quote
LMS 676 Posted May 15, 2020 Posted May 15, 2020 To better understand: You are setting the health back to 100 after every shot (and have verified it gets reset to it), but they will still die from a leg shot? Quote
HughJanus 244 Posted May 15, 2020 Author Posted May 15, 2020 44 minutes ago, LMS said: To better understand: You are setting the health back to 100 after every shot (and have verified it gets reset to it), but they will still die from a leg shot? I am first getting the health of the NPC and am saving it to the map (the map does not get touched after that). Then, every script iteration I do a "get health" and check if its less than the value remembered in the map. If so, I calculate the delta. Then I check the last bone that was damaged and multiply the delta according to the modifier for the specific body part and give that number of health back. (so e.g. if an NPC lost 10 health and the leg was last damaged, 9 health should be given back to him, if the modifier for the leg is 90% or 0.9). After that, I set the map to the current health and the whole thing triggers again when the health is lowered. Quote
LMS 676 Posted May 15, 2020 Posted May 15, 2020 Are you able to confirm that when they die, their health is still high? Quote
HughJanus 244 Posted May 15, 2020 Author Posted May 15, 2020 Just now, LMS said: Are you able to confirm that when they die, their health is still high? I havent checked, but I dont suppose that is the case. I guess I made a mistake in the logic I use, but I cant seem to find it. I even wrote it down on paper, but it all checks out^^ Quote
HughJanus 244 Posted May 16, 2020 Author Posted May 16, 2020 Now I have set some values to be shown on screen for the current target (the one the player is free aiming at / the last NPC he free aimed at). The damage done is the delta between the map and the current health - this increases steadily, the current health (ped health) decreases steadily. So it seems neither the map is updated, nor is the ped health increased. The max health is the max health of the ped (is correct), the last dam bone is also correct (the "Legbone" is just a value of the legbones vector, to see if it even aligns with the last dam bone, so the code for increasing the health is (should be) executed). To see if the code in those brackets (increasing health, updating the map) even triggers, I wrote a draw text function in each bracket (one for leg (YOLOYOLOYOLO_LEG), one for arm (YOLOYOLOYOLO_ARM), etc.) and the text gets drawn, so the health should also be increased and the map should be updated. But it doesnt happen for some reason. I even tried setting the health to a fixed value to increase it to (ENTITY::SET_ENTITY_HEALTH(peds, 100)), but that doesnt change anything. Those two methods dont seem to work in those brackets: pedmaplimbhealth[peds[i]] = ENTITY::GET_ENTITY_HEALTH(peds[i]); ENTITY::SET_ENTITY_HEALTH Quote
HughJanus 244 Posted May 16, 2020 Author Posted May 16, 2020 What a dumb mistake. The iterator has the same name as the counter for the peds, so it overwrote the counter. 1 Quote
adv0cate 6 Posted May 25, 2020 Posted May 25, 2020 try ENTITY::SET_ENTITY_MAX_HEALTH(ped, 240); ENTITY::_SET_ENTITY_HEALTH(ped, 240, 0); Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.