From da992db55135270eadb18001d6d0bb77e092d855 Mon Sep 17 00:00:00 2001 From: Spoike Date: Fri, 29 Jul 2016 20:25:48 +0000 Subject: [PATCH] qc: add a crossproduct builtin. because I can. and it saves having to remember the orders. irc: fixed the irc plugin. again. properly this time. hopefully. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5013 fc73d0e0-1445-4013-8a0c-d673dee63da5 --- engine/client/pr_csqc.c | 2 + engine/client/pr_menu.c | 1 + engine/common/pr_bgcmd.c | 5 ++ engine/common/pr_common.h | 1 + engine/server/pr_cmds.c | 2 + plugins/irc/ircclient.c | 99 +++++++++++++++++++++++++++++++-------- 6 files changed, 90 insertions(+), 20 deletions(-) diff --git a/engine/client/pr_csqc.c b/engine/client/pr_csqc.c index 3696e4a09..e502a8e38 100644 --- a/engine/client/pr_csqc.c +++ b/engine/client/pr_csqc.c @@ -5597,6 +5597,8 @@ static struct { {"frameforname", PF_frameforname, 276},//void(float modidx, string framename) frameforname = #276 (FTE_CSQC_SKELETONOBJECTS) {"frameduration", PF_frameduration, 277},//void(float modidx, float framenum) frameduration = #277 (FTE_CSQC_SKELETONOBJECTS) + {"crossproduct", PF_crossproduct, 0}, + #ifdef TERRAIN {"terrain_edit", PF_terrain_edit, 278},//void(float action, vector pos, float radius, float quant) terrain_edit = #278 (??FTE_TERRAIN_EDIT??) {"brush_get", PF_brush_get, 0}, diff --git a/engine/client/pr_menu.c b/engine/client/pr_menu.c index 34702d3ef..b1b43b7a6 100644 --- a/engine/client/pr_menu.c +++ b/engine/client/pr_menu.c @@ -2004,6 +2004,7 @@ static struct { {"vlen", PF_vlen, 9}, {"vectoyaw", PF_vectoyaw, 10}, {"vectoangles", PF_vectoangles, 11}, + {"crossproduct", PF_crossproduct, 0}, {"random", PF_random, 12}, {"localcmd", PF_localcmd, 13}, {"cvar", PF_menu_cvar, 14}, diff --git a/engine/common/pr_bgcmd.c b/engine/common/pr_bgcmd.c index 953d5bc01..4fa82feb7 100644 --- a/engine/common/pr_bgcmd.c +++ b/engine/common/pr_bgcmd.c @@ -4659,6 +4659,11 @@ void QCBUILTIN PF_vectorvectors (pubprogfuncs_t *prinst, struct globalvars_s *pr VectorVectors(world->g.v_forward, world->g.v_right, world->g.v_up); } +void QCBUILTIN PF_crossproduct (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals) +{ + CrossProduct(G_VECTOR(OFS_PARM0), G_VECTOR(OFS_PARM1), G_VECTOR(OFS_RETURN)); +} + //Maths functions //////////////////////////////////////////////////// /* diff --git a/engine/common/pr_common.h b/engine/common/pr_common.h index e9ba59408..445d0d5d7 100644 --- a/engine/common/pr_common.h +++ b/engine/common/pr_common.h @@ -94,6 +94,7 @@ void QCBUILTIN PF_floor (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals void QCBUILTIN PF_ceil (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals); void QCBUILTIN PF_anglemod (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals); void QCBUILTIN PF_vectorvectors (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals); +void QCBUILTIN PF_crossproduct (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals); void QCBUILTIN PF_Tokenize (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals); void QCBUILTIN PF_tokenizebyseparator (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals); void QCBUILTIN PF_tokenize_console (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals); diff --git a/engine/server/pr_cmds.c b/engine/server/pr_cmds.c index 8c325cc79..3f090ef2d 100644 --- a/engine/server/pr_cmds.c +++ b/engine/server/pr_cmds.c @@ -9982,6 +9982,8 @@ BuiltinList_t BuiltinList[] = { //nq qw h2 ebfs {"frameforname", PF_frameforname, 0, 0, 0, 276, D("float(float modidx, string framename)", "Looks up a framegroup from a model by name, avoiding the need for hardcoding. Returns -1 on error.")},// (FTE_CSQC_SKELETONOBJECTS) {"frameduration", PF_frameduration, 0, 0, 0, 277, D("float(float modidx, float framenum)", "Retrieves the duration (in seconds) of the specified framegroup.")},// (FTE_CSQC_SKELETONOBJECTS) + {"crossproduct", PF_crossproduct, 0, 0, 0, 0, D("#define dotproduct(v1,v2) ((vector)(v1)*(vector)(v2))\nvector(vector v1, vector v2)", "Small helper function to calculate the crossproduct of two vectors.")}, + #ifdef TERRAIN {"terrain_edit", PF_terrain_edit, 0, 0, 0, 278, D("void(float action, optional vector pos, optional float radius, optional float quant, ...)", "Realtime terrain editing. Actions are the TEREDIT_ constants.")},// (??FTE_TERRAIN_EDIT?? diff --git a/plugins/irc/ircclient.c b/plugins/irc/ircclient.c index 7ed8bafaf..1eb30452a 100644 --- a/plugins/irc/ircclient.c +++ b/plugins/irc/ircclient.c @@ -13,6 +13,9 @@ #include #include "../../engine/common/netinc.h" +#define handleisvalid(h) ((h)>=0) +#define invalid_handle -1 + enum tlsmode_e { TLS_OFF, @@ -466,6 +469,7 @@ ircclient_t *IRC_Create(const char *server, const char *nick, const char *realna irc->connecting = true; irc->tlsmode = TLS_OFF; irc->quitting = false; + irc->socket = invalid_handle; Q_strlcpy(irc->server, server, sizeof(irc->server)); @@ -512,7 +516,7 @@ qboolean IRC_Establish(ircclient_t *irc) if (!irc) return false; - if (irc->socket) //don't need to do anything. + if (handleisvalid(irc->socket)) //don't need to do anything. return true; //clear up any stale state @@ -524,7 +528,7 @@ qboolean IRC_Establish(ircclient_t *irc) //not yet blocking. So no frequent attempts please... //non blocking prevents connect from returning worthwhile sensible value. - if ((qintptr_t)irc->socket < 0) + if (!handleisvalid(irc->socket)) { Con_Printf("IRC_OpenSocket: couldn't connect\n"); return false; @@ -535,7 +539,7 @@ qboolean IRC_Establish(ircclient_t *irc) if (pNet_SetTLSClient(irc->socket, irc->server) < 0) { pNet_Close(irc->socket); - irc->socket = 0; + irc->socket = invalid_handle; return false; } } @@ -635,12 +639,15 @@ void IRC_PartChannelInternal(ircclient_t *irc, char *channelname) if (pwd) *pwd++ = 0; - if (*irc->autochannels) - Q_strncatz(irc->autochannels, " ", sizeof(irc->autochannels)); - if (pwd) - Q_strncatz(irc->autochannels, va("%s,%s", chan, pwd), sizeof(irc->autochannels)); - else - Q_strncatz(irc->autochannels, va("%s", chan), sizeof(irc->autochannels)); + if (strcmp(chan, channelname)) + { + if (*irc->autochannels) + Q_strncatz(irc->autochannels, " ", sizeof(irc->autochannels)); + if (pwd) + Q_strncatz(irc->autochannels, va("%s,%s", chan, pwd), sizeof(irc->autochannels)); + else + Q_strncatz(irc->autochannels, va("%s", chan), sizeof(irc->autochannels)); + } } chan = strtok(NULL, " "); } @@ -1174,7 +1181,7 @@ void numbered_command(int comm, char *msg, ircclient_t *irc) // move vars up 1 m { IRC_Printf(irc, DEFAULTCONSOLE, COLOURYELLOW "STARTTLS Failed: %s\n", casevar[3]); pNet_Close(irc->socket); - irc->socket = 0; + irc->socket = invalid_handle; return; } } @@ -1606,7 +1613,7 @@ qintptr_t IRC_ConsoleLink(qintptr_t *args) if (!strcmp(what, "reconnect")) { - if (irc->socket) + if (handleisvalid(irc->socket)) IRC_Printf(irc, channel, "Already %s.\n", irc->connecting?"reconnecting":"connected"); else if (IRC_Establish(irc)) IRC_Printf(irc, channel, "Reconnecting...\n"); @@ -2236,7 +2243,7 @@ qintptr_t IRC_Frame(qintptr_t *args) for (ircclient = ircclients; ircclient; ircclient = ircclient->next) { int stat = IRC_CONTINUE; - if (!ircclient->socket) + if (!handleisvalid(ircclient->socket)) continue; //this connection isn't enabled. while(stat == IRC_CONTINUE) { @@ -2256,7 +2263,7 @@ qintptr_t IRC_Frame(qintptr_t *args) if (stat == IRC_KILL) { pNet_Close(ircclient->socket); - ircclient->socket = 0; + ircclient->socket = invalid_handle; IRC_Printf(ircclient, DEFAULTCONSOLE, "Disconnected from irc\n^[[Reconnect]\\act\\reconnect^]\n"); break; //lazy } @@ -2336,13 +2343,65 @@ void IRC_Command(ircclient_t *ircclient, char *dest) IRC_WriteConfig(); } - else if (!strcmp(token+1, "info")) + else if (!strcmp(token+1, "info") || !strcmp(token+1, "status")) { - IRC_Printf(ircclient, dest, "to connect to a server: /connect SERVER \"#chan #chan2,chan2password\" NICK SERVERPASSWORD\n"); - IRC_Printf(ircclient, dest, "to disconnect from a server: /quit\n"); - IRC_Printf(ircclient, dest, "to join a channel: /join\n"); - IRC_Printf(ircclient, dest, "to leave a channel: /part\n"); - IRC_Printf(ircclient, dest, "note that servers and channels will be remembered\n"); + ircclient_t *e; + struct ircice_s *ice; + for (e = ircclients; e; e = e->next) + { + IRC_Printf(ircclient, dest, "SERVER: %s\n", e->server); + if (e->connecting && handleisvalid(e->socket)) + IRC_Printf(ircclient, dest, "\n"); + else if (handleisvalid(e->socket)) + IRC_Printf(ircclient, dest, "\n"); + else + IRC_Printf(ircclient, dest, "\n"); + if (e->quitting) + IRC_Printf(ircclient, dest, "\n"); + switch(e->tlsmode) + { + default: + case TLS_OFF: + IRC_Printf(ircclient, dest, "TLS: insecure\n"); + break; + case TLS_INITIAL: + IRC_Printf(ircclient, dest, "TLS: initial\n"); + break; + case TLS_START: + case TLS_STARTING: + IRC_Printf(ircclient, dest, "TLS: upgrade\n"); + break; + } + IRC_Printf(ircclient, dest, "nick: %s\n", e->nick); + IRC_Printf(ircclient, dest, "realname: %s\n", e->realname); + IRC_Printf(ircclient, dest, "hostname: %s\n", e->hostname); + IRC_Printf(ircclient, dest, "rejoin: %s\n", *e->autochannels?e->autochannels:""); + IRC_Printf(ircclient, dest, "default dest: %s\n", e->defaultdest); + for (ice = e->ice; ice; ice = ice->next) + { + char *allowed=ice->allowed?" allowed":" not-allowed"; + char *accepted=ice->accepted?" accepted":" not-accepted"; + switch(ice->type) + { + default: + case ICEP_INVALID: + IRC_Printf(ircclient, dest, " \n"); + break; + case ICEP_QWSERVER: + IRC_Printf(ircclient, dest, " server: \"%s\"%s%s\n", ice->peer, allowed, accepted); + break; + case ICEP_QWCLIENT: + IRC_Printf(ircclient, dest, " client: \"%s\"%s%s\n", ice->peer, allowed, accepted); + break; + case ICEP_VOICE: + IRC_Printf(ircclient, dest, " voice: \"%s\"%s%s\n", ice->peer, allowed, accepted); + break; + case ICEP_VIDEO: + IRC_Printf(ircclient, dest, " voice: \"%s\"%s%s\n", ice->peer, allowed, accepted); + break; + } + } + } } else if (!ircclient) { @@ -2518,7 +2577,7 @@ void IRC_Command(ircclient_t *ircclient, char *dest) { if (ircclient) { - if (!ircclient->socket) + if (!handleisvalid(ircclient->socket)) IRC_Printf(ircclient, dest, "Connection was closed. use /reconnect\n"); else if (ircclient->tlsmode == TLS_STARTING || ircclient->connecting) IRC_Printf(ircclient, dest, "Still connecting. Please wait.\n");