Ejemplo n.º 1
0
        public static void Give_f(edict_t ent)
        {
            String  name;
            gitem_t it;
            Int32   index;
            Int32   i;
            Boolean give_all;
            edict_t it_ent;

            if (GameBase.deathmatch.value != 0 && GameBase.sv_cheats.value == 0)
            {
                SV_GAME.PF_cprintfhigh(ent, "You must run the server with '+set cheats 1' to enable this command.\\n");
                return;
            }

            name = Cmd.Args();
            if (0 == Lib.Q_stricmp(name, "all"))
            {
                give_all = true;
            }
            else
            {
                give_all = false;
            }
            if (give_all || 0 == Lib.Q_stricmp(Cmd.Argv(1), "health"))
            {
                if (Cmd.Argc() == 3)
                {
                    ent.health = Lib.Atoi(Cmd.Argv(2));
                }
                else
                {
                    ent.health = ent.max_health;
                }
                if (!give_all)
                {
                    return;
                }
            }

            if (give_all || 0 == Lib.Q_stricmp(name, "weapons"))
            {
                for (i = 1; i < GameBase.game.num_items; i++)
                {
                    it = GameItemList.itemlist[i];
                    if (null == it.pickup)
                    {
                        continue;
                    }
                    if (0 == (it.flags & Defines.IT_WEAPON))
                    {
                        continue;
                    }
                    ent.client.pers.inventory[i] += 1;
                }

                if (!give_all)
                {
                    return;
                }
            }

            if (give_all || 0 == Lib.Q_stricmp(name, "ammo"))
            {
                for (i = 1; i < GameBase.game.num_items; i++)
                {
                    it = GameItemList.itemlist[i];
                    if (null == it.pickup)
                    {
                        continue;
                    }
                    if (0 == (it.flags & Defines.IT_AMMO))
                    {
                        continue;
                    }
                    GameItems.Add_Ammo(ent, it, 1000);
                }

                if (!give_all)
                {
                    return;
                }
            }

            if (give_all || Lib.Q_stricmp(name, "armor") == 0)
            {
                gitem_armor_t info;
                it = GameItems.FindItem("Jacket Armor");
                ent.client.pers.inventory[GameItems.ITEM_INDEX(it)] = 0;
                it = GameItems.FindItem("Combat Armor");
                ent.client.pers.inventory[GameItems.ITEM_INDEX(it)] = 0;
                it   = GameItems.FindItem("Body Armor");
                info = ( gitem_armor_t )it.info;
                ent.client.pers.inventory[GameItems.ITEM_INDEX(it)] = info.max_count;
                if (!give_all)
                {
                    return;
                }
            }

            if (give_all || Lib.Q_stricmp(name, "Power Shield") == 0)
            {
                it               = GameItems.FindItem("Power Shield");
                it_ent           = GameUtil.G_Spawn();
                it_ent.classname = it.classname;
                GameItems.SpawnItem(it_ent, it);
                GameItems.Touch_Item(it_ent, ent, GameBase.dummyplane, null);
                if (it_ent.inuse)
                {
                    GameUtil.G_FreeEdict(it_ent);
                }
                if (!give_all)
                {
                    return;
                }
            }

            if (give_all)
            {
                for (i = 1; i < GameBase.game.num_items; i++)
                {
                    it = GameItemList.itemlist[i];
                    if (it.pickup != null)
                    {
                        continue;
                    }
                    if ((it.flags & (Defines.IT_ARMOR | Defines.IT_WEAPON | Defines.IT_AMMO)) != 0)
                    {
                        continue;
                    }
                    ent.client.pers.inventory[i] = 1;
                }

                return;
            }

            it = GameItems.FindItem(name);
            if (it == null)
            {
                name = Cmd.Argv(1);
                it   = GameItems.FindItem(name);
                if (it == null)
                {
                    SV_GAME.PF_cprintf(ent, Defines.PRINT_HIGH, "unknown item\\n");
                    return;
                }
            }

            if (it.pickup == null)
            {
                SV_GAME.PF_cprintf(ent, Defines.PRINT_HIGH, "non-pickup item\\n");
                return;
            }

            index = GameItems.ITEM_INDEX(it);
            if ((it.flags & Defines.IT_AMMO) != 0)
            {
                if (Cmd.Argc() == 3)
                {
                    ent.client.pers.inventory[index] = Lib.Atoi(Cmd.Argv(2));
                }
                else
                {
                    ent.client.pers.inventory[index] += it.quantity;
                }
            }
            else
            {
                it_ent           = GameUtil.G_Spawn();
                it_ent.classname = it.classname;
                GameItems.SpawnItem(it_ent, it);
                GameItems.Touch_Item(it_ent, ent, GameBase.dummyplane, null);
                if (it_ent.inuse)
                {
                    GameUtil.G_FreeEdict(it_ent);
                }
            }
        }
Ejemplo n.º 2
0
            public override void Use(edict_t self, edict_t other, edict_t activator)
            {
                int index;

                if (self.item == null)
                {
                    return;
                }
                if (activator.client == null)
                {
                    return;
                }
                index = GameItems.ITEM_INDEX(self.item);
                if (activator.client.pers.inventory[index] == 0)
                {
                    if (GameBase.level.time < self.touch_debounce_time)
                    {
                        return;
                    }
                    self.touch_debounce_time = GameBase.level.time + 5F;
                    GameBase.gi.Centerprintf(activator, "You need the " + self.item.pickup_name);
                    GameBase.gi.Sound(activator, Defines.CHAN_AUTO, GameBase.gi.Soundindex("misc/keytry.wav"), 1, Defines.ATTN_NORM, 0);
                    return;
                }

                GameBase.gi.Sound(activator, Defines.CHAN_AUTO, GameBase.gi.Soundindex("misc/keyuse.wav"), 1, Defines.ATTN_NORM, 0);
                if (GameBase.coop.value != 0)
                {
                    int     player;
                    edict_t ent;
                    if (Lib.Strcmp(self.item.classname, "key_power_cube") == 0)
                    {
                        int cube;
                        for (cube = 0; cube < 8; cube++)
                        {
                            if ((activator.client.pers.power_cubes & (1 << cube)) != 0)
                            {
                                break;
                            }
                        }
                        for (player = 1; player <= GameBase.game.maxclients; player++)
                        {
                            ent = GameBase.g_edicts[player];
                            if (!ent.inuse)
                            {
                                continue;
                            }
                            if (null == ent.client)
                            {
                                continue;
                            }
                            if ((ent.client.pers.power_cubes & (1 << cube)) != 0)
                            {
                                ent.client.pers.inventory[index]--;
                                ent.client.pers.power_cubes &= ~(1 << cube);
                            }
                        }
                    }
                    else
                    {
                        for (player = 1; player <= GameBase.game.maxclients; player++)
                        {
                            ent = GameBase.g_edicts[player];
                            if (!ent.inuse)
                            {
                                continue;
                            }
                            if (ent.client == null)
                            {
                                continue;
                            }
                            ent.client.pers.inventory[index] = 0;
                        }
                    }
                }
                else
                {
                    activator.client.pers.inventory[index]--;
                }

                GameUtil.G_UseTargets(self, activator);
                self.use = null;
            }
Ejemplo n.º 3
0
        public static void Say_f(edict_t ent, Boolean team, Boolean arg0)
        {
            Int32     i, j;
            edict_t   other;
            String    text;
            gclient_t cl;

            if (Cmd.Argc() < 2 && !arg0)
            {
                return;
            }
            if (0 == (( Int32 )(GameBase.dmflags.value) & (Defines.DF_MODELTEAMS | Defines.DF_SKINTEAMS)))
            {
                team = false;
            }
            if (team)
            {
                text = "(" + ent.client.pers.netname + "): ";
            }
            else
            {
                text = "" + ent.client.pers.netname + ": ";
            }
            if (arg0)
            {
                text += Cmd.Argv(0);
                text += " ";
                text += Cmd.Args();
            }
            else
            {
                if (Cmd.Args().StartsWith("\\\""))
                {
                    text += Cmd.Args().Substring(1, Cmd.Args().Length - 1);
                }
                else
                {
                    text += Cmd.Args();
                }
            }

            if (text.Length > 150)
            {
                text = text.Substring(0, 150);
            }
            text += "\\n";
            if (GameBase.flood_msgs.value != 0)
            {
                cl = ent.client;
                if (GameBase.level.time < cl.flood_locktill)
                {
                    SV_GAME.PF_cprintfhigh(ent, "You can't talk for " + ( Int32 )(cl.flood_locktill - GameBase.level.time) + " more seconds\\n");
                    return;
                }

                i = ( Int32 )(cl.flood_whenhead - GameBase.flood_msgs.value + 1);
                if (i < 0)
                {
                    i = (10) + i;
                }
                if (cl.flood_when[i] != 0 && GameBase.level.time - cl.flood_when[i] < GameBase.flood_persecond.value)
                {
                    cl.flood_locktill = GameBase.level.time + GameBase.flood_waitdelay.value;
                    SV_GAME.PF_cprintf(ent, Defines.PRINT_CHAT, "Flood protection:  You can't talk for " + ( Int32 )GameBase.flood_waitdelay.value + " seconds.\\n");
                    return;
                }

                cl.flood_whenhead = (cl.flood_whenhead + 1) % 10;
                cl.flood_when[cl.flood_whenhead] = GameBase.level.time;
            }

            if (Globals.dedicated.value != 0)
            {
                SV_GAME.PF_cprintf(null, Defines.PRINT_CHAT, "" + text + "");
            }
            for (j = 1; j <= GameBase.game.maxclients; j++)
            {
                other = GameBase.g_edicts[j];
                if (!other.inuse)
                {
                    continue;
                }
                if (other.client == null)
                {
                    continue;
                }
                if (team)
                {
                    if (!GameUtil.OnSameTeam(ent, other))
                    {
                        continue;
                    }
                }

                SV_GAME.PF_cprintf(other, Defines.PRINT_CHAT, "" + text + "");
            }
        }
Ejemplo n.º 4
0
        public static bool Ai_checkattack(edict_t self, float dist)
        {
            float[] temp = new[] { 0f, 0f, 0f };
            bool    hesDeadJim;

            if (self.goalentity != null)
            {
                if ((self.monsterinfo.aiflags & Defines.AI_COMBAT_POINT) != 0)
                {
                    return(false);
                }
                if ((self.monsterinfo.aiflags & Defines.AI_SOUND_TARGET) != 0)
                {
                    if ((GameBase.level.time - self.enemy.teleport_time) > 5)
                    {
                        if (self.goalentity == self.enemy)
                        {
                            if (self.movetarget != null)
                            {
                                self.goalentity = self.movetarget;
                            }
                            else
                            {
                                self.goalentity = null;
                            }
                        }
                        self.monsterinfo.aiflags &= ~Defines.AI_SOUND_TARGET;
                        if ((self.monsterinfo.aiflags & Defines.AI_TEMP_STAND_GROUND) != 0)
                        {
                            self.monsterinfo.aiflags &= ~(Defines.AI_STAND_GROUND | Defines.AI_TEMP_STAND_GROUND);
                        }
                    }
                    else
                    {
                        self.show_hostile = (int)GameBase.level.time + 1;
                        return(false);
                    }
                }
            }

            enemy_vis  = false;
            hesDeadJim = false;
            if ((null == self.enemy) || (!self.enemy.inuse))
            {
                hesDeadJim = true;
            }
            else if ((self.monsterinfo.aiflags & Defines.AI_MEDIC) != 0)
            {
                if (self.enemy.health > 0)
                {
                    hesDeadJim = true;
                    self.monsterinfo.aiflags &= ~Defines.AI_MEDIC;
                }
            }
            else
            {
                if ((self.monsterinfo.aiflags & Defines.AI_BRUTAL) != 0)
                {
                    if (self.enemy.health <= -80)
                    {
                        hesDeadJim = true;
                    }
                }
                else
                {
                    if (self.enemy.health <= 0)
                    {
                        hesDeadJim = true;
                    }
                }
            }

            if (hesDeadJim)
            {
                self.enemy = null;
                if (self.oldenemy != null && self.oldenemy.health > 0)
                {
                    self.enemy    = self.oldenemy;
                    self.oldenemy = null;
                    HuntTarget(self);
                }
                else
                {
                    if (self.movetarget != null)
                    {
                        self.goalentity = self.movetarget;
                        self.monsterinfo.walk.Think(self);
                    }
                    else
                    {
                        self.monsterinfo.pausetime = GameBase.level.time + 100000000;
                        self.monsterinfo.stand.Think(self);
                    }

                    return(true);
                }
            }

            self.show_hostile = (int)GameBase.level.time + 1;
            enemy_vis         = GameUtil.Visible(self, self.enemy);
            if (enemy_vis)
            {
                self.monsterinfo.search_time = GameBase.level.time + 5;
                Math3D.VectorCopy(self.enemy.s.origin, self.monsterinfo.last_sighting);
            }

            enemy_infront = GameUtil.Infront(self, self.enemy);
            enemy_range   = GameUtil.Range(self, self.enemy);
            Math3D.VectorSubtract(self.enemy.s.origin, self.s.origin, temp);
            enemy_yaw = Math3D.Vectoyaw(temp);
            if (self.monsterinfo.attack_state == Defines.AS_MISSILE)
            {
                Ai_run_missile(self);
                return(true);
            }

            if (self.monsterinfo.attack_state == Defines.AS_MELEE)
            {
                Ai_run_melee(self);
                return(true);
            }

            if (!enemy_vis)
            {
                return(false);
            }
            return(self.monsterinfo.checkattack.Think(self));
        }
Ejemplo n.º 5
0
 public override void Use(edict_t self, edict_t other, edict_t activator)
 {
     GameUtil.G_UseTargets(self, activator);
 }
Ejemplo n.º 6
0
            public override void Ai(edict_t self, float dist)
            {
                float[] v = new float[] { 0, 0, 0 };
                edict_t tempgoal;
                edict_t save;
                bool    new1;
                edict_t marker;
                float   d1, d2;
                trace_t tr;

                float[] v_forward = new float[] { 0, 0, 0 }, v_right = new float[] { 0, 0, 0 };
                float   left, center, right;

                float[] left_target = new float[] { 0, 0, 0 }, right_target = new float[] { 0, 0, 0 };
                if ((self.monsterinfo.aiflags & Defines.AI_COMBAT_POINT) != 0)
                {
                    M.M_MoveToGoal(self, dist);
                    return;
                }

                if ((self.monsterinfo.aiflags & Defines.AI_SOUND_TARGET) != 0)
                {
                    Math3D.VectorSubtract(self.s.origin, self.enemy.s.origin, v);
                    if (Math3D.VectorLength(v) < 64)
                    {
                        self.monsterinfo.stand.Think(self);
                        self.spawnflags &= ~1;
                        self.enemy       = null;
                    }
                    else
                    {
                        M.M_MoveToGoal(self, dist);
                    }
                    if (!GameUtil.FindTarget(self))
                    {
                        return;
                    }
                }

                if (Ai_checkattack(self, dist))
                {
                    return;
                }
                if (self.monsterinfo.attack_state == Defines.AS_SLIDING)
                {
                    Ai_run_slide(self, dist);
                    return;
                }

                if (enemy_vis)
                {
                    M.M_MoveToGoal(self, dist);
                    self.monsterinfo.aiflags &= ~Defines.AI_LOST_SIGHT;
                    Math3D.VectorCopy(self.enemy.s.origin, self.monsterinfo.last_sighting);
                    self.monsterinfo.trail_time = GameBase.level.time;
                    return;
                }

                if (GameBase.coop.value != 0)
                {
                    if (GameUtil.FindTarget(self))
                    {
                        return;
                    }
                }

                if ((self.monsterinfo.search_time != 0) && (GameBase.level.time > (self.monsterinfo.search_time + 20)))
                {
                    M.M_MoveToGoal(self, dist);
                    self.monsterinfo.search_time = 0;
                    return;
                }

                save            = self.goalentity;
                tempgoal        = GameUtil.G_Spawn();
                self.goalentity = tempgoal;
                new1            = false;
                if (0 == (self.monsterinfo.aiflags & Defines.AI_LOST_SIGHT))
                {
                    self.monsterinfo.aiflags |= (Defines.AI_LOST_SIGHT | Defines.AI_PURSUIT_LAST_SEEN);
                    self.monsterinfo.aiflags &= ~(Defines.AI_PURSUE_NEXT | Defines.AI_PURSUE_TEMP);
                    new1 = true;
                }

                if ((self.monsterinfo.aiflags & Defines.AI_PURSUE_NEXT) != 0)
                {
                    self.monsterinfo.aiflags    &= ~Defines.AI_PURSUE_NEXT;
                    self.monsterinfo.search_time = GameBase.level.time + 5;
                    if ((self.monsterinfo.aiflags & Defines.AI_PURSUE_TEMP) != 0)
                    {
                        self.monsterinfo.aiflags &= ~Defines.AI_PURSUE_TEMP;
                        marker = null;
                        Math3D.VectorCopy(self.monsterinfo.saved_goal, self.monsterinfo.last_sighting);
                        new1 = true;
                    }
                    else if ((self.monsterinfo.aiflags & Defines.AI_PURSUIT_LAST_SEEN) != 0)
                    {
                        self.monsterinfo.aiflags &= ~Defines.AI_PURSUIT_LAST_SEEN;
                        marker = PlayerTrail.PickFirst(self);
                    }
                    else
                    {
                        marker = PlayerTrail.PickNext(self);
                    }

                    if (marker != null)
                    {
                        Math3D.VectorCopy(marker.s.origin, self.monsterinfo.last_sighting);
                        self.monsterinfo.trail_time = marker.timestamp;
                        self.s.angles[Defines.YAW]  = self.ideal_yaw = marker.s.angles[Defines.YAW];
                        new1 = true;
                    }
                }

                Math3D.VectorSubtract(self.s.origin, self.monsterinfo.last_sighting, v);
                d1 = Math3D.VectorLength(v);
                if (d1 <= dist)
                {
                    self.monsterinfo.aiflags |= Defines.AI_PURSUE_NEXT;
                    dist = d1;
                }

                Math3D.VectorCopy(self.monsterinfo.last_sighting, self.goalentity.s.origin);
                if (new1)
                {
                    tr = GameBase.gi.Trace(self.s.origin, self.mins, self.maxs, self.monsterinfo.last_sighting, self, Defines.MASK_PLAYERSOLID);
                    if (tr.fraction < 1)
                    {
                        Math3D.VectorSubtract(self.goalentity.s.origin, self.s.origin, v);
                        d1     = Math3D.VectorLength(v);
                        center = tr.fraction;
                        d2     = d1 * ((center + 1) / 2);
                        self.s.angles[Defines.YAW] = self.ideal_yaw = Math3D.Vectoyaw(v);
                        Math3D.AngleVectors(self.s.angles, v_forward, v_right, null);
                        Math3D.VectorSet(v, d2, -16, 0);
                        Math3D.G_ProjectSource(self.s.origin, v, v_forward, v_right, left_target);
                        tr   = GameBase.gi.Trace(self.s.origin, self.mins, self.maxs, left_target, self, Defines.MASK_PLAYERSOLID);
                        left = tr.fraction;
                        Math3D.VectorSet(v, d2, 16, 0);
                        Math3D.G_ProjectSource(self.s.origin, v, v_forward, v_right, right_target);
                        tr     = GameBase.gi.Trace(self.s.origin, self.mins, self.maxs, right_target, self, Defines.MASK_PLAYERSOLID);
                        right  = tr.fraction;
                        center = (d1 * center) / d2;
                        if (left >= center && left > right)
                        {
                            if (left < 1)
                            {
                                Math3D.VectorSet(v, d2 * left * 0.5F, -16F, 0F);
                                Math3D.G_ProjectSource(self.s.origin, v, v_forward, v_right, left_target);
                            }

                            Math3D.VectorCopy(self.monsterinfo.last_sighting, self.monsterinfo.saved_goal);
                            self.monsterinfo.aiflags |= Defines.AI_PURSUE_TEMP;
                            Math3D.VectorCopy(left_target, self.goalentity.s.origin);
                            Math3D.VectorCopy(left_target, self.monsterinfo.last_sighting);
                            Math3D.VectorSubtract(self.goalentity.s.origin, self.s.origin, v);
                            self.s.angles[Defines.YAW] = self.ideal_yaw = Math3D.Vectoyaw(v);
                        }
                        else if (right >= center && right > left)
                        {
                            if (right < 1)
                            {
                                Math3D.VectorSet(v, d2 * right * 0.5F, 16F, 0F);
                                Math3D.G_ProjectSource(self.s.origin, v, v_forward, v_right, right_target);
                            }

                            Math3D.VectorCopy(self.monsterinfo.last_sighting, self.monsterinfo.saved_goal);
                            self.monsterinfo.aiflags |= Defines.AI_PURSUE_TEMP;
                            Math3D.VectorCopy(right_target, self.goalentity.s.origin);
                            Math3D.VectorCopy(right_target, self.monsterinfo.last_sighting);
                            Math3D.VectorSubtract(self.goalentity.s.origin, self.s.origin, v);
                            self.s.angles[Defines.YAW] = self.ideal_yaw = Math3D.Vectoyaw(v);
                        }
                    }
                }

                M.M_MoveToGoal(self, dist);
                GameUtil.G_FreeEdict(tempgoal);
                if (self != null)
                {
                    self.goalentity = save;
                }
            }
Ejemplo n.º 7
0
        public static void T_Damage(edict_t targ, edict_t inflictor, edict_t attacker, float[] dir, float[] point, float[] normal, int damage, int knockback, int dflags, int mod)
        {
            gclient_t client;
            int       take;
            int       save;
            int       asave;
            int       psave;
            int       te_sparks;

            if (targ.takedamage == 0)
            {
                return;
            }
            if ((targ != attacker) && ((GameBase.deathmatch.value != 0 && 0 != ((int)(GameBase.dmflags.value) & (Defines.DF_MODELTEAMS | Defines.DF_SKINTEAMS))) || GameBase.coop.value != 0))
            {
                if (GameUtil.OnSameTeam(targ, attacker))
                {
                    if (((int)(GameBase.dmflags.value) & Defines.DF_NO_FRIENDLY_FIRE) != 0)
                    {
                        damage = 0;
                    }
                    else
                    {
                        mod |= Defines.MOD_FRIENDLY_FIRE;
                    }
                }
            }

            GameBase.meansOfDeath = mod;
            if (GameBase.skill.value == 0 && GameBase.deathmatch.value == 0 && targ.client != null)
            {
                damage = ( Int32 )(damage * 0.5);
                if (damage == 0)
                {
                    damage = 1;
                }
            }

            client = targ.client;
            if ((dflags & Defines.DAMAGE_BULLET) != 0)
            {
                te_sparks = Defines.TE_BULLET_SPARKS;
            }
            else
            {
                te_sparks = Defines.TE_SPARKS;
            }
            Math3D.VectorNormalize(dir);
            if (0 == (dflags & Defines.DAMAGE_RADIUS) && (targ.svflags & Defines.SVF_MONSTER) != 0 && (attacker.client != null) && (targ.enemy == null) && (targ.health > 0))
            {
                damage *= 2;
            }
            if ((targ.flags & Defines.FL_NO_KNOCKBACK) != 0)
            {
                knockback = 0;
            }
            if (0 == (dflags & Defines.DAMAGE_NO_KNOCKBACK))
            {
                if ((knockback != 0) && (targ.movetype != Defines.MOVETYPE_NONE) && (targ.movetype != Defines.MOVETYPE_BOUNCE) && (targ.movetype != Defines.MOVETYPE_PUSH) && (targ.movetype != Defines.MOVETYPE_STOP))
                {
                    float[] kvel = new float[] { 0, 0, 0 };
                    float   mass;
                    if (targ.mass < 50)
                    {
                        mass = 50;
                    }
                    else
                    {
                        mass = targ.mass;
                    }
                    if (targ.client != null && attacker == targ)
                    {
                        Math3D.VectorScale(dir, 1600F * (float)knockback / mass, kvel);
                    }
                    else
                    {
                        Math3D.VectorScale(dir, 500F * (float)knockback / mass, kvel);
                    }
                    Math3D.VectorAdd(targ.velocity, kvel, targ.velocity);
                }
            }

            take = damage;
            save = 0;
            if ((targ.flags & Defines.FL_GODMODE) != 0 && 0 == (dflags & Defines.DAMAGE_NO_PROTECTION))
            {
                take = 0;
                save = damage;
                SpawnDamage(te_sparks, point, normal, save);
            }

            if ((client != null && client.invincible_framenum > GameBase.level.framenum) && 0 == (dflags & Defines.DAMAGE_NO_PROTECTION))
            {
                if (targ.pain_debounce_time < GameBase.level.time)
                {
                    GameBase.gi.Sound(targ, Defines.CHAN_ITEM, GameBase.gi.Soundindex("items/protect4.wav"), 1, Defines.ATTN_NORM, 0);
                    targ.pain_debounce_time = GameBase.level.time + 2;
                }

                take = 0;
                save = damage;
            }

            psave  = CheckPowerArmor(targ, point, normal, take, dflags);
            take  -= psave;
            asave  = CheckArmor(targ, point, normal, take, te_sparks, dflags);
            take  -= asave;
            asave += save;
            if (0 == (dflags & Defines.DAMAGE_NO_PROTECTION) && CheckTeamDamage(targ, attacker))
            {
                return;
            }
            if (take != 0)
            {
                if (0 != (targ.svflags & Defines.SVF_MONSTER) || (client != null))
                {
                    SpawnDamage(Defines.TE_BLOOD, point, normal, take);
                }
                else
                {
                    SpawnDamage(te_sparks, point, normal, take);
                }
                targ.health = targ.health - take;
                if (targ.health <= 0)
                {
                    if ((targ.svflags & Defines.SVF_MONSTER) != 0 || (client != null))
                    {
                        targ.flags |= Defines.FL_NO_KNOCKBACK;
                    }
                    Killed(targ, inflictor, attacker, take, point);
                    return;
                }
            }

            if ((targ.svflags & Defines.SVF_MONSTER) != 0)
            {
                M_ReactToDamage(targ, attacker);
                if (0 == (targ.monsterinfo.aiflags & Defines.AI_DUCKED) && (take != 0))
                {
                    targ.pain.Pain(targ, attacker, knockback, take);
                    if (GameBase.skill.value == 3)
                    {
                        targ.pain_debounce_time = GameBase.level.time + 5;
                    }
                }
            }
            else if (client != null)
            {
                if (((targ.flags & Defines.FL_GODMODE) == 0) && (take != 0))
                {
                    targ.pain.Pain(targ, attacker, knockback, take);
                }
            }
            else if (take != 0)
            {
                if (targ.pain != null)
                {
                    targ.pain.Pain(targ, attacker, knockback, take);
                }
            }

            if (client != null)
            {
                client.damage_parmor    += psave;
                client.damage_armor     += asave;
                client.damage_blood     += take;
                client.damage_knockback += knockback;
                Math3D.VectorCopy(point, client.damage_from);
            }
        }
Ejemplo n.º 8
0
        public static void M_ReactToDamage(edict_t targ, edict_t attacker)
        {
            if ((null != attacker.client) && 0 != (attacker.svflags & Defines.SVF_MONSTER))
            {
                return;
            }
            if (attacker == targ || attacker == targ.enemy)
            {
                return;
            }
            if (0 != (targ.monsterinfo.aiflags & Defines.AI_GOOD_GUY))
            {
                if (attacker.client != null || (attacker.monsterinfo.aiflags & Defines.AI_GOOD_GUY) != 0)
                {
                    return;
                }
            }

            if (attacker.client != null)
            {
                targ.monsterinfo.aiflags &= ~Defines.AI_SOUND_TARGET;
                if (targ.enemy != null && targ.enemy.client != null)
                {
                    if (GameUtil.Visible(targ, targ.enemy))
                    {
                        targ.oldenemy = attacker;
                        return;
                    }

                    targ.oldenemy = targ.enemy;
                }

                targ.enemy = attacker;
                if (0 == (targ.monsterinfo.aiflags & Defines.AI_DUCKED))
                {
                    GameUtil.FoundTarget(targ);
                }
                return;
            }

            if (((targ.flags & (Defines.FL_FLY | Defines.FL_SWIM)) == (attacker.flags & (Defines.FL_FLY | Defines.FL_SWIM))) && (!(targ.classname.Equals(attacker.classname))) && (!(attacker.classname.Equals("monster_tank"))) && (!(attacker.classname.Equals("monster_supertank"))) && (!(attacker.classname.Equals("monster_makron"))) && (!(attacker.classname.Equals("monster_jorg"))))
            {
                if (targ.enemy != null && targ.enemy.client != null)
                {
                    targ.oldenemy = targ.enemy;
                }
                targ.enemy = attacker;
                if (0 == (targ.monsterinfo.aiflags & Defines.AI_DUCKED))
                {
                    GameUtil.FoundTarget(targ);
                }
            }
            else if (attacker.enemy == targ)
            {
                if (targ.enemy != null && targ.enemy.client != null)
                {
                    targ.oldenemy = targ.enemy;
                }
                targ.enemy = attacker;
                if (0 == (targ.monsterinfo.aiflags & Defines.AI_DUCKED))
                {
                    GameUtil.FoundTarget(targ);
                }
            }
            else if (attacker.enemy != null && attacker.enemy != targ)
            {
                if (targ.enemy != null && targ.enemy.client != null)
                {
                    targ.oldenemy = targ.enemy;
                }
                targ.enemy = attacker.enemy;
                if (0 == (targ.monsterinfo.aiflags & Defines.AI_DUCKED))
                {
                    GameUtil.FoundTarget(targ);
                }
            }
        }
Ejemplo n.º 9
0
            public override bool Think(edict_t ent)
            {
                float[] origin = new float[] { 0, 0, 0 };
                int     mod;

                if (ent.owner.client != null)
                {
                    PlayerWeapon.PlayerNoise(ent.owner, ent.s.origin, Defines.PNOISE_IMPACT);
                }
                if (ent.enemy != null)
                {
                    float   points = 0;
                    float[] v      = new float[] { 0, 0, 0 };
                    float[] dir    = new float[] { 0, 0, 0 };
                    Math3D.VectorAdd(ent.enemy.mins, ent.enemy.maxs, v);
                    Math3D.VectorMA(ent.enemy.s.origin, 0.5F, v, v);
                    Math3D.VectorSubtract(ent.s.origin, v, v);
                    points = ent.dmg - 0.5F * Math3D.VectorLength(v);
                    Math3D.VectorSubtract(ent.enemy.s.origin, ent.s.origin, dir);
                    if ((ent.spawnflags & 1) != 0)
                    {
                        mod = Defines.MOD_HANDGRENADE;
                    }
                    else
                    {
                        mod = Defines.MOD_GRENADE;
                    }
                    GameCombat.T_Damage(ent.enemy, ent, ent.owner, dir, ent.s.origin, Globals.vec3_origin, (int)points, (int)points, Defines.DAMAGE_RADIUS, mod);
                }

                if ((ent.spawnflags & 2) != 0)
                {
                    mod = Defines.MOD_HELD_GRENADE;
                }
                else if ((ent.spawnflags & 1) != 0)
                {
                    mod = Defines.MOD_HG_SPLASH;
                }
                else
                {
                    mod = Defines.MOD_G_SPLASH;
                }
                GameCombat.T_RadiusDamage(ent, ent.owner, ent.dmg, ent.enemy, ent.dmg_radius, mod);
                Math3D.VectorMA(ent.s.origin, -0.02F, ent.velocity, origin);
                GameBase.gi.WriteByte(Defines.svc_temp_entity);
                if (ent.waterlevel != 0)
                {
                    if (ent.groundentity != null)
                    {
                        GameBase.gi.WriteByte(Defines.TE_GRENADE_EXPLOSION_WATER);
                    }
                    else
                    {
                        GameBase.gi.WriteByte(Defines.TE_ROCKET_EXPLOSION_WATER);
                    }
                }
                else
                {
                    if (ent.groundentity != null)
                    {
                        GameBase.gi.WriteByte(Defines.TE_GRENADE_EXPLOSION);
                    }
                    else
                    {
                        GameBase.gi.WriteByte(Defines.TE_ROCKET_EXPLOSION);
                    }
                }

                GameBase.gi.WritePosition(origin);
                GameBase.gi.Multicast(ent.s.origin, Defines.MULTICAST_PHS);
                GameUtil.G_FreeEdict(ent);
                return(true);
            }
Ejemplo n.º 10
0
        static void Check_dodge(edict_t self, float[] start, float[] dir, int speed)
        {
            float[] end = new float[] { 0, 0, 0 };
            float[] v   = new float[] { 0, 0, 0 };
            trace_t tr;
            float   eta;

            if (GameBase.skill.value == 0)
            {
                if (Lib.Random() > 0.25)
                {
                    return;
                }
            }

            Math3D.VectorMA(start, 8192, dir, end);
            tr = GameBase.gi.Trace(start, null, null, end, self, Defines.MASK_SHOT);
            if ((tr.ent != null) && (tr.ent.svflags & Defines.SVF_MONSTER) != 0 && (tr.ent.health > 0) && (null != tr.ent.monsterinfo.dodge) && GameUtil.Infront(tr.ent, self))
            {
                Math3D.VectorSubtract(tr.endpos, start, v);
                eta = (Math3D.VectorLength(v) - tr.ent.maxs[0]) / speed;
                tr.ent.monsterinfo.dodge.Dodge(tr.ent, self, eta);
            }
        }