Exemple #1
0
/*helper function that provides general frame work for REPL message*/
void _send(cli *client, char *rplNum, char *toSend){
    serv *server =  client->server;
    bstring nick = client->nick;
    char messageBuff[513];
    sprintf(messageBuff, ":%s %s %s %s\r\n",
            charBuffromBstr(server->name), rplNum, charBuffromBstr(nick), toSend);
    safeSend(client, messageBuff);
}
Exemple #2
0
void send_ERR_NICKNAMEINUSE(cli *client, bstring nick){
    serv *server = client->server;
    bstring clientNick = client->nick ? client->nick : safe_BfromCstr("*");
    char messageBuff[513];
    sprintf(messageBuff, ":%s %s %s %s :Nickname is already in use\r\n",
            charBuffromBstr(server->name), ERR_NICKNAMEINUSE,
            charBuffromBstr(clientNick), charBuffromBstr(nick));
    safeSend(client, messageBuff);
}
Exemple #3
0
void sendResetAttack(GameState *gamestate){
    /*
    Skicka iväg till alla klienter att spelarens attack har resettas.
    */
    char string[30];
    int id;

    strcpy(string,"resetAT, ID:000..............");
    id = gamestate->mySlot;
    stringManipulate(id,14,string);
    safeSend(string,gamestate);
}
Exemple #4
0
void sendAttack(GameState *gamestate) {
    /*
    Skickar iväg den spawnade attacken till alla klienter
    */
    char string2[30];
    int id;
    strcpy(string2,"spwnatt, id:000..............");//Strukturen på strängen
    id = gamestate->mySlot;//Spelarens ID

    stringManipulate(id,14,string2);//Lägger in spelarens id i strängen
    printf("trying to send player attack\n");
    safeSend(string2,gamestate);//Skicka iväg till alla
}
Exemple #5
0
void sendCharacterType(GameState *gamestate){
    /*
    Funktionen skickar iväg spelarens Charaktär om han/hon är en Fighter eller mage.
    */
    char string[30];
    int id = gamestate->mySlot;
    int type = gamestate->playerEntity[gamestate->mySlot].characterType; //Charaktären
    strcpy(string,"chartyp, ID:000 Typ:0000....."); //Strukturen på strängen, chartyp förklarar vilken typ av sträng det är så klienterna förstår
    stringManipulate(id,14,string); //Lägger in spelarens ID i strängen
    stringManipulate(type,23,string);//Lägger in Charaktären i strängen
    safeSend(string,gamestate); //Skicka iväg strängen
return;

}
Exemple #6
0
void giveDamage(GameState *gamestate,int i){
    /*
    Funktionen uppdaterar "Healthpoints" på Ains som har blivit slagna av spelaren och skickar iväg det till server
    som sedan skickar den till alla klienter.
    */
    char string[30];
    int hp,id;
    strcpy(string,"givedmg, ID:000 hp:0000......"); //Strukturen på strängen, givedmg förklarar vilken typ av sträng det är så klienterna förstår
    gamestate->AiEntity[i].hpData.currentHp -= gamestate->playerEntity[gamestate->mySlot].strength; //Sänker Ains HP
    hp = gamestate->AiEntity[i].hpData.currentHp;
    stringManipulate(i,14,string); //Lägger in Ains ID som hade blivit attackerad i strängen
    stringManipulate(hp,22,string);//Lägger in Ains HP i strängen.
    safeSend(string,gamestate); //Skicka iväg strängen till servern
return;

}
Exemple #7
0
bool sendMessage(const char *msg, zmq::socket_t &sock, std::string &response, int32_t timeout_us) {
	char tnam[100];
	int pgn_rc = pthread_getname_np(pthread_self(),tnam, 100);
	assert(pgn_rc == 0);

	//NB_MSG << tnam << " sendMessage " << msg << "\n";

	safeSend(sock, msg, strlen(msg));

	char *buf = 0;
	size_t len = 0;
	if (safeRecv(sock, &buf, &len, true, (int64_t)timeout_us)) {
		response = buf;
		return true;
	}
	return false;
}
Exemple #8
0
bool sendMessage(const char *msg, zmq::socket_t &sock, std::string &response,
				 int32_t timeout_us, MessageHeader header) {
	char tnam[100];
	int pgn_rc = pthread_getname_np(pthread_self(),tnam, 100);
	assert(pgn_rc == 0);

	//{FileLogger fl(program_name); fl.f() << tnam << " sendMessage " << msg << "\n"; }

	safeSend(sock, msg, strlen(msg), header);

	char *buf;
	size_t len;
	MessageHeader response_header;
	//bool safeRecv(zmq::socket_t &sock, char **buf, size_t *response_len, bool block, uint64_t timeout, int *source) {
	if (safeRecv(sock, &buf, &len, true, (int64_t)timeout_us, response_header)) {
		response = buf;
		return true;
	}
	return false;
}
Exemple #9
0
void updatePlayerMovement(GameState *gamestate){
        /*
        Funktionen skickar iväg spelarens position till servern som sedan skickar iväg till alla klienter
        */
        char string[30]; //Strängen som ska skickas till servern
        int x,y;
        char xArr[4],yArr[4], facing; //Char strängen där X och Y koordinaterna ska converteras och sedan läggas in i strängen som ska skickas iväg
        sprintf(string,"movplyr, ID:00%d x:0000 y:0000.",gamestate->mySlot); //Strukturen för strängen som ska skickas iväg, movplyr förklarar vilken typ av sträng det är.
        //Här läggs även till spelarens ID (gamestate->mySlot)

        x = getmPosX(&gamestate->playerEntity[gamestate->mySlot]); //Få positionen på spelaren
        stringManipulate(x,21,string);//Convertera och lägg in den i strängen vid positionen 21

        y = getmPosY(&gamestate->playerEntity[gamestate->mySlot]);
        stringManipulate(y,28,string);//Convertera och lägg in den i strängen vid positionen 28

        string[29] = gamestate->playerEntity[gamestate->mySlot].facing + '0';//Lägg in vilket håll spelaren kollar mot i strängen.

        safeSend(string,gamestate); //Skicka iväg
    return;
}
Exemple #10
0
void handleClient(param* p) {
  
   printf("Client connected!:\n");
  
   unsigned int size;
   char* song;
   
   safeRecv(p->sock, &size, sizeof(int), 0);
   
   size = ntohl(size);  
   song = malloc(size+1);
   safeRecv(p->sock, song, size+1, 0);
   
   printf("Requested song:%s \n", song);    
   char* fullSongPath = NULL;   
   findFile(song, MUSIC_DIR, &fullSongPath);
   if (fullSongPath == NULL) {
       printf("Could not find song!\n");
       close(p->sock);
       return;
   }
   
   printf("Playing song:%s\n", fullSongPath);
   fflush(stdout);
   
   int fd = 0;
   if ((fd = open(fullSongPath, O_RDONLY)) > 0) {
      free(song);
      free(fullSongPath);

      struct stat buf;          
      fstat(fd, &buf);
      off_t size = htonl(buf.st_size);
      
      printf("Song has size of:%lu\n", buf.st_size);
      
      safeSend(p->sock, &size, sizeof(off_t), 0);
     
      char buffer[BUFFER_SIZE];
      size_t total = 0; 
      int bufferTotal = 0;
      do {
		
	//Fill the buffer 
	bufferTotal = 0;
	int currentRead = 0;
	while(bufferTotal < BUFFER_SIZE) {
	  currentRead = read (fd, buffer + bufferTotal, BUFFER_SIZE - bufferTotal); 			  
	  if (currentRead < 0) {
	      perror("Could not read file:");
	      break;
	  }	  
	  if (currentRead == 0) {
	      bufferTotal = 0;
	      break;
	  }
	  bufferTotal += currentRead; 
	}

	total += bufferTotal; 
	
	safeSend(p->sock, buffer, bufferTotal, 0);	
	
	printf("Sent so far: %lu out of %lu\n", total, buf.st_size);
      } while (bufferTotal > 0);             
   } else {
     perror("Could not open song:");
   }
   
   size = htonl(size);   
   
   safeSend(p->sock, &size, sizeof(int), 0);   
   free(p);
}
Exemple #11
0
Action::Status SyncRemoteStatesAction::execute()
{
	Channel *chn = dynamic_cast<Channel*>(owner);
	if (internals->process_state == SyncRemoteStatesActionInternals::ps_init) {
		owner->start(this);
		status = Running;
#if 0
		if (!internals->sock){
			internals->sock = new zmq::socket_t(*MessagingInterface::getContext(), ZMQ_PAIR);
			internals->sock->bind("inproc://syncstates");
			chn->addSocket(10, "inproc://syncstates");
		}
#endif
		//assert(chn);
		//assert(chn == internals->chn);
		internals->process_state = SyncRemoteStatesActionInternals::ps_sending_messages;
		if (chn->syncRemoteStates(internals->messages)) {
			internals->iter = new std::list<char*>::iterator(internals->messages.begin());
			if (*internals->iter != internals->messages.end())
				internals->message_state = SyncRemoteStatesActionInternals::e_sending;
			else
				internals->message_state = SyncRemoteStatesActionInternals::e_done;
		}
		else{
			status = Failed;
			error_str = "Failed to sync";
			owner->stop(this);
			return status;
		}
	}

	if (internals->process_state == SyncRemoteStatesActionInternals::ps_sending_messages)
	{
		if (*internals->iter == internals->messages.end()) {
			internals->message_state = SyncRemoteStatesActionInternals::e_done;
		}
		if (internals->message_state == SyncRemoteStatesActionInternals::e_sending) {
			char *current_message = *(*internals->iter);
			internals->header.needReply(false);
			safeSend(*internals->sock, current_message, strlen(current_message), internals->header);
			free( current_message );
			*internals->iter = internals->messages.erase(*internals->iter);
			internals->message_state = SyncRemoteStatesActionInternals::e_receiving;
			// skip receiving temporarily
			internals->message_state = SyncRemoteStatesActionInternals::e_done;
		}
		else if (internals->message_state == SyncRemoteStatesActionInternals::e_receiving) {
			char *buf; size_t len;
			if (safeRecv(*internals->sock, &buf, &len, false, 0, internals->header)) {
				//NB_MSG << "got reply: " << buf << "\n";
				internals->message_state = SyncRemoteStatesActionInternals::e_done;
				delete[] buf;
			}
			else return Running;
		}
		if (internals->message_state == SyncRemoteStatesActionInternals::e_done)  {
			if (*internals->iter != internals->messages.end()) {
				internals->message_state = SyncRemoteStatesActionInternals::e_sending;
			}
			else {
				if (internals->iter) {delete internals->iter; internals->iter =0; }
			}
			if (!internals->iter) { // finished sending messages
				if (internals->process_state == SyncRemoteStatesActionInternals::ps_sending_messages) {
					//safeSend(*cmd_client, "done", 4);
					std::string ack;
					//MessageHeader mh(ChannelInternals::SOCK_CTRL, ChannelInternals::SOCK_CTRL, false);
					//sendMessage("done", *cmd_client, ack, mh);
					internals->header.dest = MessageHeader::SOCK_CTRL;
					internals->header.dest = MessageHeader::SOCK_CTRL;
					internals->header.needReply(true);
					safeSend(*internals->sock, "done", 4, internals->header);
					internals->process_state = SyncRemoteStatesActionInternals::ps_waiting_ack;
				}
			}
		}
	}
	else if (internals->process_state == SyncRemoteStatesActionInternals::ps_waiting_ack) {
		char *ack; size_t len;
		if (safeRecv(*internals->sock, &ack, &len, false, 0, internals->header)) {
			DBG_CHANNELS << "channel " << chn->name << " got " << ack << " from server\n";
			status = Complete;
			result_str = (const char *)ack; // force a new allocation
			delete[] ack;
			owner->stop(this);

			// execute a state change once all other actions are

			if (chn->isClient()) {
				SetStateActionTemplate ssat(CStringHolder("SELF"), "ACTIVE" );
				SetStateAction *ssa = (SetStateAction*)ssat.factory(chn);
				chn->enqueueAction(ssa);
			}
			else {

				SetStateActionTemplate ssat(CStringHolder("SELF"), "DOWNLOADING" );
				chn->enqueueAction(ssat.factory(chn));
			}
			return status;
		}
	}
	return status;
#if 0
	std::stringstream ss;
	ss << owner->getName() << " failed to find machine " << target.get() << " for SetState action" << std::flush;
	std::string str = ss.str();
	error_str = strdup(str.c_str());
	status = Failed;
	owner->stop(this);
	return status;
#endif
}
Exemple #12
0
int startMenu(SDL_Renderer* renderer,GameState *g)
{
       int whichError=0;
       int play = 0;
       int mX,mY,textW,textH,quit=0,players;
       char info[30]="IP:127.0.0.1 players: ";
       char player[10];
       snprintf(player, 30, "%d",players);
       strcat(info,player);
       char cantConnect[25]="Can't Connect to server";
       char serverFull[25]="Server full";
       SDL_Surface *loadedSurface = IMG_Load("textures/PixelMenu2.png");
       SDL_Surface *howToSurface = IMG_Load("textures/HowTo3.png");
       SDL_Event event;
       TTF_Init();
       TTF_Font * font = TTF_OpenFont("textures/LOUDNOISEBLACK.ttf", 20);
       SDL_Color color = {255,0,0};
       SDL_Surface *serverFullSurface = TTF_RenderText_Solid(font,serverFull,color);
       SDL_Surface *cantConnectSurface = TTF_RenderText_Solid(font,cantConnect,color);
        if(loadedSurface==NULL || cantConnectSurface==NULL || howToSurface==NULL)
        {
            printf("%s\n", SDL_GetError());
            SDL_Quit();
            exit(1);
        }
        SDL_SetColorKey(howToSurface, SDL_TRUE, SDL_MapRGB(howToSurface->format, 0xff, 0x00, 0xff));
        SDL_Texture *menuTexture = SDL_CreateTextureFromSurface(renderer,loadedSurface);
        SDL_Texture *cantConnectTexture = SDL_CreateTextureFromSurface(renderer, cantConnectSurface);
        SDL_Texture *howToTexture = SDL_CreateTextureFromSurface(renderer,howToSurface);
        SDL_Texture *serverFullTexture = SDL_CreateTextureFromSurface(renderer,serverFullSurface);
        if(menuTexture == NULL || cantConnectTexture == NULL || howToTexture ==NULL)
        {
            printf("%s\n", SDL_GetError());
            SDL_Quit();
            exit(1);
        }
        SDL_Rect howToRect={0,SCREEN_HEIGHT/3,300,150};
        SDL_QueryTexture(cantConnectTexture,NULL,NULL,&textW,&textH);
        SDL_Rect cantConnectRect = { SCREEN_WIDTH/2-textW/2,SCREEN_HEIGHT/4,textW,textH };
        SDL_QueryTexture(serverFullTexture,NULL,NULL,&textW,&textH);
        SDL_Rect serverFullRect = { SCREEN_WIDTH/2-textW/2,SCREEN_HEIGHT/4,textW,textH };
        //SDL_RenderCopy(renderer,directionsTexture,NULL,NULL);

       if(SDL_RenderCopy(renderer,menuTexture,NULL,NULL)!=0)
       {
           printf("%s RenderCopy fail\n", SDL_GetError());
            SDL_Quit();
            exit(1);
       }
       while(!quit)
       {
            SDL_Delay(16);
            while(SDL_PollEvent(&event))
            {
                //SDL_PumpEvents();
                SDL_GetMouseState(&mX,&mY);

                if( event.type == SDL_QUIT )
                {
                  SDL_Quit();
                  exit(1);
                }
               if(event.type == SDL_MOUSEBUTTONDOWN && (mX>=SCREEN_WIDTH*0.44 && mX<=SCREEN_WIDTH*0.59))
                {
                    if(event.button.button == SDL_BUTTON_LEFT)
                    {
                        if(mY>=SCREEN_HEIGHT*0.375 && mY<= SCREEN_HEIGHT*0.4)
                        {
                                printf("play pressed\n");
                                char newPlayer[30],playerInfo[30];
                                strcpy(newPlayer,"newplyr........................");
                                strcpy(playerInfo,"plyrinf........................");
                                newPlayer[29] = '\n'; //newline
                                newPlayer[30] = '\0'; // null
                                playerInfo[29] = '\n'; //newline
                                playerInfo[30] = '\0'; // null
                                g->socket=TCP_socket_connection();
                                printf("%d",g->socket);
                                if(g->socket==-1){
                                    whichError=1;
                                    printf("Server down\n");
                                    break;
                                }
                               else if(g->socket==-2){
                                    whichError=2;
                                    printf("Server full\n");
                                    break;
                                }
                                pthread_create(&recvThread,NULL,recvfunc,(void *)g);
                                safeSend(newPlayer,g);
                                SDL_Delay(10);
                                safeSend(playerInfo,g);
                                g->slotNeed = 1;
                                play = lobbyMenu(renderer, g);
                                    SDL_FreeSurface(loadedSurface);
                                    SDL_FreeSurface(cantConnectSurface);
                                    SDL_FreeSurface(howToSurface);
                                    SDL_DestroyTexture(howToTexture);
                                    SDL_DestroyTexture(cantConnectTexture);
                                    SDL_DestroyTexture(menuTexture);
                                    TTF_CloseFont(font);
                                    TTF_Quit();
                                return play;

                        }
                        else if(mY>= SCREEN_HEIGHT*0.525 && mY<=SCREEN_HEIGHT*0.59)
                        {
                            SDL_Quit();
                            exit(1);
                        }
                    }

                }
               if(event.type == SDL_MOUSEBUTTONDOWN && (mX>SCREEN_WIDTH*0.296 && mX<SCREEN_WIDTH*0.679))
               {
                    if(event.button.button == SDL_BUTTON_LEFT)
                    {
                        if(mY>=SCREEN_HEIGHT*0.4625 && mY<=SCREEN_HEIGHT*0.52)  //370 && 400
                        {
                                SDL_RenderCopy(renderer,howToTexture,NULL,&howToRect);
                                SDL_RenderPresent(renderer);
                        }
                    }
               }
                if(whichError==1)
                    SDL_RenderCopy(renderer,cantConnectTexture,NULL,&cantConnectRect);
                else if(whichError==2)
                    SDL_RenderCopy(renderer,serverFullTexture,NULL,&cantConnectRect);
                SDL_RenderPresent(renderer);
            }
       }

            SDL_FreeSurface(loadedSurface);
            SDL_FreeSurface(cantConnectSurface);
            SDL_FreeSurface(howToSurface);
            SDL_DestroyTexture(howToTexture);
            SDL_DestroyTexture(cantConnectTexture);
            SDL_DestroyTexture(menuTexture);
            TTF_CloseFont(font);
            TTF_Quit();

return;
}
Exemple #13
0
int lobbyMenu(SDL_Renderer *renderer, GameState *g){
    int mX, mY,textW,textH,players=1,i;
    int quit=0;
    char ready[30];
    int readyToggle=0;
    char connectedPlayers[30]="Connected players: /6 ";
    char readyPlayers[30]="Ready players: /3";
    //SNPRINTF CONNECTED PALYERS
    TTF_Init();
   TTF_Font * font = TTF_OpenFont("textures/LOUDNOISEBLACK.ttf", 20);
   SDL_Color color = {0,0,0};

   SDL_Surface *connectedPlayersSurface = TTF_RenderText_Solid(font,connectedPlayers,color);
   SDL_Texture *connectedPlayersTexture = SDL_CreateTextureFromSurface(renderer,connectedPlayersSurface);
   SDL_QueryTexture(connectedPlayersTexture,NULL,NULL,&textW,&textH);
   SDL_Rect connectedPlayersRect = { SCREEN_WIDTH/10,SCREEN_HEIGHT/6,textW,textH};

   SDL_Surface *readyPlayersSurface = TTF_RenderText_Solid(font,readyPlayers,color);
   SDL_Texture *readyPlayersTexture = SDL_CreateTextureFromSurface(renderer,readyPlayersSurface);
   SDL_QueryTexture(readyPlayersTexture,NULL,NULL,&textW,&textH);
   SDL_Rect readyPlayersRect = { SCREEN_WIDTH/10,SCREEN_HEIGHT/4,textW,textH};

    printf("player ready: %d\nMyslot: %d\n",readyToggle, g->mySlot);
    SDL_Event event;
    SDL_Surface *lobbyMenuSurface = IMG_Load("textures/LobbyReady.png");
    if(lobbyMenuSurface==NULL){
        printf("Loss menu surface failed to load. SDL_ERROR: %s\n",SDL_GetError());
    }
    SDL_Texture *lobbyMenuTexture = SDL_CreateTextureFromSurface(renderer,lobbyMenuSurface);
    if(lobbyMenuTexture==NULL){
        printf("Loss menu texture failed to load. SDL_ERROR: %s\n",SDL_GetError());
    }
    while(!quit){

    for(i=0;i<g->maxPlayers;i++){
        if(g->playerEntityToken[i]!=0){
            ++players;
        }
    }
        stringManipulate(players,18,connectedPlayers);
        stringManipulate(g->rPlayers,14,readyPlayers);
        players = 0;
       connectedPlayersSurface = TTF_RenderText_Solid(font,connectedPlayers,color);
       connectedPlayersTexture = SDL_CreateTextureFromSurface(renderer,connectedPlayersSurface);
       readyPlayersSurface = TTF_RenderText_Solid(font,readyPlayers,color);
       readyPlayersTexture = SDL_CreateTextureFromSurface(renderer,readyPlayersSurface);

       while(SDL_PollEvent(&event)){

            //SDL_PumpEvents();
            SDL_GetMouseState(&mX,&mY);
            if(event.type == SDL_QUIT)
            {
              SDL_Quit();
              exit(1);
            }
            if(event.type == SDL_MOUSEBUTTONDOWN && (mX>SCREEN_WIDTH*0.566 && mX<SCREEN_WIDTH*0.9)) //READY
            {
                if(event.button.button == SDL_BUTTON_LEFT && (mY>= SCREEN_HEIGHT*0.775 && mY<=SCREEN_HEIGHT*0.945))
                {
                    if(readyToggle == 0){
                        lobbyMenuSurface = IMG_Load("textures/LobbyNotReady.png");
                        if(lobbyMenuSurface==NULL){
                            printf("Loss menu surface failed to load. SDL_ERROR: %s\n",SDL_GetError());
                        }
                        lobbyMenuTexture = SDL_CreateTextureFromSurface(renderer,lobbyMenuSurface);
                        strcpy(ready,"plrrdy!, ID:000................");
                        stringManipulate(g->mySlot,14,ready);
                        readyToggle = 1;
                    }
                    else if(readyToggle == 1){
                        lobbyMenuSurface = IMG_Load("textures/LobbyReady.png");
                        if(lobbyMenuSurface==NULL){
                            printf("Loss menu surface failed to load. SDL_ERROR: %s\n",SDL_GetError());
                        }
                        lobbyMenuTexture = SDL_CreateTextureFromSurface(renderer,lobbyMenuSurface);
                        if(lobbyMenuTexture==NULL){
                            printf("Loss menu texture failed to load. SDL_ERROR: %s\n",SDL_GetError());
                        }
                        strcpy(ready,"plrnrdy, ID:000................");
                        stringManipulate(g->mySlot,14,ready);
                        readyToggle = 0;
                      }
                        safeSend(ready,g);
                    }
                    // TODO: skriva you are ready med ttf
                }
               if(event.type == SDL_MOUSEBUTTONDOWN && (mX>SCREEN_WIDTH*0.0675 && mX<SCREEN_WIDTH*0.411)) // MAINMENU
               {
                    if(event.button.button == SDL_BUTTON_LEFT && (mY>=SCREEN_HEIGHT*0.77 && mY<=SCREEN_HEIGHT*0.94))
                    {
                        printf("mein menu pressed\n");
                        return 2;
                    }
               }
        }

        if(g->playMode==1){
            return 1;
        }

        SDL_RenderCopy(renderer,lobbyMenuTexture,NULL,NULL);
        SDL_RenderCopy(renderer,connectedPlayersTexture,NULL,&connectedPlayersRect);
        SDL_RenderCopy(renderer,readyPlayersTexture,NULL,&readyPlayersRect);
        SDL_RenderPresent(renderer);
    }
    return;
}