nuclide/src/client/cmd.qc

678 lines
15 KiB
C++
Raw Normal View History

/*
2024-04-22 22:11:12 +00:00
* Copyright (c) 2016-2024 Vera Visions LLC.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
void Commandmenu_Open(void);
void Commandmenu_Close(void);
static void
CMD_testPointLight(void)
{
makevectors(getproperty(VF_ANGLES));
traceline(getproperty(VF_ORIGIN), getproperty(VF_ORIGIN) + v_forward * 4096, FALSE, pSeat->m_ePlayer);
dynamiclight_spawnstatic(trace_endpos + (v_forward * -16), 1024, [1,1,1]);
}
static void
CMD_dev_modeltest(void)
{
entity mt = spawn();
mt.drawmask = MASK_ENGINE;
setmodel(mt, argv(1));
setsize(mt, [0,0,0], [0,0,0]);
setorigin(mt, getproperty(VF_ORIGIN));
mt.angles = getproperty(VF_ANGLES);
mt.angles[0] = mt.angles[2] = 0;
}
static void
CMD_dev_explode(void)
{
makevectors(getproperty(VF_ANGLES));
traceline(getproperty(VF_ORIGIN), getproperty(VF_ORIGIN) + v_forward * 4096, FALSE, pSeat->m_ePlayer);
// FX_Explosion(trace_endpos);
}
static void
CMD_dev_sunpos(void)
{
vector sunpos, sunang;
vector lepos, leang;
makevectors(getproperty(VF_ANGLES));
sunpos = v_forward * -1;
sunang = vectoangles(sunpos);
makevectors(getproperty(VF_ANGLES));
lepos = v_forward * -1;
leang = vectoangles(lepos);
leang[1] -= 180;
leang[0] *= -1;
localcmd(sprintf("r_shadows_throwdirection %v\n", sunpos));
print(sprintf("env_sun: pitch: %d; angle: %d\n", -sunang[0], sunang[1]));
print(sprintf("light_environment: sunangle: %d; pitch: %d\n", leang[1], leang[0]));
}
static void
CMD_dev_measure(void)
{
static vector measurepos;
if (!vlen(measurepos)) {
measurepos = getproperty(VF_ORIGIN);
CSQC_Parse_CenterPrint(sprintf( "First marker set at\n%v", measurepos));
} else {
CSQC_Parse_CenterPrint(sprintf("Distance: %d\n", vlen(measurepos - getproperty(VF_ORIGIN))));
measurepos = [0,0,0];
}
}
static void
CMD_vote(void)
{
if (argv(1) == "yes") {
sendevent("VoteY", "");
} else if (argv(1) == "no") {
sendevent("VoteN", "");
}
}
static void
CMD_getpos(void)
{
print(sprintf("setpos %v;setang -%v\n", getproperty(VF_ORIGIN), getproperty(VF_ANGLES)));
}
static void
CMD_setpos(void)
{
localcmd(sprintf("cmd setpos \"%s\"\n", argv(1)));
}
static void
CMD_setang(void)
{
g_view.SetCameraAngle(stov(argv(1)));
g_view.SetClientAngle(stov(argv(1)));
}
static void
CMD_titles_test(void)
{
GameMessage_Setup(argv(1), 0);
}
static void
CMD_way_menu(void)
{
Way_Autoload();
Textmenu_Call("WAY_MENU");
}
static void
CMD_view_geomtest(void)
{
print(sprintf("geomset %s %s\n", argv(1), argv(2)));
2024-06-22 07:24:13 +00:00
//Weapons_SetGeomset(sprintf("geomset %s %s\n", argv(1), argv(2)));
}
static void
CMD_player_geomtest(void)
{
setcustomskin(pSeat->m_ePlayer, "", sprintf("geomset %s %s\n", argv(1), argv(2)));
}
void
CMD_Cleardecals(void)
{
for (entity e = world; (e = find(e, ::classname, "tempdecal"));) {
2024-06-22 07:24:13 +00:00
NSDecal dcl = (NSDecal)e;
dcl.m_strShader = "";
}
}
/* Wishlist: list size and potential vmem usage */
static void
CMD_ListModels(void)
{
string tmp;
int i = 0i;
int actual_count = 0i;
for (i = -4096; i < 4096; i++) {
tmp = modelnameforindex(i);
if (strlen(tmp) > 1) {
print(sprintf("%i %s\n", i, tmp));
actual_count++;
}
}
print(sprintf("\t%i total models loaded\n", actual_count));
}
/* Wishlist: list size and samplerate/bitdepth */
static void
CMD_ListSounds(void)
{
string tmp;
int i = 0i;
int actual_count = 0i;
float length;
float total_length = 0.0f;
for (i = 0; i < 4096; i++) {
tmp = soundnameforindex(i);
length = soundlength(tmp);
if (strlen(tmp) > 1) {
print(sprintf("%i %s (%f seconds)\n", i, tmp, length));
actual_count++;
total_length += length;
}
}
print(sprintf("\t%i total samples loaded\n", actual_count));
print(sprintf("\t%f seconds worth of samples\n", total_length));
}
static void
CMD_ListParticles(void)
{
string tmp;
int i = 0i;
int actual_count = 0i;
for (i = -4096; i < 4096; i++) {
tmp = particleeffectquery(i, 0);
if (strlen(tmp) > 1) {
print(sprintf("%i %s\n", i, tmp));
actual_count++;
}
}
print(sprintf("\t%i total particles loaded\n", actual_count));
}
static void
CMD_ListTitles(void)
{
int i = 0i;
for (i = 0; i < g_titles_count; i++) {
printf("%s, (x: %d, y: %d)\n",
g_titles[i].m_strName, g_titles[i].m_flPosX, g_titles[i].m_flPosY);
printf("\teffect: %i, fade-in: %f, fade-out: %f\n",
g_titles[i].m_iEffect, g_titles[i].m_flFadeIn, g_titles[i].m_flFadeOut);
printf("\thold-time: %f, fx-time: %f\n",
g_titles[i].m_flHoldTime, g_titles[i].m_flFXTime);
printf("\tcolor 1: %v, color 2: %v\n",
g_titles[i].m_vecColor1, g_titles[i].m_vecColor2);
}
print(sprintf("\t%i total titles loaded\n", g_titles_count));
}
static void
CMD_ListModelFramegroups(void)
{
string modelName = argv(1);
float modelIndex = getmodelindex(modelName);
2023-07-17 05:46:26 +00:00
string temp = "";
printf("// model: %S\n", modelName);
print("typedef enum {\n");
for (int i = 0; i < modelframecount(modelIndex); i++) {
temp = frametoname(modelIndex, i);
printf("\t%s = %i,\n", strtoupper(temp), i);
}
print("} framegroups_e;\n");
}
void
NSWeapon_SelectWeapon(NSWeapon nextWeapon)
{
if (!nextWeapon) {
pSeat->m_iHUDWeaponSelected = 0i;
return;
}
/* this gets passed in NSClientPlayer::ClientInputFrame() to the server */
pSeat->m_iHUDWeaponSelected = nextWeapon.GetSharedID();
2024-09-17 19:46:31 +00:00
pSeat->m_flHUDWeaponSelectTime = time + 0.5f;
}
/*
=================
Cmd_Parse
Called from CSQC_ConsoleCommand to handle any builtin
commands from the Nuclide SDK.
Returns 0 if the command isn't handled and the engine is expected
to handle it from there.
=================
*/
bool
Cmd_Parse(string sCMD)
{
NSClient localPlayer = (NSClient)pSeat->m_ePlayer;
switch (argv(0)) {
case "listFramegroups":
CMD_ListModelFramegroups();
break;
case "listTitles":
CMD_ListTitles();
break;
case "listModels":
CMD_ListModels();
break;
case "listSounds":
CMD_ListSounds();
break;
case "listParticles":
CMD_ListParticles();
break;
case "listClientSoundDef":
Sound_DebugList();
break;
case "listServerSoundDef":
localcmd("sv listSoundDef\n");
break;
case "clearDecals":
CMD_Cleardecals();
break;
case "testPointLight":
CMD_testPointLight();
break;
case "dev_modeltest":
CMD_dev_modeltest();
break;
case "dev_explode":
CMD_dev_explode();
break;
case "dev_sunpos":
CMD_dev_sunpos();
break;
case "dev_measure":
CMD_dev_measure();
break;
case "vote":
CMD_vote();
break;
case "getpos":
CMD_getpos();
break;
case "setpos":
CMD_setpos();
break;
case "setang":
CMD_setang();
break;
case "callvote":
sendevent("CallVote", "s", substring(sCMD, 9, strlen(sCMD)-9));
break;
case "+zoomin":
2024-04-22 22:11:12 +00:00
pSeat->m_iZoomed = true;
break;
case "-zoomin":
2024-04-22 22:11:12 +00:00
pSeat->m_iZoomed = false;
break;
case "buildcubemaps":
CMap_Build();
break;
case "titles_test":
CMD_titles_test();
break;
case "+attack2":
2024-04-22 22:11:12 +00:00
pSeat->m_iInputAttack2 = true;
break;
case "-attack2":
2024-04-22 22:11:12 +00:00
pSeat->m_iInputAttack2 = false;
break;
case "+reload":
2024-04-22 22:11:12 +00:00
pSeat->m_iInputReload = true;
break;
case "-reload":
2024-04-22 22:11:12 +00:00
pSeat->m_iInputReload = false;
break;
2024-04-22 22:11:12 +00:00
case "+activate":
case "+use":
2024-04-22 22:11:12 +00:00
pSeat->m_iInputUse = true;
break;
2024-04-22 22:11:12 +00:00
case "-activate":
case "-use":
2024-04-22 22:11:12 +00:00
pSeat->m_iInputUse = false;
break;
case "+duck":
if (autocvar_pm_crouchToggle == true)
pSeat->m_iInputDuck = 1 - pSeat->m_iInputDuck;
else
pSeat->m_iInputDuck = TRUE;
pSeat->m_bSpecInput = true;
break;
case "-duck":
if (autocvar_pm_crouchToggle == false)
pSeat->m_iInputDuck = FALSE;
pSeat->m_bSpecInput = false;
break;
2024-04-22 22:11:12 +00:00
case "+prone":
pSeat->m_iInputProne = true;
break;
case "-prone":
pSeat->m_iInputProne = false;
break;
case "+sprint":
pSeat->m_iSprinting = true;
break;
case "-sprint":
pSeat->m_iSprinting = false;
break;
case "+leanleft":
pSeat->m_iLeanDir = -1;
break;
case "-leanleft":
pSeat->m_iLeanDir = 0;
break;
case "+leanright":
pSeat->m_iLeanDir = 1;
break;
case "-leanright":
pSeat->m_iLeanDir = 0;
break;
case "goprone":
pSeat->m_dForceStance = STANCE_PRONE;
break;
case "gocrouch":
pSeat->m_dForceStance = STANCE_CROUCH;
break;
case "+gostand":
if (pSeat->m_dForceStance != STANCE_DEFAULT) {
pSeat->m_dForceStance = STANCE_DEFAULT;
} else {
pSeat->m_iInputJump = true;
}
break;
case "-gostand":
pSeat->m_iInputJump = false;
break;
case "weapnext":
NSWeapon_SelectWeapon(localPlayer.GetNextWeapon());
break;
case "weapprev":
NSWeapon_SelectWeapon(localPlayer.GetPreviousWeapon());
break;
case "weaplast":
NSWeapon_SelectWeapon(localPlayer.GetLastWeapon());
break;
case "+showscores":
pSeat->m_iScoresVisible = TRUE;
break;
case "-showscores":
pSeat->m_iScoresVisible = FALSE;
break;
case "way_menu":
CMD_way_menu();
break;
case "_fnchat_msg":
CSQC_Parse_Print(argv(1), PRINT_CHAT);
break;
case "view_geomtest":
CMD_view_geomtest();
break;
case "player_geomtest":
CMD_player_geomtest();
break;
case "motd":
print(MOTD_GetTextBody());
break;
/* XR binds, engine binds them currently */
case "+attack_left":
pSeat->m_bMoveForward = true;
break;
case "-attack_left":
pSeat->m_bMoveForward = false;
break;
case "+menu_left":
break;
case "-menu_left":
break;
case "+attack_right":
pSeat->m_iInputAttack = true;
break;
case "-attack_right":
pSeat->m_iInputAttack = false;
break;
2024-04-22 22:11:12 +00:00
case "+menu_right":
2024-04-22 22:11:12 +00:00
pSeat->m_iInputReload = true;
break;
case "-menu_right":
2024-04-22 22:11:12 +00:00
pSeat->m_iInputReload = false;
break;
/* client aliases for server commands */
case "addBot":
case "killAllBots":
case "resetAllBotsGoals":
case "killClass":
case "killMovables":
case "trigger":
case "input":
case "listBotProfiles":
2024-11-02 09:53:45 +00:00
case "listMapTweaks":
case "listTargets":
case "teleport":
case "teleportToClass":
case "respawnEntities":
case "spawnDef":
case "nodeAdd":
case "nodeDel":
case "nodeFlags":
case "nodeLink":
case "nodeRadius":
case "nodeOffset":
case "nodeUnlink":
2024-04-22 22:11:12 +00:00
case "traceMaterial":
localcmd(sprintf("sv %s\n", sCMD));
2024-04-22 22:11:12 +00:00
break;
/* client aliases for client commands */
case "listInventory":
case "giveInventoryItem":
case "removeInventoryItem":
case "removeAllInventoryItems":
case "listAmmo":
case "joinTeam":
localcmd(sprintf("cmd %s\n", sCMD));
break;
2024-06-22 07:24:13 +00:00
case "listClientEntityDef":
EntityDef_DebugList();
break;
case "listServerEntityDef":
localcmd("sv listEntityDef\n");
break;
2024-04-22 22:11:12 +00:00
case "bobup":
break;
case "bobdn":
break;
case "+commandmenu":
Commandmenu_Open();
break;
case "-commandmenu":
Commandmenu_Close();
break;
case "ragdollCreate":
NSRagdoll_Create(argv(1));
break;
default:
return HUD_ConsoleCommand(sCMD);
}
return (true);
}
/*
=================
Cmd_Init
Register our commands for Nuclide
=================
*/
void
Cmd_Init(void)
{
InitStart();
/* developer/debug commands */
registercommand("listFramegroups");
registercommand("listModels");
registercommand("listSounds");
registercommand("listParticles");
registercommand("listTitles");
registercommand("listClientSoundDef");
registercommand("listServerSoundDef");
2024-04-22 22:11:12 +00:00
registercommand("traceMaterial");
2024-06-22 07:24:13 +00:00
registercommand("listClientEntityDef");
registercommand("listServerEntityDef");
registercommand("listInventory");
registercommand("listAmmo");
registercommand("ragdollCreate");
/* server commands */
registercommand("addBot");
registercommand("killAllBots");
registercommand("resetAllBotsGoals");
registercommand("killClass");
registercommand("killMovables");
registercommand("trigger");
registercommand("input");
registercommand("listTargets");
registercommand("teleport");
registercommand("teleportToClass");
registercommand("respawnEntities");
registercommand("spawnDef");
registercommand("listBotProfiles");
2024-11-02 09:53:45 +00:00
registercommand("listMapTweaks");
/* nav editing */
registercommand("nodeAdd");
registercommand("nodeDel");
registercommand("nodeFlags");
registercommand("nodeLink");
registercommand("nodeRadius");
registercommand("nodeOffset");
registercommand("nodeUnlink");
registercommand("clearDecals");
registercommand("testLight");
registercommand("testPointLight");
registercommand("getpos");
registercommand("setpos");
registercommand("setang");
registercommand("dev_sentence");
registercommand("titles_test");
registercommand("buildcubemaps");
registercommand("dev_sunpos");
registercommand("dev_measure");
registercommand("view_geomtest");
registercommand("player_geomtest");
registercommand("way_menu");
registercommand("dev_explode");
registercommand("dev_modeltest");
/* basic actions */
registercommand("+attack");
registercommand("-attack");
registercommand("+attack2");
registercommand("-attack2");
2024-06-22 07:24:13 +00:00
registercommand("+reload");
registercommand("-reload");
2024-04-22 22:11:12 +00:00
registercommand("+activate");
registercommand("-activate");
registercommand("+use");
registercommand("-use");
registercommand("+duck");
registercommand("-duck");
2024-04-22 22:11:12 +00:00
registercommand("+prone");
registercommand("-prone");
registercommand("goprone");
registercommand("gocrouch");
registercommand("+gostand");
registercommand("-gostand");
registercommand("+sprint");
registercommand("-sprint");
2024-06-22 07:24:13 +00:00
registercommand("+leanleft");
registercommand("-leanleft");
registercommand("+leanright");
registercommand("-leanright");
registercommand("weapnext");
registercommand("weapprev");
registercommand("giveInventoryItem");
registercommand("removeInventoryItem");
registercommand("removeAllInventoryItems");
/* voting */
registercommand("vote");
registercommand("callvote");
/* teamplay */
registercommand("joinTeam");
/* motd */
registercommand("motd");
/* hud weapon selection system */
registercommand("slot1");
registercommand("slot2");
registercommand("slot3");
registercommand("slot4");
registercommand("slot5");
registercommand("slot6");
registercommand("slot7");
registercommand("slot8");
registercommand("slot9");
registercommand("slot10");
/* commandmenu */
registercommand("+commandmenu");
registercommand("-commandmenu");
/* scoreboard */
registercommand("+showscores");
registercommand("-showscores");
/* meant to be hidden */
registercommand("_fnchat_msg");
/* Requested by Slacer */
registercommand("+zoomin");
registercommand("-zoomin");
/* XR binds, temporady until the engine standardizes things */
registercommand("+attack_left");
registercommand("-attack_left");
registercommand("+attack_right");
registercommand("-attack_right");
registercommand("+menu_left");
registercommand("-menu_left");
registercommand("+menu_right");
registercommand("-menu_right");
InitEnd();
}