diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 534408aec..83295b9a2 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -73,6 +73,7 @@ static void Got_ExitLevelcmd(UINT8 **cp, INT32 playernum); static void Got_SetupVotecmd(UINT8 **cp, INT32 playernum); static void Got_ModifyVotecmd(UINT8 **cp, INT32 playernum); static void Got_PickVotecmd(UINT8 **cp, INT32 playernum); +static void Got_GiveItemcmd(UINT8 **cp, INT32 playernum); static void Got_RequestAddfilecmd(UINT8 **cp, INT32 playernum); #ifdef DELFILE static void Got_Delfilecmd(UINT8 **cp, INT32 playernum); @@ -203,6 +204,8 @@ static void Command_Archivetest_f(void); #endif #endif +static void Command_KartGiveItem_f(void); + // ========================================================================= // CLIENT VARIABLES // ========================================================================= @@ -393,10 +396,24 @@ consvar_t cv_karteliminatelast = {"karteliminatelast", "Yes", CV_NETVAR|CV_CHEAT consvar_t cv_kartusepwrlv = {"kartusepwrlv", "Yes", CV_NETVAR|CV_CHEAT, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL}; -static CV_PossibleValue_t kartdebugitem_cons_t[] = {{-1, "MIN"}, {NUMKARTITEMS-1, "MAX"}, {0, NULL}}; +static CV_PossibleValue_t kartdebugitem_cons_t[] = +{ +#define FOREACH( name, n ) { n, #name } + KART_ITEM_ITERATOR, +#undef FOREACH + {0} +}; consvar_t cv_kartdebugitem = {"kartdebugitem", "0", CV_NETVAR|CV_CHEAT|CV_NOSHOWHELP, kartdebugitem_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; static CV_PossibleValue_t kartdebugamount_cons_t[] = {{1, "MIN"}, {255, "MAX"}, {0, NULL}}; consvar_t cv_kartdebugamount = {"kartdebugamount", "1", CV_NETVAR|CV_CHEAT|CV_NOSHOWHELP, kartdebugamount_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_kartallowgiveitem = {"kartallowgiveitem", +#ifdef DEVELOP + "Yes", +#else + "No", +#endif + CV_NETVAR|CV_CHEAT|CV_NOSHOWHELP, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL +}; consvar_t cv_kartdebugshrink = {"kartdebugshrink", "Off", CV_NETVAR|CV_CHEAT|CV_NOSHOWHELP, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_kartdebugdistribution = {"kartdebugdistribution", "Off", CV_NETVAR|CV_CHEAT|CV_NOSHOWHELP, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_kartdebughuddrop = {"kartdebughuddrop", "Off", CV_NETVAR|CV_CHEAT|CV_NOSHOWHELP, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -587,6 +604,8 @@ void D_RegisterServerCommands(void) RegisterNetXCmd(XD_MODIFYVOTE, Got_ModifyVotecmd); RegisterNetXCmd(XD_PICKVOTE, Got_PickVotecmd); + RegisterNetXCmd(XD_GIVEITEM, Got_GiveItemcmd); + // Remote Administration CV_RegisterVar(&cv_dummyjoinpassword); COM_AddCommand("joinpassword", Command_ChangeJoinPassword_f); @@ -645,6 +664,8 @@ void D_RegisterServerCommands(void) #endif #endif + COM_AddCommand("kartgiveitem", Command_KartGiveItem_f); + // for master server connection AddMServCommands(); @@ -5726,6 +5747,41 @@ static void Got_PickVotecmd(UINT8 **cp, INT32 playernum) Y_SetupVoteFinish(pick, level); } +static void Got_GiveItemcmd(UINT8 **cp, INT32 playernum) +{ + int item; + int amt; + + INT32 *kartstuff; + + item = READSINT8 (*cp); + amt = READUINT8 (*cp); + + if ( + ( netgame && ! cv_kartallowgiveitem.value ) || + ( item < KITEM_SAD || item >= NUMKARTITEMS ) + ) + { + CONS_Alert(CONS_WARNING, + M_GetText ("Illegal give item received from %s\n"), + player_names[playernum]); + if (server) + { + XBOXSTATIC UINT8 buf[2]; + + buf[0] = (UINT8)playernum; + buf[1] = KICK_MSG_CON_FAIL; + SendNetXCmd(XD_KICK, &buf, 2); + } + return; + } + + kartstuff = players[playernum].kartstuff; + + kartstuff[k_itemtype] = item; + kartstuff[k_itemamount] = amt; +} + /** Prints the number of displayplayers[0]. * * \todo Possibly remove this; it was useful for debugging at one point. @@ -5911,6 +5967,80 @@ static void Command_Archivetest_f(void) #endif #endif +/** Give yourself an, optional quantity or one of, an item. + * + * \sa cv_kartallowgiveitem +*/ +static void Command_KartGiveItem_f(void) +{ + char buf[2]; + + int ac; + const char *name; + int item; + + const char * str; + + int i; + + /* Allow always in local games. */ + if (! netgame || cv_kartallowgiveitem.value) + { + ac = COM_Argc(); + if (ac < 2) + { + CONS_Printf( +"kartgiveitem [amount]: Give yourself an item\n" + ); + } + else + { + item = NUMKARTITEMS; + + name = COM_Argv(1); + + if (isdigit(*name) || *name == '-') + { + item = atoi(name); + } + else + { + for (i = 0; ( str = kartdebugitem_cons_t[i].strvalue ); ++i) + { + if (strcasecmp(name, str) == 0) + { + item = kartdebugitem_cons_t[i].value; + break; + } + } + } + + if (item < NUMKARTITEMS) + { + buf[0] = item; + + if (ac > 2) + buf[1] = atoi(COM_Argv(2)); + else + buf[1] = 1;/* default to one quantity */ + + SendNetXCmd(XD_GIVEITEM, buf, 2); + } + else + { + CONS_Alert(CONS_WARNING, + "No item matches '%s'\n", + name); + } + } + } + else + { + CONS_Alert(CONS_NOTICE, + "The server does not allow this.\n"); + } +} + /** Makes a change to ::cv_forceskin take effect immediately. * * \sa Command_SetForcedSkin_f, cv_forceskin, forcedskin diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 81854bc71..293590220 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -126,7 +126,7 @@ extern consvar_t cv_kartusepwrlv; extern consvar_t cv_votetime; -extern consvar_t cv_kartdebugitem, cv_kartdebugamount, cv_kartdebugshrink, cv_kartdebugdistribution, cv_kartdebughuddrop; +extern consvar_t cv_kartdebugitem, cv_kartdebugamount, cv_kartallowgiveitem, cv_kartdebugshrink, cv_kartdebugdistribution, cv_kartdebughuddrop; extern consvar_t cv_kartdebugcheckpoint, cv_kartdebugnodes, cv_kartdebugcolorize; extern consvar_t cv_kartdebugwaypoints; @@ -187,9 +187,10 @@ typedef enum XD_ACCEPTPARTYINVITE, // 28 XD_LEAVEPARTY, // 29 XD_CANCELPARTYINVITE, // 30 + XD_GIVEITEM, // 31 #ifdef HAVE_BLUA - XD_LUACMD, // 31 - XD_LUAVAR, // 32 + XD_LUACMD, // 32 + XD_LUAVAR, // 33 #endif MAXNETXCMD } netxcmd_t; diff --git a/src/d_player.h b/src/d_player.h index 2465b90ef..18874b7b7 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -200,29 +200,39 @@ typedef enum NUMPOWERS } powertype_t; +/* +To use: #define FOREACH( name, number ) +Do with it whatever you want. +Run this macro, then #undef FOREACH afterward +*/ +#define KART_ITEM_ITERATOR \ + FOREACH (SAD, -1),\ + FOREACH (NONE, 0),\ + FOREACH (SNEAKER, 1),\ + FOREACH (ROCKETSNEAKER, 2),\ + FOREACH (INVINCIBILITY, 3),\ + FOREACH (BANANA, 4),\ + FOREACH (EGGMAN, 5),\ + FOREACH (ORBINAUT, 6),\ + FOREACH (JAWZ, 7),\ + FOREACH (MINE, 8),\ + FOREACH (BALLHOG, 9),\ + FOREACH (SPB, 10),\ + FOREACH (GROW, 11),\ + FOREACH (SHRINK, 12),\ + FOREACH (THUNDERSHIELD, 13),\ + FOREACH (BUBBLESHIELD, 14),\ + FOREACH (FLAMESHIELD, 15),\ + FOREACH (HYUDORO, 16),\ + FOREACH (POGOSPRING, 17),\ + FOREACH (SUPERRING, 18),\ + FOREACH (KITCHENSINK, 19) + typedef enum { - KITEM_SAD = -1, - KITEM_NONE = 0, - KITEM_SNEAKER, - KITEM_ROCKETSNEAKER, - KITEM_INVINCIBILITY, - KITEM_BANANA, - KITEM_EGGMAN, - KITEM_ORBINAUT, - KITEM_JAWZ, - KITEM_MINE, - KITEM_BALLHOG, - KITEM_SPB, - KITEM_GROW, - KITEM_SHRINK, - KITEM_THUNDERSHIELD, - KITEM_BUBBLESHIELD, - KITEM_FLAMESHIELD, - KITEM_HYUDORO, - KITEM_POGOSPRING, - KITEM_SUPERRING, - KITEM_KITCHENSINK, +#define FOREACH( name, n ) KITEM_ ## name = n + KART_ITEM_ITERATOR, +#undef FOREACH NUMKARTITEMS, diff --git a/src/dehacked.c b/src/dehacked.c index 8507a1b03..db94c5227 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -9115,27 +9115,9 @@ struct { // SRB2Kart // kartitems_t - {"KITEM_SAD",KITEM_SAD}, // Actual items (can be set for k_itemtype) - {"KITEM_NONE",KITEM_NONE}, - {"KITEM_SNEAKER",KITEM_SNEAKER}, - {"KITEM_ROCKETSNEAKER",KITEM_ROCKETSNEAKER}, - {"KITEM_INVINCIBILITY",KITEM_INVINCIBILITY}, - {"KITEM_BANANA",KITEM_BANANA}, - {"KITEM_EGGMAN",KITEM_EGGMAN}, - {"KITEM_ORBINAUT",KITEM_ORBINAUT}, - {"KITEM_JAWZ",KITEM_JAWZ}, - {"KITEM_MINE",KITEM_MINE}, - {"KITEM_BALLHOG",KITEM_BALLHOG}, - {"KITEM_SPB",KITEM_SPB}, - {"KITEM_GROW",KITEM_GROW}, - {"KITEM_SHRINK",KITEM_SHRINK}, - {"KITEM_THUNDERSHIELD",KITEM_THUNDERSHIELD}, - {"KITEM_BUBBLESHIELD",KITEM_BUBBLESHIELD}, - {"KITEM_FLAMESHIELD",KITEM_FLAMESHIELD}, - {"KITEM_HYUDORO",KITEM_HYUDORO}, - {"KITEM_POGOSPRING",KITEM_POGOSPRING}, - {"KITEM_SUPERRING",KITEM_SUPERRING}, - {"KITEM_KITCHENSINK",KITEM_KITCHENSINK}, +#define FOREACH( name, n ) { #name, KITEM_ ## name } + KART_ITEM_ITERATOR, // Actual items (can be set for k_itemtype) +#undef FOREACH {"NUMKARTITEMS",NUMKARTITEMS}, {"KRITEM_TRIPLESNEAKER",KRITEM_TRIPLESNEAKER}, // Additional roulette IDs (not usable for much in Lua besides K_GetItemPatch) {"KRITEM_TRIPLEBANANA",KRITEM_TRIPLEBANANA}, diff --git a/src/k_kart.c b/src/k_kart.c index ee4a94efe..423b38a9a 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -629,6 +629,7 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_kartdebugitem); CV_RegisterVar(&cv_kartdebugamount); CV_RegisterVar(&cv_kartdebugshrink); + CV_RegisterVar(&cv_kartallowgiveitem); CV_RegisterVar(&cv_kartdebugdistribution); CV_RegisterVar(&cv_kartdebughuddrop); CV_RegisterVar(&cv_kartdebugwaypoints);