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; }
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); } }
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; } } } }