📄 d_netcmd.c
字号:
// Emacs style mode select -*- C++ -*- //-----------------------------------------------------------------------------//// $Id: d_netcmd.c,v 1.24 2001/04/01 17:35:06 bpereira Exp $//// Copyright (C) 1998-2000 by DooM Legacy Team.//// This program is free software; you can redistribute it and/or// modify it under the terms of the GNU General Public License// as published by the Free Software Foundation; either version 2// of the License, or (at your option) any later version.//// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.////// $Log: d_netcmd.c,v $// Revision 1.24 2001/04/01 17:35:06 bpereira// no message//// Revision 1.23 2001/03/19 21:18:48 metzgermeister// * missing textures in HW mode are replaced by default texture// * fixed crash bug with P_SpawnMissile(.) returning NULL// * deep water trick and other nasty thing work now in HW mode (tested with tnt/map02 eternal/map02)// * added cvar gr_correcttricks//// Revision 1.22 2001/02/24 13:35:19 bpereira// no message//// Revision 1.21 2001/02/10 12:27:13 bpereira// no message//// Revision 1.20 2001/01/25 22:15:41 bpereira// added heretic support//// Revision 1.19 2000/11/26 20:36:14 hurdler// Adding autorun2//// Revision 1.18 2000/11/11 13:59:45 bpereira// no message//// Revision 1.17 2000/11/02 19:49:35 bpereira// no message//// Revision 1.16 2000/10/08 13:30:00 bpereira// no message//// Revision 1.15 2000/09/10 10:39:06 metzgermeister// *** empty log message ***//// Revision 1.14 2000/08/31 14:30:55 bpereira// no message//// Revision 1.13 2000/08/16 14:10:01 hurdler// add master server code//// Revision 1.12 2000/08/10 14:51:25 ydario// OS/2 port//// Revision 1.11 2000/05/13 19:52:10 metzgermeister// cd vol jiggle//// Revision 1.10 2000/04/23 16:19:52 bpereira// no message//// Revision 1.9 2000/04/16 18:38:07 bpereira// no message//// Revision 1.8 2000/04/07 23:11:17 metzgermeister// added mouse move//// Revision 1.7 2000/04/04 00:32:45 stroggonmeth// Initial Boom compatability plus few misc changes all around.//// Revision 1.6 2000/03/29 19:39:48 bpereira// no message//// Revision 1.5 2000/03/06 15:58:47 hurdler// Add Bell Kin's changes//// Revision 1.4 2000/03/05 17:10:56 bpereira// no message//// Revision 1.3 2000/02/27 00:42:10 hurdler// fix CR+LF problem//// Revision 1.2 2000/02/26 00:28:42 hurdler// Mostly bug fix (see borislog.txt 23-2-2000, 24-2-2000)////// DESCRIPTION:// host/client network commands// commands are executed through the command buffer// like console commands// other miscellaneous commands (at the end)////-----------------------------------------------------------------------------#include "doomdef.h"#include "console.h"#include "command.h"#include "d_netcmd.h"#include "i_system.h"#include "dstrings.h"#include "g_game.h"#include "hu_stuff.h"#include "g_input.h"#include "m_menu.h"#include "r_local.h"#include "r_things.h"#include "p_inter.h"#include "p_local.h" #include "p_setup.h"#include "s_sound.h"#include "m_misc.h"#include "am_map.h"#include "byteptr.h"#include "d_netfil.h"#include "p_spec.h"#include "m_cheat.h"#include "d_clisrv.h"#include "v_video.h"#include "d_main.h"// ------// protos// ------void Command_Color_f (void);void Command_Name_f (void);void Command_WeaponPref(void);void Got_NameAndcolor(char **cp,int playernum);void Got_WeaponPref (char **cp,int playernum);void Got_Mapcmd (char **cp,int playernum);void Got_ExitLevelcmd(char **cp,int playernum);void Got_LoadGamecmd (char **cp,int playernum);void Got_SaveGamecmd (char **cp,int playernum);void Got_Pause (char **cp,int playernum);void Got_UseArtefact (char **cp,int playernum);void TeamPlay_OnChange(void);void FragLimit_OnChange(void);void Deahtmatch_OnChange(void);void TimeLimit_OnChange(void);void Command_Playdemo_f (void);void Command_Timedemo_f (void);void Command_Stopdemo_f (void);void Command_Map_f (void);void Command_Restart_f (void);void Command_Addfile (void);void Command_Pause(void);void Command_Frags_f (void);void Command_TeamFrags_f(void);void Command_Version_f (void);void Command_Quit_f (void);void Command_Water_f (void);void Command_ExitLevel_f(void);void Command_Load_f(void);void Command_Save_f(void);void Command_ExitGame_f(void);//Added by Hurdler for master server connectionvoid AddMServCommands(void);// =========================================================================// CLIENT VARIABLES// =========================================================================void SendWeaponPref(void);void SendNameAndColor(void);void SendNameAndColor2(void);// these two are just meant to be saved to the configconsvar_t cv_playername = {"name" ,NULL ,CV_SAVE | CV_CALL | CV_NOINIT,NULL,SendNameAndColor};consvar_t cv_playercolor = {"color" ,"0" ,CV_SAVE | CV_CALL | CV_NOINIT,Color_cons_t,SendNameAndColor};// player's skin, saved for commodity, when using a favorite skins wad..consvar_t cv_skin = {"skin" ,DEFAULTSKIN,CV_SAVE | CV_CALL | CV_NOINIT,NULL /*skin_cons_t*/,SendNameAndColor};consvar_t cv_weaponpref = {"weaponpref" ,"014576328",CV_SAVE | CV_CALL | CV_NOINIT,NULL,SendWeaponPref};consvar_t cv_autoaim = {"autoaim" ,"1" ,CV_SAVE | CV_CALL | CV_NOINIT,CV_OnOff,SendWeaponPref};consvar_t cv_originalweaponswitch = {"originalweaponswitch","0" ,CV_SAVE | CV_CALL | CV_NOINIT,CV_OnOff,SendWeaponPref};// secondary player for splitscreen modeconsvar_t cv_playername2 = {"name2" ,"big b" ,CV_SAVE | CV_CALL | CV_NOINIT,NULL,SendNameAndColor2};consvar_t cv_playercolor2 = {"color2" ,"1" ,CV_SAVE | CV_CALL | CV_NOINIT,Color_cons_t,SendNameAndColor2};consvar_t cv_skin2 = {"skin2" ,DEFAULTSKIN,CV_SAVE | CV_CALL | CV_NOINIT,NULL /*skin_cons_t*/,SendNameAndColor2};CV_PossibleValue_t usemouse_cons_t[]={{0,"Off"},{1,"On"},{2,"Force"},{0,NULL}};#ifdef LMOUSE2CV_PossibleValue_t mouse2port_cons_t[]={{0,"/dev/gpmdata"},{1,"/dev/ttyS0"},{2,"/dev/ttyS1"},{3,"/dev/ttyS2"},{4,"/dev/ttyS3"},{0,NULL}};#elseCV_PossibleValue_t mouse2port_cons_t[]={{1,"COM1"},{2,"COM2"},{3,"COM3"},{4,"COM4"},{0,NULL}};#endif#ifdef LJOYSTICKCV_PossibleValue_t joyport_cons_t[]={{1,"/dev/js0"},{2,"/dev/js1"},{3,"/dev/js2"},{4,"/dev/js3"},{0,NULL}};#endif#ifdef __WIN32__#define usejoystick_cons_t NULL // accept whatever value // it is in fact the joystick device number#else#ifdef __DJGPP__CV_PossibleValue_t usejoystick_cons_t[]={{0,"Off"} ,{1,"4 BUttons"} ,{2,"Standart"} ,{3,"6 Buttons"} ,{4,"Wingman Extreme"} ,{5,"Flightstick Pro"} ,{6,"8 Buttons"} ,{7,"Sidewinder"} ,{8,"GamePad Pro"} ,{9,"Snes lpt1"} ,{10,"Snes lpt2"} ,{11,"Snes lpt3"} ,{12,"Wingman Warrior"} ,{0,NULL}};#else#define usejoystick_cons_t NULL//#error "cv_usejoystick don't have possible value for this OS !"#endif#endifconsvar_t cv_usemouse = {"use_mouse","1", CV_SAVE | CV_CALL,usemouse_cons_t,I_StartupMouse};consvar_t cv_usemouse2 = {"use_mouse2","0", CV_SAVE | CV_CALL,usemouse_cons_t,I_StartupMouse2};consvar_t cv_usejoystick = {"use_joystick","0",CV_SAVE | CV_CALL,usejoystick_cons_t,I_InitJoystick};#ifdef LJOYSTICKextern void I_JoyScale();consvar_t cv_joyport = {"joyport","/dev/js0", CV_SAVE, joyport_cons_t};consvar_t cv_joyscale = {"joyscale","0",CV_SAVE | CV_CALL,NULL,I_JoyScale};#endif#ifdef LMOUSE2consvar_t cv_mouse2port = {"mouse2port","/dev/gpmdata", CV_SAVE, mouse2port_cons_t };consvar_t cv_mouse2opt = {"mouse2opt","0", CV_SAVE, NULL};#elseconsvar_t cv_mouse2port = {"mouse2port","COM2", CV_SAVE, mouse2port_cons_t };#endifCV_PossibleValue_t teamplay_cons_t[]={{0,"Off"},{1,"Color"},{2,"Skin"},{3,NULL}};CV_PossibleValue_t deathmatch_cons_t[]={{0,"Coop"},{1,"1"},{2,"2"},{3,"3"},{0,NULL}};CV_PossibleValue_t fraglimit_cons_t[]={{0,"MIN"},{1000,"MAX"},{0,NULL}};consvar_t cv_teamplay = {"teamplay" ,"0",CV_NETVAR | CV_CALL,teamplay_cons_t, TeamPlay_OnChange};consvar_t cv_teamdamage = {"teamdamage","0",CV_NETVAR,CV_OnOff};consvar_t cv_fraglimit = {"fraglimit" ,"0",CV_NETVAR | CV_CALL | CV_NOINIT,fraglimit_cons_t, FragLimit_OnChange};consvar_t cv_timelimit = {"timelimit" ,"0",CV_NETVAR | CV_CALL | CV_NOINIT,CV_Unsigned, TimeLimit_OnChange};consvar_t cv_deathmatch = {"deathmatch","0",CV_NETVAR | CV_CALL, deathmatch_cons_t, Deahtmatch_OnChange};consvar_t cv_allowexitlevel = {"allowexitlevel" ,"1",CV_NETVAR , CV_YesNo, NULL};consvar_t cv_netstat = {"netstat","0",0,CV_OnOff};// =========================================================================// CLIENT STARTUP// =========================================================================// register client and server commands//void D_RegisterClientCommands (void){ int i; for(i=0;i<MAXSKINCOLORS;i++) Color_cons_t[i].strvalue=Color_Names[i]; // // register commands // RegisterNetXCmd(XD_NAMEANDCOLOR,Got_NameAndcolor); RegisterNetXCmd(XD_WEAPONPREF,Got_WeaponPref); RegisterNetXCmd(XD_MAP,Got_Mapcmd); RegisterNetXCmd(XD_EXITLEVEL,Got_ExitLevelcmd); RegisterNetXCmd(XD_PAUSE,Got_Pause); RegisterNetXCmd(XD_USEARTEFACT,Got_UseArtefact); COM_AddCommand ("playdemo", Command_Playdemo_f); COM_AddCommand ("timedemo", Command_Timedemo_f); COM_AddCommand ("stopdemo", Command_Stopdemo_f); COM_AddCommand ("map", Command_Map_f); COM_AddCommand ("restartlevel", Command_Restart_f); COM_AddCommand ("exitgame",Command_ExitGame_f); COM_AddCommand ("exitlevel",Command_ExitLevel_f); COM_AddCommand ("addfile", Command_Addfile); COM_AddCommand ("pause", Command_Pause); COM_AddCommand ("turbo", Command_Turbo_f); // turbo speed COM_AddCommand ("version", Command_Version_f); COM_AddCommand ("quit", Command_Quit_f); COM_AddCommand ("chatmacro", Command_Chatmacro_f); // hu_stuff.c COM_AddCommand ("setcontrol", Command_Setcontrol_f); COM_AddCommand ("setcontrol2", Command_Setcontrol2_f); COM_AddCommand ("frags",Command_Frags_f); COM_AddCommand ("teamfrags",Command_TeamFrags_f); COM_AddCommand ("saveconfig",Command_SaveConfig_f); COM_AddCommand ("loadconfig",Command_LoadConfig_f); COM_AddCommand ("changeconfig",Command_ChangeConfig_f); COM_AddCommand ("screenshot",M_ScreenShot); // // register main variables // //register these so it is saved to config cv_playername.defaultvalue=I_GetUserName(); if( cv_playername.defaultvalue == NULL ) cv_playername.defaultvalue = "gi joe"; CV_RegisterVar (&cv_playername); CV_RegisterVar (&cv_playercolor); CV_RegisterVar (&cv_weaponpref); CV_RegisterVar (&cv_autoaim); CV_RegisterVar (&cv_originalweaponswitch); // r_things.c (skin NAME) CV_RegisterVar (&cv_skin); // secondary player (splitscreen) CV_RegisterVar (&cv_skin2); CV_RegisterVar (&cv_playername2); CV_RegisterVar (&cv_playercolor2); //FIXME: not to be here.. but needs be done for config loading CV_RegisterVar (&cv_usegamma); //m_menu.c CV_RegisterVar (&cv_crosshair); CV_RegisterVar (&cv_autorun); CV_RegisterVar (&cv_invertmouse); CV_RegisterVar (&cv_alwaysfreelook); CV_RegisterVar (&cv_mousemove); CV_RegisterVar (&cv_showmessages); //see m_menu.c //CV_RegisterVar (&cv_showmessages2); CV_RegisterVar (&cv_autorun2); //CV_RegisterVar (&cv_crosshair2); //CV_RegisterVar (&cv_autoaim2); //CV_RegisterVar (&cv_controlperkey2); //g_input.c CV_RegisterVar (&cv_usemouse2); CV_RegisterVar (&cv_invertmouse2); CV_RegisterVar (&cv_alwaysfreelook2); CV_RegisterVar (&cv_mousemove2); CV_RegisterVar (&cv_mousesens2); CV_RegisterVar (&cv_mlooksens2); CV_RegisterVar (&cv_joystickfreelook); // WARNING : the order is important when inititing mouse2 // we need the mouse2port CV_RegisterVar (&cv_mouse2port); #ifdef LMOUSE2 CV_RegisterVar (&cv_mouse2opt);#endif CV_RegisterVar (&cv_mousesens); CV_RegisterVar (&cv_mlooksens); CV_RegisterVar (&cv_controlperkey); CV_RegisterVar (&cv_usemouse); CV_RegisterVar (&cv_usejoystick);#ifdef LJOYSTICK CV_RegisterVar (&cv_joyport); CV_RegisterVar (&cv_joyscale);#endif CV_RegisterVar (&cv_allowjump); CV_RegisterVar (&cv_allowrocketjump); CV_RegisterVar (&cv_allowautoaim); CV_RegisterVar (&cv_allowturbo); CV_RegisterVar (&cv_allowexitlevel); //s_sound.c CV_RegisterVar (&cv_soundvolume); CV_RegisterVar (&cv_musicvolume); CV_RegisterVar (&cv_numChannels); //i_cdmus.c CV_RegisterVar (&cd_volume); CV_RegisterVar (&cdUpdate);#if defined (LINUX) && !defined (SDL) CV_RegisterVar (&cv_jigglecdvol);#endif // screen.c ? CV_RegisterVar (&cv_fullscreen); // only for opengl so use differant name please and move it to differant place CV_RegisterVar (&cv_scr_depth); CV_RegisterVar (&cv_scr_width); CV_RegisterVar (&cv_scr_height); // add cheat commands, I'm bored of deh patches renaming the idclev ! :-) COM_AddCommand ("noclip", Command_CheatNoClip_f); COM_AddCommand ("god", Command_CheatGod_f); COM_AddCommand ("gimme", Command_CheatGimme_f); // p_mobj.c CV_RegisterVar (&cv_itemrespawntime); CV_RegisterVar (&cv_itemrespawn); CV_RegisterVar (&cv_respawnmonsters); CV_RegisterVar (&cv_respawnmonsterstime); CV_RegisterVar (&cv_fastmonsters); CV_RegisterVar (&cv_splats); // WATER HACK TEST UNTIL FULLY FINISHED COM_AddCommand ("dev_water", Command_Water_f); //misc CV_RegisterVar (&cv_teamplay); CV_RegisterVar (&cv_teamdamage); CV_RegisterVar (&cv_fraglimit); CV_RegisterVar (&cv_deathmatch); CV_RegisterVar (&cv_timelimit); CV_RegisterVar (&cv_playdemospeed); CV_RegisterVar (&cv_netstat); COM_AddCommand ("load",Command_Load_f); RegisterNetXCmd(XD_LOADGAME,Got_LoadGamecmd); COM_AddCommand ("save",Command_Save_f); RegisterNetXCmd(XD_SAVEGAME,Got_SaveGamecmd);/* ideas of commands names from Quake "status" "notarget" "fly" "changelevel" "reconnect" "tell" "kill" "spawn" "begin" "prespawn" "ping" "startdemos" "demos" "stopdemo"*/ //Added by Hurdler for master server connection AddMServCommands();}// =========================================================================// CLIENT STUFF// =========================================================================// name, color, or skin has changed//void SendNameAndColor(void){ char buf[MAXPLAYERNAME+1+SKINNAMESIZE+1],*p; p=buf; WRITEBYTE(p,cv_playercolor.value); WRITESTRINGN(p,cv_playername.string,MAXPLAYERNAME); *(p-1) = 0; // finish teh string; // check if player has the skin loaded (cv_skin may have // the name of a skin that was available in the previous game) cv_skin.value=R_SkinAvailable(cv_skin.string); if (!cv_skin.value) WRITESTRINGN(p,DEFAULTSKIN,SKINNAMESIZE) else WRITESTRINGN(p,cv_skin.string,SKINNAMESIZE); *(p-1) = 0; // finish the string; SendNetXCmd(XD_NAMEANDCOLOR,buf,p-buf);}// splitscreenvoid SendNameAndColor2(void){ char buf[MAXPLAYERNAME+1+SKINNAMESIZE+1],*p; p=buf; WRITEBYTE(p,cv_playercolor2.value); WRITESTRINGN(p,cv_playername2.string,MAXPLAYERNAME); *(p-1) = 0; // finish teh string; // check if player has the skin loaded (cv_skin may have // the name of a skin that was available in the previous game) cv_skin2.value=R_SkinAvailable(cv_skin2.string); if (!cv_skin2.value) WRITESTRINGN(p,DEFAULTSKIN,SKINNAMESIZE) else WRITESTRINGN(p,cv_skin2.string,SKINNAMESIZE); *(p-1) = 0; // finish the string; SendNetXCmd2(XD_NAMEANDCOLOR,buf,p-buf);}void Got_NameAndcolor(char **cp,int playernum){ player_t *p=&players[playernum]; // color p->skincolor=READBYTE(*cp) % MAXSKINCOLORS; // a copy of color if(p->mo) p->mo->flags = (p->mo->flags & ~MF_TRANSLATION)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -