Beispiel #1
0
        private static int CheckPowerArmor(edict_t ent, float[] point, float[] normal, int damage, int dflags)
        {
            gclient_t client;
            int       save;
            int       power_armor_type;
            var       index = 0;
            int       damagePerCell;
            int       pa_te_type;
            var       power = 0;
            int       power_used;

            if (damage == 0)
            {
                return(0);
            }

            client = ent.client;

            if ((dflags & Defines.DAMAGE_NO_ARMOR) != 0)
            {
                return(0);
            }

            if (client != null)
            {
                power_armor_type = GameItems.PowerArmorType(ent);

                if (power_armor_type != Defines.POWER_ARMOR_NONE)
                {
                    index = GameItems.ITEM_INDEX(GameItems.FindItem("Cells"));
                    power = client.pers.inventory[index];
                }
            }
            else if ((ent.svflags & Defines.SVF_MONSTER) != 0)
            {
                power_armor_type = ent.monsterinfo.power_armor_type;
                power            = ent.monsterinfo.power_armor_power;
            }
            else
            {
                return(0);
            }

            if (power_armor_type == Defines.POWER_ARMOR_NONE)
            {
                return(0);
            }

            if (power == 0)
            {
                return(0);
            }

            if (power_armor_type == Defines.POWER_ARMOR_SCREEN)
            {
                float[] vec = { 0, 0, 0 };
                float   dot;
                float[] forward = { 0, 0, 0 };

                // only works if damage point is in front
                Math3D.AngleVectors(ent.s.angles, forward, null, null);
                Math3D.VectorSubtract(point, ent.s.origin, vec);
                Math3D.VectorNormalize(vec);
                dot = Math3D.DotProduct(vec, forward);

                if (dot <= 0.3)
                {
                    return(0);
                }

                damagePerCell = 1;
                pa_te_type    = Defines.TE_SCREEN_SPARKS;
                damage        = damage / 3;
            }
            else
            {
                damagePerCell = 2;
                pa_te_type    = Defines.TE_SHIELD_SPARKS;
                damage        = 2 * damage / 3;
            }

            save = power * damagePerCell;

            if (save == 0)
            {
                return(0);
            }

            if (save > damage)
            {
                save = damage;
            }

            GameCombat.SpawnDamage(pa_te_type, point, normal, save);
            ent.powerarmor_time = GameBase.level.time + 0.2f;

            power_used = save / damagePerCell;

            if (client != null)
            {
                client.pers.inventory[index] -= power_used;
            }
            else
            {
                ent.monsterinfo.power_armor_power -= power_used;
            }

            return(save);
        }