コード例 #1
0
ファイル: Cmd.cs プロジェクト: optimus-code/Q2Sharp
        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 + "");
            }
        }
コード例 #2
0
ファイル: GameCombat.cs プロジェクト: optimus-code/Q2Sharp
        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);
            }
        }