Example #1
0
    public static void SV_SendNop(client_t client)
    {
        MsgWriter msg = new MsgWriter(4);

        msg.MSG_WriteChar(q_shared.svc_nop);

        if (NET_SendUnreliableMessage(client.netconnection, msg) == -1)
        {
            SV_DropClient(true);        // if the message couldn't send, kick off
        }
        client.last_message = realtime;
    }
Example #2
0
    public static void SV_SendReconnect()
    {
        MsgWriter msg = new MsgWriter(128);

        msg.MSG_WriteChar(q_shared.svc_stufftext);
        msg.MSG_WriteString("reconnect\n");
        NET_SendToAll(msg, 5);

        if (cls.state != cactive_t.ca_dedicated)
        {
            Cmd_ExecuteString("reconnect\n", cmd_source_t.src_command);
        }
    }
Example #3
0
    public static void SV_WriteClientdataToMessage(edict_t ent, MsgWriter msg)
    {
        //
        // send a damage message
        //
        if (ent.v.dmg_take != 0 || ent.v.dmg_save != 0)
        {
            edict_t other = PROG_TO_EDICT(ent.v.dmg_inflictor);
            msg.MSG_WriteByte(q_shared.svc_damage);
            msg.MSG_WriteByte((int)ent.v.dmg_save);
            msg.MSG_WriteByte((int)ent.v.dmg_take);
            msg.MSG_WriteCoord(other.v.origin.x + 0.5f * (other.v.mins.x + other.v.maxs.x));
            msg.MSG_WriteCoord(other.v.origin.y + 0.5f * (other.v.mins.y + other.v.maxs.y));
            msg.MSG_WriteCoord(other.v.origin.z + 0.5f * (other.v.mins.z + other.v.maxs.z));

            ent.v.dmg_take = 0;
            ent.v.dmg_save = 0;
        }

        //
        // send the current viewpos offset from the view entity
        //
        SV_SetIdealPitch();             // how much to look up / down ideally

        // a fixangle might get lost in a dropped packet.  Oh well.
        if (ent.v.fixangle != 0)
        {
            msg.MSG_WriteByte(q_shared.svc_setangle);
            msg.MSG_WriteAngle(ent.v.angles.x);
            msg.MSG_WriteAngle(ent.v.angles.y);
            msg.MSG_WriteAngle(ent.v.angles.z);
            ent.v.fixangle = 0;
        }

        int bits = 0;

        if (ent.v.view_ofs.z != q_shared.DEFAULT_VIEWHEIGHT)
        {
            bits |= q_shared.SU_VIEWHEIGHT;
        }

        if (ent.v.idealpitch != 0)
        {
            bits |= q_shared.SU_IDEALPITCH;
        }

        // stuff the sigil bits into the high bits of items for sbar, or else
        // mix in items2
        float val = GetEdictFieldFloat(ent, "items2", 0);
        int   items;

        if (val != 0)
        {
            items = (int)ent.v.items | ((int)val << 23);
        }
        else
        {
            items = (int)ent.v.items | ((int)pr_global_struct.serverflags << 28);
        }

        bits |= q_shared.SU_ITEMS;

        if (((int)ent.v.flags & q_shared.FL_ONGROUND) != 0)
        {
            bits |= q_shared.SU_ONGROUND;
        }

        if (ent.v.waterlevel >= 2)
        {
            bits |= q_shared.SU_INWATER;
        }

        if (ent.v.punchangle.x != 0)
        {
            bits |= q_shared.SU_PUNCH1;
        }
        if (ent.v.punchangle.y != 0)
        {
            bits |= q_shared.SU_PUNCH2;
        }
        if (ent.v.punchangle.z != 0)
        {
            bits |= q_shared.SU_PUNCH3;
        }

        if (ent.v.velocity.x != 0)
        {
            bits |= q_shared.SU_VELOCITY1;
        }
        if (ent.v.velocity.y != 0)
        {
            bits |= q_shared.SU_VELOCITY2;
        }
        if (ent.v.velocity.z != 0)
        {
            bits |= q_shared.SU_VELOCITY3;
        }

        if (ent.v.weaponframe != 0)
        {
            bits |= q_shared.SU_WEAPONFRAME;
        }

        if (ent.v.armorvalue != 0)
        {
            bits |= q_shared.SU_ARMOR;
        }

        //	if (ent.v.weapon)
        bits |= q_shared.SU_WEAPON;

        // send the data

        msg.MSG_WriteByte(q_shared.svc_clientdata);
        msg.MSG_WriteShort(bits);

        if ((bits & q_shared.SU_VIEWHEIGHT) != 0)
        {
            msg.MSG_WriteChar((int)ent.v.view_ofs.z);
        }

        if ((bits & q_shared.SU_IDEALPITCH) != 0)
        {
            msg.MSG_WriteChar((int)ent.v.idealpitch);
        }

        if ((bits & q_shared.SU_PUNCH1) != 0)
        {
            msg.MSG_WriteChar((int)ent.v.punchangle.x);
        }
        if ((bits & q_shared.SU_VELOCITY1) != 0)
        {
            msg.MSG_WriteChar((int)(ent.v.velocity.x / 16));
        }

        if ((bits & q_shared.SU_PUNCH2) != 0)
        {
            msg.MSG_WriteChar((int)ent.v.punchangle.y);
        }
        if ((bits & q_shared.SU_VELOCITY2) != 0)
        {
            msg.MSG_WriteChar((int)(ent.v.velocity.y / 16));
        }

        if ((bits & q_shared.SU_PUNCH3) != 0)
        {
            msg.MSG_WriteChar((int)ent.v.punchangle.z);
        }
        if ((bits & q_shared.SU_VELOCITY3) != 0)
        {
            msg.MSG_WriteChar((int)(ent.v.velocity.z / 16));
        }

        // always sent
        msg.MSG_WriteLong(items);

        if ((bits & q_shared.SU_WEAPONFRAME) != 0)
        {
            msg.MSG_WriteByte((int)ent.v.weaponframe);
        }
        if ((bits & q_shared.SU_ARMOR) != 0)
        {
            msg.MSG_WriteByte((int)ent.v.armorvalue);
        }
        if ((bits & q_shared.SU_WEAPON) != 0)
        {
            msg.MSG_WriteByte(SV_ModelIndex(GetString(ent.v.weaponmodel)));
        }

        msg.MSG_WriteShort((int)ent.v.health);
        msg.MSG_WriteByte((int)ent.v.currentammo);
        msg.MSG_WriteByte((int)ent.v.ammo_shells);
        msg.MSG_WriteByte((int)ent.v.ammo_nails);
        msg.MSG_WriteByte((int)ent.v.ammo_rockets);
        msg.MSG_WriteByte((int)ent.v.ammo_cells);

        if (_GameKind == GameKind.StandardQuake)
        {
            msg.MSG_WriteByte((int)ent.v.weapon);
        }
        else
        {
            for (int i = 0; i < 32; i++)
            {
                if ((((int)ent.v.weapon) & (1 << i)) != 0)
                {
                    msg.MSG_WriteByte(i);
                    break;
                }
            }
        }
    }