+ memcpy(out->fields.fp, in->fields.fp, prog->entityfields * sizeof(prvm_vec_t));
+}
+
+//#66 vector() getmousepos (EXT_CSQC)
+static void VM_M_getmousepos(prvm_prog_t *prog)
+{
+ VM_SAFEPARMCOUNT(0,VM_M_getmousepos);
+
+ if (key_consoleactive || (key_dest != key_menu && key_dest != key_menu_grabbed))
+ VectorSet(PRVM_G_VECTOR(OFS_RETURN), 0, 0, 0);
+ else if (in_client_mouse)
+ VectorSet(PRVM_G_VECTOR(OFS_RETURN), in_windowmouse_x * vid_conwidth.integer / vid.width, in_windowmouse_y * vid_conheight.integer / vid.height, 0);
+ else
+ VectorSet(PRVM_G_VECTOR(OFS_RETURN), in_mouse_x * vid_conwidth.integer / vid.width, in_mouse_y * vid_conheight.integer / vid.height, 0);
+}
+
+static void VM_M_crypto_getkeyfp(prvm_prog_t *prog)
+{
+ lhnetaddress_t addr;
+ const char *s;
+ char keyfp[FP64_SIZE + 1];
+
+ VM_SAFEPARMCOUNT(1,VM_M_crypto_getkeyfp);
+
+ s = PRVM_G_STRING( OFS_PARM0 );
+ VM_CheckEmptyString( prog, s );
+
+ if(LHNETADDRESS_FromString(&addr, s, 26000) && Crypto_RetrieveHostKey(&addr, NULL, keyfp, sizeof(keyfp), NULL, 0, NULL, NULL))
+ PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( prog, keyfp );
+ else
+ PRVM_G_INT( OFS_RETURN ) = OFS_NULL;
+}
+static void VM_M_crypto_getidfp(prvm_prog_t *prog)
+{
+ lhnetaddress_t addr;
+ const char *s;
+ char idfp[FP64_SIZE + 1];
+
+ VM_SAFEPARMCOUNT(1,VM_M_crypto_getidfp);
+
+ s = PRVM_G_STRING( OFS_PARM0 );
+ VM_CheckEmptyString( prog, s );
+
+ if(LHNETADDRESS_FromString(&addr, s, 26000) && Crypto_RetrieveHostKey(&addr, NULL, NULL, 0, idfp, sizeof(idfp), NULL, NULL))
+ PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( prog, idfp );
+ else
+ PRVM_G_INT( OFS_RETURN ) = OFS_NULL;
+}
+static void VM_M_crypto_getidstatus(prvm_prog_t *prog)
+{
+ lhnetaddress_t addr;
+ const char *s;
+ qboolean issigned;
+
+ VM_SAFEPARMCOUNT(1,VM_M_crypto_getidstatus);
+
+ s = PRVM_G_STRING( OFS_PARM0 );
+ VM_CheckEmptyString( prog, s );
+
+ if(LHNETADDRESS_FromString(&addr, s, 26000) && Crypto_RetrieveHostKey(&addr, NULL, NULL, 0, NULL, 0, NULL, &issigned))
+ PRVM_G_FLOAT( OFS_RETURN ) = issigned ? 2 : 1;
+ else
+ PRVM_G_FLOAT( OFS_RETURN ) = 0;
+}
+static void VM_M_crypto_getencryptlevel(prvm_prog_t *prog)
+{
+ lhnetaddress_t addr;
+ const char *s;
+ int aeslevel;
+ char vabuf[1024];
+
+ VM_SAFEPARMCOUNT(1,VM_M_crypto_getencryptlevel);
+
+ s = PRVM_G_STRING( OFS_PARM0 );
+ VM_CheckEmptyString( prog, s );
+
+ if(LHNETADDRESS_FromString(&addr, s, 26000) && Crypto_RetrieveHostKey(&addr, NULL, NULL, 0, NULL, 0, &aeslevel, NULL))
+ PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString(prog, aeslevel ? va(vabuf, sizeof(vabuf), "%d AES128", aeslevel) : "0");
+ else
+ PRVM_G_INT( OFS_RETURN ) = OFS_NULL;
+}
+static void VM_M_crypto_getmykeyfp(prvm_prog_t *prog)
+{
+ int i;
+ char keyfp[FP64_SIZE + 1];
+
+ VM_SAFEPARMCOUNT(1,VM_M_crypto_getmykey);
+
+ i = PRVM_G_FLOAT( OFS_PARM0 );
+ switch(Crypto_RetrieveLocalKey(i, keyfp, sizeof(keyfp), NULL, 0, NULL))
+ {
+ case -1:
+ PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString(prog, "");
+ break;
+ case 0:
+ PRVM_G_INT( OFS_RETURN ) = OFS_NULL;
+ break;
+ default:
+ case 1:
+ PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString(prog, keyfp);
+ break;
+ }
+}
+static void VM_M_crypto_getmyidfp(prvm_prog_t *prog)
+{
+ int i;
+ char idfp[FP64_SIZE + 1];
+
+ VM_SAFEPARMCOUNT(1,VM_M_crypto_getmykey);
+
+ i = PRVM_G_FLOAT( OFS_PARM0 );
+ switch(Crypto_RetrieveLocalKey(i, NULL, 0, idfp, sizeof(idfp), NULL))
+ {
+ case -1:
+ PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString(prog, "");
+ break;
+ case 0:
+ PRVM_G_INT( OFS_RETURN ) = OFS_NULL;
+ break;
+ default:
+ case 1:
+ PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString(prog, idfp);
+ break;
+ }
+}
+static void VM_M_crypto_getmyidstatus(prvm_prog_t *prog)
+{
+ int i;
+ qboolean issigned;
+
+ VM_SAFEPARMCOUNT(1,VM_M_crypto_getmykey);
+
+ i = PRVM_G_FLOAT( OFS_PARM0 );
+ switch(Crypto_RetrieveLocalKey(i, NULL, 0, NULL, 0, &issigned))
+ {
+ case -1:
+ PRVM_G_FLOAT( OFS_RETURN ) = 0; // have no ID there
+ break;
+ case 0:
+ PRVM_G_FLOAT( OFS_RETURN ) = -1; // out of range
+ break;
+ default:
+ case 1:
+ PRVM_G_FLOAT( OFS_RETURN ) = issigned ? 2 : 1;
+ break;
+ }