(SubgameEntity ent, float[] point, float[] normal,
int damage, int dflags, GameExportsImpl gameExports)
| 152 | } |
| 153 | |
| 154 | private static int CheckPowerArmor(SubgameEntity ent, float[] point, float[] normal, |
| 155 | int damage, int dflags, GameExportsImpl gameExports) { |
| 156 | gclient_t client; |
| 157 | int save; |
| 158 | int power_armor_type; |
| 159 | int index = 0; |
| 160 | int damagePerCell; |
| 161 | int pa_te_type; |
| 162 | int power = 0; |
| 163 | int power_used; |
| 164 | |
| 165 | if (damage == 0) |
| 166 | return 0; |
| 167 | |
| 168 | client = ent.getClient(); |
| 169 | |
| 170 | if ((dflags & DamageFlags.DAMAGE_NO_ARMOR) != 0) |
| 171 | return 0; |
| 172 | |
| 173 | if (client != null) { |
| 174 | power_armor_type = GameItems.PowerArmorType(ent, gameExports); |
| 175 | if (power_armor_type != GameDefines.POWER_ARMOR_NONE) { |
| 176 | index = GameItems.FindItem("Cells", gameExports).index; |
| 177 | power = client.pers.inventory[index]; |
| 178 | } |
| 179 | } else if ((ent.svflags & Defines.SVF_MONSTER) != 0) { |
| 180 | power_armor_type = ent.monsterinfo.power_armor_type; |
| 181 | power = ent.monsterinfo.power_armor_power; |
| 182 | } else |
| 183 | return 0; |
| 184 | |
| 185 | if (power_armor_type == GameDefines.POWER_ARMOR_NONE) |
| 186 | return 0; |
| 187 | if (power == 0) |
| 188 | return 0; |
| 189 | |
| 190 | if (power_armor_type == GameDefines.POWER_ARMOR_SCREEN) { |
| 191 | float[] vec = { 0, 0, 0 }; |
| 192 | float dot; |
| 193 | float[] forward = { 0, 0, 0 }; |
| 194 | |
| 195 | // only works if damage point is in front |
| 196 | Math3D.AngleVectors(ent.s.angles, forward, null, null); |
| 197 | Math3D.VectorSubtract(point, ent.s.origin, vec); |
| 198 | Math3D.VectorNormalize(vec); |
| 199 | dot = Math3D.DotProduct(vec, forward); |
| 200 | if (dot <= 0.3) |
| 201 | return 0; |
| 202 | |
| 203 | damagePerCell = 1; |
| 204 | pa_te_type = Defines.TE_SCREEN_SPARKS; |
| 205 | damage = damage / 3; |
| 206 | } else { |
| 207 | damagePerCell = 2; |
| 208 | pa_te_type = Defines.TE_SHIELD_SPARKS; |
| 209 | damage = (2 * damage) / 3; |
| 210 | } |
| 211 |
no test coverage detected