int Connect(char *hostname, int port) { int sock; struct hostent *host; struct sockaddr_in host_addr; sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) Scream("socket %s\n", strerror(errno)); host = gethostbyname(hostname); if (host == NULL) Scream("gethostbyname"); host_addr.sin_family = AF_INET; host_addr.sin_port = htons(port); host_addr.sin_addr = *((struct in_addr *) host->h_addr); memset(&host_addr.sin_zero, 0, 8); int status = connect(sock, (struct sockaddr *) &host_addr, sizeof(struct sockaddr)); if (status == 0) { return sock; } return 0; }
char *FileFromURL(char *addr) { char *str = NULL; char *p = addr; if (!p) Scream("broken file path"); str = strstr(addr, "http://"); if (str) { str += strlen("http://"); char *p = strchr(str, '/'); if (p) { return p; } } if (!p) Scream("FileFromURL"); return p; }
char *HostFromURL(char *addr) { char *str = strstr(addr, "http://"); if (str) { addr += strlen("http://"); char *end = strchr(addr, '/'); *end = '\0'; return addr; } Scream("Invalid URL"); return NULL; }
void CScientist :: RunTask( Task_t *pTask ) { switch ( pTask->iTask ) { case TASK_RUN_PATH_SCARED: if ( MovementIsComplete() ) TaskComplete(); if ( RANDOM_LONG(0,31) < 8 ) Scream(); break; case TASK_MOVE_TO_TARGET_RANGE_SCARED: { if ( RANDOM_LONG(0,63)< 8 ) Scream(); if ( m_hEnemy == NULL ) { TaskFail(); } else { float distance; distance = ( m_vecMoveGoal - pev->origin ).Length2D(); // Re-evaluate when you think your finished, or the target has moved too far if ( (distance < pTask->flData) || (m_vecMoveGoal - m_hTargetEnt->pev->origin).Length() > pTask->flData * 0.5 ) { m_vecMoveGoal = m_hTargetEnt->pev->origin; distance = ( m_vecMoveGoal - pev->origin ).Length2D(); FRefreshRoute(); } // Set the appropriate activity based on an overlapping range // overlap the range to prevent oscillation if ( distance < pTask->flData ) { TaskComplete(); RouteClear(); // Stop moving } else if ( distance < 190 && m_movementActivity != ACT_WALK_SCARED ) m_movementActivity = ACT_WALK_SCARED; else if ( distance >= 270 && m_movementActivity != ACT_RUN_SCARED ) m_movementActivity = ACT_RUN_SCARED; } } break; case TASK_HEAL: if ( m_fSequenceFinished ) { TaskComplete(); } else { if ( TargetDistance() > 90 ) TaskComplete(); pev->ideal_yaw = UTIL_VecToYaw( m_hTargetEnt->pev->origin - pev->origin ); ChangeYaw( pev->yaw_speed ); } break; default: CTalkMonster::RunTask( pTask ); break; } }
void CScientist :: StartTask( Task_t *pTask ) { switch( pTask->iTask ) { case TASK_SAY_HEAL: // if ( FOkToSpeak() ) Talk( 2 ); m_hTalkTarget = m_hTargetEnt; PlaySentence( "SC_HEAL", 2, VOL_NORM, ATTN_IDLE ); TaskComplete(); break; case TASK_SCREAM: Scream(); TaskComplete(); break; case TASK_RANDOM_SCREAM: if ( RANDOM_FLOAT( 0, 1 ) < pTask->flData ) Scream(); TaskComplete(); break; case TASK_SAY_FEAR: if ( FOkToSpeak() ) { Talk( 2 ); m_hTalkTarget = m_hEnemy; if ( m_hEnemy->IsPlayer() ) PlaySentence( "SC_PLFEAR", 5, VOL_NORM, ATTN_NORM ); else PlaySentence( "SC_FEAR", 5, VOL_NORM, ATTN_NORM ); } TaskComplete(); break; case TASK_HEAL: m_IdealActivity = ACT_MELEE_ATTACK1; break; case TASK_RUN_PATH_SCARED: m_movementActivity = ACT_RUN_SCARED; break; case TASK_MOVE_TO_TARGET_RANGE_SCARED: { if ( (m_hTargetEnt->pev->origin - pev->origin).Length() < 1 ) TaskComplete(); else { m_vecMoveGoal = m_hTargetEnt->pev->origin; if ( !MoveToTarget( ACT_WALK_SCARED, 0.5 ) ) TaskFail(); } } break; default: CTalkMonster::StartTask( pTask ); break; } }
int main(int argc, char **argv) { int i; unsigned long bs = CHUNK; char *infile = argv[1]; int get_from_web = 0; for (i = 0; i < argc; i++) { if (0 == strcmp(argv[i], "-bs")) { if (argv[i + 1] != NULL) bs = atoi(argv[i + 1]); i++; } if (0 == strcmp(argv[i], "-h") || ! strncmp(argv[i], "--h", 3)) Usage(); } if (argc < 3) Usage(); if (!strncmp("http://", infile, 7)) get_from_web = 1; int in_fd, out_fd, sock; int length = 0; if (get_from_web) { char *filename = strdup(FileFromURL(infile)); char *address = strdup(HostFromURL(infile)); if (filename && address) { sock = in_fd = Connect(address, 80); length = GetHeaders(sock, address, filename); } else Scream("MacBorken URL"); } else { in_fd = open(argv[1], O_RDONLY, 0666); if (in_fd < 0) Scream(strerror(errno)); } out_fd = open(argv[2], O_WRONLY | O_CREAT, 0666); if (out_fd < 0) Scream(strerror(errno)); char buf[bs]; memset(buf, 0, bs); ssize_t chunk = 0; ssize_t bytes = 0; struct stat fstats; stat(argv[1], &fstats); if (!length) length = fstats.st_size; int percent = length / 100; int total = 0; read(in_fd, buf, 1); // hack do { bytes = read(in_fd, buf, bs); if (bytes <= 0) break; chunk = bytes; while (chunk) { ssize_t count = write(out_fd, buf, chunk); if (count <= 0) break; chunk -= count; } total += bytes; int current = total / percent; if (current > 100) current = 100; printf(" \r"); printf("%d%% %d bytes of %d bytes", current, total, length); memset(buf, 0, bytes); // faster } while (length > total); printf("\r\ndone!\n"); close(out_fd); close(in_fd); return EXIT_SUCCESS; }