]> git.rm.cloudns.org Git - xonotic/darkplaces.git/commitdiff
IDWMaster gameroom feature added
authorBrian Bosak <webadm@elcnet.servehttp.com>
Fri, 9 Aug 2013 17:11:42 +0000 (12:11 -0500)
committerBrian Bosak <webadm@elcnet.servehttp.com>
Fri, 9 Aug 2013 19:57:08 +0000 (14:57 -0500)
idwmaster_gameroom.c [new file with mode: 0644]
idwmaster_gameroom.h [new file with mode: 0644]

diff --git a/idwmaster_gameroom.c b/idwmaster_gameroom.c
new file mode 100644 (file)
index 0000000..c892e4d
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+ * idwmaster_gameroom.c
+ *
+ *  Created on: Aug 7, 2013
+ *      Author: IDWMaster
+ */
+
+
+#include "quakedef.h"
+#include "lhnet.h"
+#include "console.h"
+#include <sys/socket.h>
+#include <sys/types.h>
+ #include <arpa/inet.h>
+#include <netinet/in.h>
+#include "thread.h"
+typedef struct {
+       char* hostname;
+       int port;
+       void(*connectDgate)(int);
+} hostinfo;
+
+static mempool_t* idwpool;
+static int callback(void* ptr) {
+       hostinfo* ifo = (hostinfo*)ptr;
+       struct sockaddr_in client;
+
+       memset(&client,0,sizeof(client));
+       client.sin_addr.s_addr = inet_addr(ifo->hostname);
+       client.sin_port = htons(ifo->port);
+       client.sin_family = AF_INET;
+       int sock = socket(AF_INET,SOCK_STREAM,0);
+       int status;
+       if((status = connect(sock,(struct sockaddr_t*)&client,sizeof(client))) <0) {
+               Con_Printf("Connect failed (code %i).\n",status);
+       }else {
+               ifo->connectDgate(sock);
+       }
+
+       Mem_Free(ifo->hostname);
+       Mem_Free(ifo);
+       return 0;
+}
+
+static void TCPConnect(const char* hostname, int port, void(*connectDgate)(int)) {
+       hostinfo* ptr = (hostinfo*)Mem_Alloc(idwpool,sizeof(hostinfo));
+       ptr->connectDgate = connectDgate;
+       ptr->hostname = Mem_Alloc(idwpool,strlen(hostname)+1);
+       ptr->port = port;
+       memcpy(ptr->hostname,hostname,strlen(hostname)+1);
+       Thread_CreateThread(callback,ptr);
+}
+
+static void msgloop(int sock) {
+       unsigned char buffer[2048];
+       while(recv(sock,buffer,sizeof(buffer),0)>0) {
+               unsigned char* ptr = buffer;
+               if(*ptr == 0) {
+                       Con_DPrint("Server found!");
+               }else {
+                       if(*ptr == 1) {
+                               //Chat message (process)
+                               ptr++;
+                               Con_MaskPrint(CON_MASK_CHAT,(char*)ptr);
+                       }
+               }
+
+       }
+}
+static unsigned char xmitpacket[2048];
+static unsigned char* OpenStream() {
+       return xmitpacket;
+}
+static int32_t* getInt(unsigned char** stream) {
+       int32_t* retval = (int32_t*)*stream;
+       (*stream)+=sizeof(int32_t);
+       return retval;
+}
+static void writeString(const char* data,unsigned char** stream) {
+       size_t sz = strlen(data);
+       memcpy(*stream,data,sz+1);
+       (*stream)+=sz+1;
+
+}
+static int _sock;
+static void xmit(unsigned char** stream) {
+       size_t sz = (*stream-xmitpacket);
+       send(_sock,xmitpacket,sz,0);
+}
+
+static void dosay() {
+       unsigned char* stream = OpenStream();
+       if(Cmd_Argc() >0) {
+               *stream = 1;
+               stream++;
+               writeString(Cmd_Args(),&stream);
+               xmit(&stream);
+       }
+}
+//TODO: Also reference mvm_cmds.c to see how builtins work
+static void onConnected(int sock) {
+_sock = sock;
+Con_Print("Connected to backend! Scanning for servers....\n");
+
+Con_MaskPrint(CON_MASK_CHAT,"Welcome to the lobbyist group.\n");
+unsigned char* stream = OpenStream();
+*stream = 0;
+stream++;
+//4 players total
+*getInt(&stream) = 4;
+//CTF mod
+*getInt(&stream) = 1;
+writeString("CTF",&stream);
+xmit(&stream);
+msgloop(sock);
+}
+static void findroom() {
+       Con_Print("Contacting server...\n");
+       TCPConnect("127.0.0.1",1090,onConnected);
+}
+static void getversion() {
+       Con_Print("IDWMaster Protocol version 0.1 Alpha\n");
+}
+void IDWMaster_Init() {
+
+       idwpool = Mem_AllocPool("IDWMaster",0,NULL);
+       Cmd_AddCommand("dsay",dosay,"Says something");
+       Cmd_AddCommand("idwversion",getversion,"Gets the version of the IDWMaster protocol");
+       Cmd_AddCommand("idwfind",findroom,"Finds a game");
+}
diff --git a/idwmaster_gameroom.h b/idwmaster_gameroom.h
new file mode 100644 (file)
index 0000000..d5a837b
--- /dev/null
@@ -0,0 +1,14 @@
+/*
+ * idwmaster_gameroom.h
+ *
+ *  Created on: Aug 7, 2013
+ *      Author: brian
+ */
+
+#ifndef IDWMASTER_GAMEROOM_H_
+#define IDWMASTER_GAMEROOM_H_
+void IDWMaster_Init();
+
+
+
+#endif /* IDWMASTER_GAMEROOM_H_ */