void GameSendEachUserChoice(user_node *u) { val_type name_val,num_val; resource_node *r; AddIntToPacket(u->object_id); name_val.int_val = SendTopLevelBlakodMessage(u->object_id,USER_NAME_MSG,0,NULL); if (name_val.v.tag != TAG_RESOURCE) { eprintf("GameSendEachUserChoice object %i has non-resource name %i,%i\n", u->object_id,name_val.v.tag,name_val.v.data); AddStringToPacket(0,""); } else { r = GetResourceByID(name_val.v.data); if (r == NULL) { bprintf("GameSendEachUserChoice can't find resource %i as a resource/string\n", name_val.v.data); return; } AddStringToPacket(strlen(r->resource_val),r->resource_val); } num_val.int_val = SendTopLevelBlakodMessage(u->object_id,IS_FIRST_TIME_MSG,0,NULL); if (num_val.v.data != 0) AddByteToPacket(1); /* char has been in game before */ else AddByteToPacket(0); /* char has NOT been in game before */ }
void GameTryGetUser(session_node *s) { char *ptr; if (0 && s->account->type == ACCOUNT_GUEST) /* let guests choose too */ { GameStartUser(s,GetFirstUserByAccountID(s->account->account_id)); } else { AddByteToPacket(BP_CHARACTERS); AddShortToPacket((short)CountUserByAccountID(s->account->account_id)); ForEachUserByAccountID(GameSendEachUserChoice,s->account->account_id); AddStringToPacket(GetMotdLength(),GetMotd()); /* advertising stuff */ AddByteToPacket(2); ptr = LockConfigStr(ADVERTISE_FILE1); AddStringToPacket(strlen(ptr),ptr); UnlockConfigStr(); ptr = LockConfigStr(ADVERTISE_URL1); AddStringToPacket(strlen(ptr),ptr); UnlockConfigStr(); ptr = LockConfigStr(ADVERTISE_FILE2); AddStringToPacket(strlen(ptr),ptr); UnlockConfigStr(); ptr = LockConfigStr(ADVERTISE_URL2); AddStringToPacket(strlen(ptr),ptr); UnlockConfigStr(); SendPacket(s->session_id); } }
void GameEchoPing(session_node *s) { unsigned int token; if (!s || s->state != STATE_GAME || !s->game || s->game->game_state != GAME_NORMAL || s->conn.type == CONN_CONSOLE) { if (s) { s->secure_token = 0; s->sliding_token = NULL; } return; } // BP_PING is sign that client is still alive. // We return a BP_ECHO_PING in response. // We also take this opportunity to choose a new security token, // and tack it onto the BP_ECHO_PING. // // NOTE: This may be called anytime; the client can handle // unrequested BP_ECHO_PINGs to synchronize the security token. token = (s->seeds[0] & 0xFF); AddByteToPacket(BP_ECHO_PING); AddByteToPacket((unsigned char)(token ^ 0xED)); AddIntToPacket(GetSecurityRedbookID()); SendPacket(s->session_id); s->secure_token = token; s->sliding_token = GetSecurityRedbook(); }
void GameSendResync(session_node *s) { int i; for (i=0;i<10;i++) { /* dprintf("got error reading session %i\n",s->session_id); */ AddByteToPacket(BP_RESYNC); SendPacket(s->session_id); } }
void GameClientExit(session_node *s) { AddByteToPacket(BP_QUIT); SendPacket(s->session_id); }
void GameProtocolParse(session_node *s,client_msg *msg) { user_node *u; int object_id; char *ptr; char password[MAX_LOGIN_PASSWORD+1],new_password[MAX_LOGIN_PASSWORD+1]; int len,index; char admin_cmd[500]; int admin_len; int dm_type; GameMessageCount((unsigned char)msg->data[0]); switch ((unsigned char)msg->data[0]) { case BP_REQ_QUIT : GameClientExit(s); SetSessionState(s,STATE_SYNCHED); break; case BP_RESYNC : // dprintf("client said it had an error\n"); GameSyncInit(s); GameSyncProcessSessionBuffer(s); break; case BP_PING : GameEchoPing(s); break; case BP_AD_SELECTED : /* they clicked on an ad; log it */ switch (msg->data[1]) { case 1: ptr = LockConfigStr(ADVERTISE_URL1); lprintf("GameProtocolParse found account %i visited ad 1, %s\n",s->account->account_id, ptr); UnlockConfigStr(); break; case 2: ptr = LockConfigStr(ADVERTISE_URL2); lprintf("GameProtocolParse found account %i visited ad 2, %s\n",s->account->account_id, ptr); UnlockConfigStr(); break; default : eprintf("GameProtocolParse found account %i visited unknown ad %i\n", s->account->account_id,msg->data[1]); } break; case BP_USE_CHARACTER : if (s->game->object_id == INVALID_OBJECT) { object_id = *((int *)(msg->data+1)); u = GetUserByObjectID(object_id); if (u != NULL && u->account_id == s->account->account_id) GameStartUser(s,u); else eprintf("GameProtocolParse can't find user for obj %i in use char!!!\n", object_id); InterfaceUpdateSession(s); } break; case BP_REQ_ADMIN : if (s->account->type != ACCOUNT_ADMIN) { eprintf("GameProtocolParse got admin command from non admin account %i\n", s->account->account_id); break; } admin_len = (int) * ((short *)(msg->data + 1)); if (admin_len > msg->len - 3) return; if (admin_len > sizeof(admin_cmd)-2) return; memcpy(admin_cmd,&msg->data[3],admin_len); admin_cmd[admin_len] = 0; SendSessionAdminText(s->session_id,"> %s\n",admin_cmd); /* echo it to 'em */ TryAdminCommand(s->session_id,admin_cmd); break; case BP_REQ_DM : if (s->account->type != ACCOUNT_ADMIN && s->account->type != ACCOUNT_DM) { eprintf("GameProtocolParse got DM command from non admin or DM account %i\n", s->account->account_id); break; } dm_type = msg->data[1]; admin_len = (int) * ((short *)(msg->data + 2)); if (admin_len > msg->len - 4) return; if (admin_len > sizeof(admin_cmd)-2) return; memcpy(admin_cmd,&msg->data[4],admin_len); admin_cmd[admin_len] = 0; GameDMCommand(s,dm_type,admin_cmd); break; case BP_SEND_CHARACTERS : GameTryGetUser(s); break; case BP_CHANGE_PASSWORD : index = 1; len = *(short *)(msg->data+index); if (index + 2 + len > msg->len) /* 2 = length word len */ break; if (len-1 > sizeof(password)) break; memcpy(password,msg->data+index+2,len); password[len] = 0; /* null terminate string */ index += 2 + len; len = *(short *)(msg->data+index); if (index + 2 + len > msg->len) break; if (len-1 > sizeof(new_password)) break; memcpy(new_password,msg->data+index+2,len); new_password[len] = 0; /* null terminate string */ index += 2 + len; if (strcmp(s->account->password,password)) { AddByteToPacket(BP_PASSWORD_NOT_OK); SendPacket(s->session_id); break; } SetAccountPasswordAlreadyEncrypted(s->account,new_password); AddByteToPacket(BP_PASSWORD_OK); SendPacket(s->session_id); break; default : ClientToBlakodUser(s,msg->len,msg->data); break; } }
void AddBlakodToPacket(val_type obj_size,val_type obj_data) { int num_bytes; char byte1; short byte2; int byte4; string_node *snod; resource_node *r; val_type temp_val; if (obj_size.v.tag != TAG_INT) { bprintf("AddBlakodToPacket looking for int, # of bytes, got %i,%i\n", obj_size.v.tag,obj_size.v.data); return; } num_bytes = obj_size.v.data; if (obj_data.v.tag == TAG_NIL) bprintf("AddBlakodToPacket looking for value, got NIL\n"); /* dprintf("Send %i bytes from %i,%i\n",obj_size.data,obj_data.v.tag,obj_data.v.data); */ switch (obj_data.v.tag) { case TAG_STRING : snod = GetStringByID(obj_data.v.data); if (snod == NULL) { bprintf("AddBlakodToPacket can't find string id %i\n",obj_data.v.data); break; } AddStringToPacket(snod->len_data,snod->data); break; case TAG_TEMP_STRING : snod = GetTempString(); AddStringToPacket(snod->len_data,snod->data); break; default : switch (num_bytes) { case 1 : byte1 = (char) obj_data.v.data; AddByteToPacket(byte1); break; case 2 : byte2 = (short) obj_data.v.data; AddShortToPacket(byte2); break; case 4 : byte4 = (int) obj_data.v.data; AddIntToPacket(byte4); break; case NUMBER_OBJECT : temp_val.int_val = obj_data.int_val; temp_val.v.tag = CLIENT_TAG_NUMBER; byte4 = temp_val.int_val; AddIntToPacket(byte4); break; case STRING_RESOURCE : if (obj_data.v.tag != TAG_RESOURCE) { bprintf("AddBlakodToPacket can't send %i,%i as a resource/string\n", obj_data.v.tag,obj_data.v.data); return; } r = GetResourceByID(obj_data.v.data); if (r == NULL) { bprintf("AddBlakodToPacket can't find resource %i as a resource/string\n", obj_data.v.data); return; } AddStringToPacket(strlen(r->resource_val[0]),r->resource_val[0]); break; default : bprintf("AddBlakodToPacket can't send %i bytes\n",num_bytes); break; } } }