struct mesh *init_line_mesh(double x1, double y1, double z1, double x2, double y2, double z2) { struct mesh *my_mesh = malloc(sizeof(*my_mesh)); if (!my_mesh) return my_mesh; memset(my_mesh, 0, sizeof(*my_mesh)); my_mesh->geometry_mode = MESH_GEOMETRY_LINES; my_mesh->nvertices = 2; my_mesh->ntriangles = 0; my_mesh->nlines = 1; my_mesh->t = 0; my_mesh->v = malloc(sizeof(*my_mesh->v) * 2); my_mesh->l = malloc(sizeof(*my_mesh->l) * 1); my_mesh->tex = 0; my_mesh->radius = fmax(dist3d(x1, y1, z1), dist3d(x2, y2, z2)); my_mesh->graph_ptr = 0; my_mesh->v[0].x = x1; my_mesh->v[0].y = y1; my_mesh->v[0].z = -z1; my_mesh->v[1].x = x2; my_mesh->v[1].y = y2; my_mesh->v[1].z = -z2; my_mesh->l[0].start = &my_mesh->v[0]; my_mesh->l[0].end = &my_mesh->v[1]; my_mesh->l[0].flag = 0; mesh_graph_dev_init(my_mesh); return my_mesh; }
void fisheye_spherical(double x_focus, double y_focus, double z_focus, topview * t) { int i; double distance, distorted_distance, ratio, range; range = 0; for (i = 1; i < t->Nodecount; i++) { if (point_within_sphere_with_coords ((float) x_focus, (float) y_focus, (float) z_focus, (float) view->fmg.R, t->Nodes[i].x, t->Nodes[i].y, t->Nodes[i].z)) { range = MAX(range, dist3d(t->Nodes[i].x, t->Nodes[i].y, t->Nodes[i].z, x_focus, y_focus, z_focus)); } } for (i = 1; i < t->Nodecount; i++) { if (point_within_sphere_with_coords ((float) x_focus, (float) y_focus, (float) z_focus, (float) view->fmg.R, t->Nodes[i].x, t->Nodes[i].y, t->Nodes[i].z)) { distance = dist3d(t->Nodes[i].x, t->Nodes[i].y, t->Nodes[i].z, x_focus, y_focus, z_focus); distorted_distance = G(distance / range) * range; if (distance != 0) { ratio = distorted_distance / distance; } else { ratio = 0; } t->Nodes[i].distorted_x = (float) x_focus + (t->Nodes[i].x - (float) x_focus) * (float) ratio; t->Nodes[i].distorted_y = (float) y_focus + (t->Nodes[i].y - (float) y_focus) * (float) ratio; t->Nodes[i].distorted_z = (float) z_focus + (t->Nodes[i].z - (float) z_focus) * (float) ratio; t->Nodes[i].zoom_factor = (float) 1 *(float) distorted_distance / (float) distance; } else { t->Nodes[i].distorted_x = t->Nodes[i].x; t->Nodes[i].distorted_y = t->Nodes[i].y; t->Nodes[i].distorted_z = t->Nodes[i].z; t->Nodes[i].zoom_factor = 1; } } }
/* safe to call with v == output */ void normalize_vector(struct mat41 *v, struct mat41 *output) { float d; d = dist3d(v->m[0], v->m[1], v->m[2]); output->m[0] = v->m[0] / d; output->m[1] = v->m[1] / d; output->m[2] = v->m[2] / d; }
float mesh_compute_radius(struct mesh *m) { int i; float r, max_radius = 0.0; for (i = 0; i < m->nvertices; i++) { r = dist3d(m->v[i].x, m->v[i].y, m->v[i].z); if (r > max_radius) max_radius = r; } return max_radius; }
void restore_and_move (mc_connection *mc, int t, int x, int y, int z) { int xp = mc->mc_server_data.mc_player_db[256].x; int yp = mc->mc_server_data.mc_player_db[256].y; int zp = mc->mc_server_data.mc_player_db[256].z; if (dist3d(x, y, z, xp, yp, zp) < 6) { restore_block(mc, t, x, y, z); } else { mc_proto_send_pos(mc, x, y, z, 130, 130); mc_proto_send_pos(mc, x, y, z, 130, 130); restore_block(mc, t, x, y, z); } }
void computedist( int *dist, int nrgeoms, struct geometry *rgeoms, struct point *ptdata ) { struct point *currptd; struct geometry *currrgm; int indexp, i; /* set pointers */ currrgm = rgeoms; currptd = ptdata; indexp = 1; /* loop over rgeoms */ while ( currrgm-> next != 0 ) { /* set index */ currptd->index = indexp; /* compute each two atom distance */ for ( i = 0; i < 5; i++ ) { currptd->coord[i] = dist3d( &(currrgm->atom[dist[(i * 2)]-1]), &(currrgm->atom[dist[(i * 2) + 1 ]-1])); } /* i */ /* compute OOP angles */ /* ( 5, 1, 2, 3 ) */ currptd->coord[i] = oop3d( &(currrgm->atom[4]), &(currrgm->atom[0]), &(currrgm->atom[1]), &(currrgm->atom[2])); i++; /* ( 3, 1, 2, 4 ) */ currptd->coord[i] = oop3d( &(currrgm->atom[3]), &(currrgm->atom[0]), &(currrgm->atom[1]), &(currrgm->atom[2])); #ifdef debugging /* print CO bond distances */ printf( " %d C-O distance: %lf \n", currptd->index, currptd->coord[0] ); #endif /* allocate new ptdata node */ currptd->next = malloc( sizeof( struct point ) ); currptd = currptd->next; /* 5 distances + 2 OOP angles */ currptd->coord = malloc( (5 + 2) * sizeof( double ) ); currptd->next = 0; /* move to new geometry */ currrgm = currrgm->next; indexp = indexp + 1; } /* while */ }
struct mesh *init_radar_circle_xz_plane_mesh(double x, double z, double r, int ticks, double tick_radius) { int i; struct mesh *my_mesh = malloc(sizeof(*my_mesh)); if (!my_mesh) return my_mesh; memset(my_mesh, 0, sizeof(*my_mesh)); my_mesh->geometry_mode = MESH_GEOMETRY_LINES; my_mesh->nvertices = 0; my_mesh->ntriangles = 0; my_mesh->nlines = 0; my_mesh->t = 0; my_mesh->v = malloc(sizeof(*my_mesh->v) * (360 / 2 + 1 + ticks*2)); my_mesh->l = malloc(sizeof(*my_mesh->l) * (1 + ticks)); my_mesh->radius = dist3d(x, 0, z) + r; my_mesh->tex = 0; my_mesh->graph_ptr = 0; for (i = 0; i <= 360; i += 2) { my_mesh->v[my_mesh->nvertices].x = x + cos(i * M_PI / 180.0) * r; my_mesh->v[my_mesh->nvertices].y = 0; my_mesh->v[my_mesh->nvertices].z = z + sin(i * M_PI / 180.0) * r; my_mesh->nvertices++; } my_mesh->l[0].start = &my_mesh->v[0]; my_mesh->l[0].end = &my_mesh->v[my_mesh->nvertices - 1]; my_mesh->l[0].flag = MESH_LINE_STRIP; my_mesh->nlines++; for (i = 0; i < ticks; ++i) { double c = cos(i * 2.0 * M_PI / (double)ticks); double s = sin(i * 2.0 * M_PI / (double)ticks); mesh_add_point(my_mesh, x + c * (r - tick_radius), 0, z + s * (r - tick_radius)); mesh_add_point(my_mesh, x + c * r, 0, z + s * r); mesh_add_line_last_2(my_mesh, MESH_LINE_DOTTED); } mesh_graph_dev_init(my_mesh); return my_mesh; }
int mc_server_parse_packet (mc_connection *mc, char *buffer) { int i, ii; char buf[128]; memset(buf,0, 128); if (buffer[0] == 0x00) { for(i = 2, ii = 0; i < 32; ++i, ++ii) { if(buffer[i] == '&') { if(i <= 32) i += 2; } buf[ii] = buffer[i]; } buf[32] = 0; printf("Connected through MC to server %s\n",buf); } else if (buffer[0] == 0x02) { mc->mc_server_data.mc_current_size = 0; mc->mc_server_data.mc_unparsed_data = malloc(1024 * 1024); } else if (buffer[0] == 0x03) { unsigned short size; memcpy(&size, &buffer[1], sizeof(short)); size = htons(size); if (size) { memcpy(mc->mc_server_data.mc_unparsed_data + mc->mc_server_data.mc_current_size, &buffer[3], size); mc->mc_server_data.mc_current_size += size; } } else if (buffer[0] == 0x04) { short tx,ty,tz; memcpy(&tx, &buffer[1], sizeof(short)); memcpy(&ty, &buffer[3], sizeof(short)); memcpy(&tz, &buffer[5], sizeof(short)); mc->mc_server_data.mc_level_x = htons(tx); mc->mc_server_data.mc_level_y = htons(ty); mc->mc_server_data.mc_level_z = htons(tz); printf("Level Dimensions: %d %d %d\n", mc->mc_server_data.mc_level_x, mc->mc_server_data.mc_level_y, mc->mc_server_data.mc_level_z); printf("Prepared to decompress %d bytes\n", mc->mc_server_data.mc_current_size); FILE *fp = fopen("/Users/nobody1/Desktop/out_c.gz", "w"); fwrite(mc->mc_server_data.mc_unparsed_data, 1, mc->mc_server_data.mc_current_size, fp); fclose(fp); system("gzip -df /Users/nobody1/Desktop/out_c.gz"); fp = fopen("/Users/nobody1/Desktop/out_c", "r"); int blocks; fread(&blocks, sizeof(int), 1, fp); blocks = htonl(blocks); printf("%d blocks\n", blocks); mc->mc_server_data.mc_level_data = malloc(blocks + 1); fread(mc->mc_server_data.mc_level_data, 1, blocks, fp); fclose(fp); remove("/Users/nobody1/Desktop/out_c"); mc->mc_server_data.mc_level_size = mc->mc_server_data.mc_level_x * mc->mc_server_data.mc_level_y * mc->mc_server_data.mc_level_z; free(mc->mc_server_data.mc_unparsed_data); } else if (buffer[0] == 0x06){ int x,y,z; char t; memcpy(&x, &buffer[1], sizeof(short)); memcpy(&y, &buffer[3], sizeof(short)); memcpy(&z, &buffer[5], sizeof(short)); memcpy(&t, &buffer[7], sizeof(char)); x = htons(x); y = htons(y); z = htons(z); if (mc->mc_mode & MC_LOCK_MAP){ restore_and_move(mc, t, x, y, z); } else if (mc->mc_mode & MC_LOCK_AREA) { if (x >= mc->mc_server_data.x1 && x <= mc->mc_server_data.x2 && y >= mc->mc_server_data.y1 && y <= mc->mc_server_data.y2 && z >= mc->mc_server_data.z1 && z <= mc->mc_server_data.z2) { restore_and_move(mc, t, x, y, z); } } else if (mc->mc_mode & MC_LOCK_PLAYER) { int pid = mc->mc_server_data.mc_pid_locked; int xp = mc->mc_server_data.mc_player_db[pid].x; int yp = mc->mc_server_data.mc_player_db[pid].y; int zp = mc->mc_server_data.mc_player_db[pid].z; if (xp == 1024 && yp == 1024 && zp == 1024) { printf("lost connection to player\n"); } else { if (dist3d(x, y, z, xp, yp, zp) < 10.0f) { restore_and_move(mc, t, x, y, z); } } } else { mc->mc_server_data.mc_level_data[offset(mc, x, y, z)] = t; } } else if (buffer[0] == 0x07) { for(i = 2, ii = 0; i < 66; ++i, ++ii) { if(buffer[i] == '&') { i+=2;} if(buffer[i] != ' ') { buf[ii] = buffer[i]; } } int spid = buffer[1]; printf("[SERVER] %s joined the game. (%d)\n",buf,spid); if (spid == -1 || !strcmp(buf, mc->mc_client_name)) spid = 256; mc->mc_server_data.mc_player_db[spid].pid = spid; strcpy(mc->mc_server_data.mc_player_db[spid].name, buf); short xp, yp, zp; memcpy(&xp, &buffer[2], sizeof(short)); memcpy(&yp, &buffer[4], sizeof(short)); memcpy(&zp, &buffer[6], sizeof(short)); mc->mc_server_data.mc_player_db[spid].x = htons(xp)/32; mc->mc_server_data.mc_player_db[spid].y = htons(yp)/32; mc->mc_server_data.mc_player_db[spid].z = htons(zp)/32; mc->mc_server_data.mc_player_db[spid].rotx = buffer[8] * (360/256); mc->mc_server_data.mc_player_db[spid].roty = buffer[9] * (360/256); } else if (buffer[0] == 0x08) { int spid = buffer[1]; if (spid == -1) spid = 256; short xp, yp, zp; memcpy(&xp, &buffer[2], sizeof(short)); memcpy(&yp, &buffer[4], sizeof(short)); memcpy(&zp, &buffer[6], sizeof(short)); mc->mc_server_data.mc_player_db[spid].x = htons(xp)/32; mc->mc_server_data.mc_player_db[spid].y = htons(yp)/32; mc->mc_server_data.mc_player_db[spid].z = htons(zp)/32; mc->mc_server_data.mc_player_db[spid].rotx = buffer[8] * (360/256); mc->mc_server_data.mc_player_db[spid].roty = buffer[9] * (360/256); if (mc->mc_mode & MC_FOLLOW_PLAYER) { follow_move(mc, mc->mc_server_data.mc_pid_locked); } } else if (buffer[0] == 0x09) { int spid = buffer[1]; if (spid == -1) spid = 256; mc->mc_server_data.mc_player_db[spid].x = buffer[2]/32; mc->mc_server_data.mc_player_db[spid].y = buffer[3]/32; mc->mc_server_data.mc_player_db[spid].z = buffer[4]/32; mc->mc_server_data.mc_player_db[spid].rotx = buffer[5] * (360/256); mc->mc_server_data.mc_player_db[spid].roty = buffer[6] * (360/256); if (mc->mc_mode & MC_FOLLOW_PLAYER) { follow_move(mc, mc->mc_server_data.mc_pid_locked); } } else if (buffer[0] == 0x0A) { int dpid = buffer[1]; if (dpid == -1) dpid = 256; mc->mc_server_data.mc_player_db[dpid].x += buffer[2]/32; mc->mc_server_data.mc_player_db[dpid].y += buffer[3]/32; mc->mc_server_data.mc_player_db[dpid].z += buffer[4]/32; if (mc->mc_mode & MC_FOLLOW_PLAYER) { follow_move(mc, mc->mc_server_data.mc_pid_locked); } } else if (buffer[0] == 0x0B) { int dpid = buffer[1]; mc->mc_server_data.mc_player_db[dpid].rotx = buffer[2] * (360/256); mc->mc_server_data.mc_player_db[dpid].roty = buffer[3] * (360/256); if (mc->mc_mode & MC_FOLLOW_PLAYER) { follow_move(mc, mc->mc_server_data.mc_pid_locked); } } else if (buffer[0] == 0x0C) { int piddc = buffer[1]; printf("[SERVER] %s left the game.\n", mc->mc_server_data.mc_player_db[piddc].name); } else if (buffer[0] == 0x0D) { for(i = 2, ii = 0; i < 66; ++i, ++ii) { if(buffer[i] == '&') { if(i <= 64) i += 2; } buf[ii] = buffer[i]; } buf[64] = 0; printf("%s\n",buf); } else if (buffer[0] == 0x0E) { printf("[DISCONNECT] %s\n",buffer); return -1; } return MC_SEND; }
/* send a standard radio communication */ void send_com(dbref from, char *arg_left, char *arg_right) { dbref com, obj; hship *ship; hcelestial *cel; huniverse *uid; double xmit, rcv; char contact[32]; char *r, *s; char buff[128]; ATTR *a; double sx, sy, sz, tx, ty, tz, dist; char pre[128]; char *mesg; int sent_to_from, send_to_com; if (!IsComm(from)) { notify(from, "You do not have the HS_COMM flag."); return; } uid = NULL; obj = atr_parse_dbref(from, "HSPACE"); if (!RealGoodObject(obj)) { notify(from, "You do not have a valid space id. Board, disembark, eject, or man a console."); return; } if (IsShip(obj)) { ship = find_ship_by_nav(obj); if (!ship) { notify(from, "Your space id is not a valid ship."); return; } if (ship->uid) { sx = ship->x; sy = ship->y; sz = ship->z; uid = ship->uid; } else if (ship->landed) { sx = ship->landed->x; sy = ship->landed->y; sz = ship->landed->z; uid = ship->landed->uid; } else if (ship->docked) { sx = ship->docked->x; sy = ship->docked->y; sz = ship->docked->z; uid = ship->docked->uid; } strncpy(contact, ship_name(ship), 10); } else if (IsCelestial(obj)) { cel = find_celestial(obj); if (!cel) { notify(from, "Your space id is not a valid celestial."); return; } sx = cel->x; sy = cel->y; sz = cel->z; uid = cel->uid; strncpy(contact, celestial_name(cel), 10); } contact[10] = '\0'; if (!uid) { notify(from, "Your space id does not have a valid uid."); return; } if (arg_left && arg_right && *arg_right) { xmit = strtod(arg_left, &s); if (s && *s) { return; } mesg = arg_right; } else { xmit = atr_parse_double(from, "TRANSMIT", 0.0); mesg = arg_left; } if (xmit < 100.0 || xmit > 999.9) { notify(from, "Transmission frequency must be between 100 and 999 MHz."); return; } a = atr_get(from, "CALLSIGN"); if (!a) { snprintf(pre, 127, "%s%s[%s%5.1f MHz%s%s]-[%s%-10s%s]-[%s ", ANSI_HILITE, ANSI_BLUE, ANSI_NORMAL, xmit, ANSI_HILITE, ANSI_BLUE, ANSI_GREEN, contact, ANSI_BLUE, ANSI_NORMAL); } else { snprintf(pre, 127, "%s%s[%s%5.1f MHz%s%s]-[%s%-10s%s]-[%s %s<%s%s%s>%s ", ANSI_HILITE, ANSI_BLUE, ANSI_NORMAL, xmit, ANSI_HILITE, ANSI_BLUE, ANSI_GREEN, contact, ANSI_BLUE, ANSI_NORMAL, ANSI_CYAN, ANSI_NORMAL, atr_value(a), ANSI_CYAN, ANSI_NORMAL); } /* go through the comm list and check each one */ sent_to_from = 0; for (com = 0; com < db_top; com++) { if (!IsComm(com)) continue; /* check if the user is in the same uid */ obj = atr_parse_dbref(com, "HSPACE"); if (IsShip(obj)) { ship = find_ship_by_nav(obj); if (!ship) continue; if (ship->uid && ship->uid != uid) continue; else if (ship->landed && ship->landed->uid != uid) continue; else if (ship->docked && ship->docked->uid != uid) continue; if (ship->uid) { tx = ship->x; ty = ship->y; tz = ship->z; } else if (ship->landed) { tx = ship->landed->x; ty = ship->landed->y; tz = ship->landed->z; } else if (ship->docked) { tx = ship->docked->x; ty = ship->docked->y; tz = ship->docked->z; } } else if (IsCelestial(obj)) { cel = find_celestial(obj); if (!cel) continue; if (cel->uid != uid) continue; tx = cel->x; ty = cel->y; tz = cel->z; } else { continue; } dist = dist3d(sx, sy, sz, tx, ty, tz) / hs_options.max_comm_dist; if (dist > 1.0) continue; a = atr_get(com, "FREQUENCY"); if (!a) continue; /* check all frequencies to see if we need to send to this com */ send_to_com = 0; snprintf(buff, 127, atr_value(a)); s = buff; while (s) { r = split_token(&s, ' '); rcv = parse_number(r); /* check to see if we're on the right frequency */ if (fabs(rcv - xmit) < 0.1) { send_to_com = 1; break; } } if (send_to_com) { if (com == from) sent_to_from = 1; notify_format(com, "%s%s%s%s]%s", pre, decay_msg(mesg, dist), ANSI_HILITE, ANSI_BLUE, ANSI_NORMAL); } } if (!sent_to_from) { notify_format(from, "You send \"%s\" on frequency %5.1f.", mesg, xmit); } }