/*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); }
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); }
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); }
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 }
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; }
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; }
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; }
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; }
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; }
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); }
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 }
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; }
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; }