void greet_memory_mtrigger(char_data *actor) { trig_data *t; char_data *ch; struct script_memory *mem; char buf[MAX_INPUT_LENGTH]; int command_performed = 0; for (ch = world[IN_ROOM(actor)].people; ch; ch = ch->next_in_room) { if (!SCRIPT_MEM(ch) || !AWAKE(ch) || FIGHTING(ch) || (ch == actor) || AFF_FLAGGED(ch, AFF_CHARM)) continue; /* find memory line with command only */ for (mem = SCRIPT_MEM(ch); mem && SCRIPT_MEM(ch); mem=mem->next) { if (GET_ID(actor)!=mem->id) continue; if (mem->cmd) { command_interpreter(ch, mem->cmd); /* no script */ command_performed = 1; break; } } /* if a command was not performed execute the memory script */ if (mem && !command_performed) { for (t = TRIGGERS(SCRIPT(ch)); t; t = t->next) { if (IS_SET(GET_TRIG_TYPE(t), MTRIG_MEMORY) && CAN_SEE(ch, actor) && !GET_TRIG_DEPTH(t) && number(1, 100) <= GET_TRIG_NARG(t)) { ADD_UID_VAR(buf, t, actor, "actor", 0); script_driver(ch, t, MOB_TRIGGER, TRIG_NEW); break; } } } /* delete the memory */ if (mem) { if (SCRIPT_MEM(ch)==mem) { SCRIPT_MEM(ch) = mem->next; } else { struct script_memory *prev; prev = SCRIPT_MEM(ch); while (prev->next != mem) prev = prev->next; prev->next = mem->next; } if (mem->cmd) free(mem->cmd); free(mem); } } }
void entry_memory_mtrigger(char_data *ch) { trig_data *t; char_data *actor; struct script_memory *mem; char buf[MAX_INPUT_LENGTH]; if (!SCRIPT_MEM(ch) || AFF_FLAGGED(ch, AFF_CHARM)) return; for (actor = world[IN_ROOM(ch)].people; actor && SCRIPT_MEM(ch); actor = actor->next_in_room) { if (actor!=ch && SCRIPT_MEM(ch)) { for (mem = SCRIPT_MEM(ch); mem && SCRIPT_MEM(ch); mem = mem->next) { if (GET_ID(actor)==mem->id) { struct script_memory *prev; if (mem->cmd) command_interpreter(ch, mem->cmd); else { for (t = TRIGGERS(SCRIPT(ch)); t; t = t->next) { if (TRIGGER_CHECK(t, MTRIG_MEMORY) && (number(1, 100) <= GET_TRIG_NARG(t))){ ADD_UID_VAR(buf, t, actor, "actor", 0); script_driver(ch, t, MOB_TRIGGER, TRIG_NEW); break; } } } /* delete the memory */ if (SCRIPT_MEM(ch)==mem) { SCRIPT_MEM(ch) = mem->next; } else { prev = SCRIPT_MEM(ch); while (prev->next != mem) prev = prev->next; prev->next = mem->next; } if (mem->cmd) free(mem->cmd); free(mem); } } /* for (mem =..... */ } } }
void * FTP_gateway(void *data) { int sockfd = *((int *)data); int readn; socklen_t addrlen; char RAW_command[MAXLINE], debugbuf[MAXLINE]; int current_code, previous_code = 0; char* FTP_banner = "220 My FTP SERVER 1.0\r\n"; struct sockaddr_in client_addr; char loginID[30]; FTPinfo FTP_information; int debug_count= 0; // initilize memset(&FTP_information, 0x00, sizeof(FTP_information)); getcwd(FTP_information.execute_location, BUFSIZE); FTP_information.controlsockfd = sockfd; /* for debug */ // chdir("/Users/tracking/Desktop/REAL_FTP/REAL_FTP"); // getcwd(RAW_command, MAXLINE); // printf("%s\n", RAW_command); /* for debug */ /* for debug */ addrlen = sizeof(client_addr); getpeername(sockfd, (struct sockaddr *)&client_addr, &addrlen); /* for debug */ /* FTP banner!!! */ write(sockfd, FTP_banner, strlen(FTP_banner)); while((readn = read(sockfd, FTP_information.RAW_command, MAXLINE)) > 0) { // receive user command. sprintf(debugbuf, "Read Data %s(%d) : %s", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), FTP_information.RAW_command); write(STDOUT_FILENO, debugbuf, strlen(debugbuf)); current_code = command_interpreter(&FTP_information); //write(FTP_information->controlsockfd, FTP_information.response_code, //strlen(FTP_information.response_code)); // send response. previous_code = current_code; // data transfer is going to start shortly. if( strcmp(FTP_information.RAW_command, "PORT") == 0) { /* // on failure, send "cannot open data connection." I need return value. active_open(&FTP_information); // on failure, I would send the message "cannot open connection.". strcpy(FTP_information.response_code, "150 Data Connection OK\r\n"); write(sockfd, FTP_information.response_code, strlen(FTP_information.response_code)); // send response. // on success, send data transfer complete. Data_gateway(&FTP_information); close(FTP_information.datasockfd); // trasnfer complete. write(sockfd, FTP_information.response_code, strlen(FTP_information.response_code)); // send response. */ } else if( strcmp(FTP_information.RAW_command, "PASV") == 0) { /* passive_open(&FTP_information); // on failure, I would send the message "cannot open connection.". strcpy(FTP_information.response_code, "150 Data Connection OK\r\n"); write(sockfd, FTP_information.response_code, strlen(FTP_information.response_code)); // send response. // on success, send data transfer complete. Data_gateway(&FTP_information); close(FTP_information.datasockfd); // trasnfer complete. write(sockfd, FTP_information.response_code, strlen(FTP_information.response_code)); // send response. */ } memset(FTP_information.RAW_command, 0x00, MAXLINE); // get comamnd-buffer clean. memset(FTP_information.response_code, 0x00, MAXLINE); // get response-buffer clean. debug_count++; memset(debugbuf, 0x00, MAXLINE); } close(sockfd); printf("worker thread end\n"); return 0; }
void command_interpreter (CHAR_DATA * ch, char *argument) { char buf[MAX_STRING_LENGTH]; char *command_args, *p, *social_args; int cmd_level = 0; int i = 0, echo = 1; AFFECTED_TYPE *craft_affect = NULL; AFFECTED_TYPE *af; ALIAS_DATA *alias; extern int second_affect_active; if (!ch) return; *buf = '\0'; p = argument; while (*p == ' ') p++; if (strchr (p, '%')) { send_to_char ("Input with the '%' character is not permitted.\n", ch); return; } if (strchr (p, '#') && IS_MORTAL (ch) && strncmp (p, "ge", 2) != 0 && strncmp (p, "buy", 3) != 0) { send_to_char ("Input with the '#' character is not permitted.\n", ch); return; } if (IS_MORTAL (ch) && strchr (p, '$')) { send_to_char ("Input with the '$' character is not permitted.\n", ch); return; } std::multimap<int, room_prog>::iterator it; if (IS_NPC(ch)) it = mob_prog_list.find(ch->mob->nVirtual); if (IS_NPC(ch) && !get_second_affect (ch, SA_DOANYWAY, 0) && it != mob_prog_list.end()) { if (m_prog(ch, p)) { return; } } std::pair<std::multimap<int, room_prog>::iterator, std::multimap<int, room_prog>::iterator> pair; if (ch->right_hand && !get_second_affect (ch, SA_DOANYWAY, 0)) { pair = obj_prog_list.equal_range(ch->right_hand->nVirtual); for (it = pair.first; it != pair.second; it++) { if (it->second.type != 1 && it->second.type != 3 && it->second.type != 5) continue; if (o_prog(ch, p, it->second)) return; } } if (ch->left_hand && !get_second_affect (ch, SA_DOANYWAY, 0)) { pair = obj_prog_list.equal_range(ch->left_hand->nVirtual); for (it = pair.first; it != pair.second; it++) { if (it->second.type != 1 && it->second.type != 3 && it->second.type != 5) continue; if (o_prog(ch, p, it->second)) return; } } for (OBJ_DATA *tobj = ch->equip; tobj; tobj = tobj->next_content) { if (get_second_affect (ch, SA_DOANYWAY, 0)) break; pair = obj_prog_list.equal_range(tobj->nVirtual); for (it = pair.first; it != pair.second; it++) { if (it->second.type != 2 && it->second.type != 3 && it->second.type != 5) continue; if (o_prog(ch, p, it->second)) return; } } /* this is where it crashes on the hour - Grommit */ if (!ch->room ) { std::ostringstream stream; stream << "Error in command_interpreter:commands.cpp. Command \"" << argument << "\" called by \"" << ch->tname << "\" with null room. Previously in " << (ch->last_room) << " entering null room from the " << (dirs[ch->from_dir]) << "."; system_log(stream.str().c_str(),true); return; } /* end grommit diagnostics to avoid segfaulting on the below for loop */ for (OBJ_DATA *tobj = ch->room->contents; tobj; tobj = tobj->next_content) { if (get_second_affect (ch, SA_DOANYWAY, 0)) break; pair = obj_prog_list.equal_range(tobj->nVirtual); for (it = pair.first; it != pair.second; it++) { if (it->second.type != 4 && it->second.type != 5) continue; if (o_prog(ch, p, it->second)) return; } } for (CHAR_DATA *temp_char = ch->room->people; temp_char; temp_char = temp_char->next_in_room) { if (get_second_affect (ch, SA_DOANYWAY, 0)) break; if (temp_char == ch) continue; if (!IS_NPC(temp_char)) continue; pair = mob_prog_list.equal_range(temp_char->mob->nVirtual); for (it = pair.first; it != pair.second; ++it) { if (m_prog(ch, p, it->second)) return; } } if (ch->room && ch->room->prg && !get_second_affect(ch, SA_DOANYWAY, 0) && r_program (ch, p)) { if (!IS_NPC (ch) || (ch->desc && (ch->pc && str_cmp (ch->pc->account_name, "Guest")))) { player_log (ch, "[RPROG]", p); } if (!IS_SET (commands[i].flags, C_NWT)) show_to_watchers (ch, argument); return; } if (get_second_affect(ch, SA_DOANYWAY, 0)) remove_second_affect(get_second_affect(ch, SA_DOANYWAY, 0)); if (!IS_MORTAL (ch) && !str_cmp (argument, "sho wl")) { send_to_char ("Heh heh. Glad I added in this check, aren't we? No shouting for you.\n", ch); return; } if (ch->desc) { last_descriptor = ch->desc; sprintf (full_last_command, "Last Command Issued, by %s [%d]: %s", ch->tname, ch->in_room, argument); sprintf (last_command, "%s", argument); } social_args = argument; command_args = one_argument (argument, buf); if (!*buf) return; while (*command_args == ' ') command_args++; if (ch->pc && !GET_FLAG (ch, FLAG_ALIASING)) { if ((alias = is_alias (ch, buf))) { ch->flags |= FLAG_ALIASING; while (alias) { command_interpreter (ch, alias->line); if (ch->deleted) return; alias = alias->next_line; } ch->flags &= ~FLAG_ALIASING; return; } } for (i = 1; *commands[i].command; i++) if (is_abbrev (buf, commands[i].command)) break; if ((craft_affect = is_craft_command (ch, argument))) i = 0; if (IS_SET (commands[i].flags, C_IMP)) { cmd_level = 6; } else if (IS_SET (commands[i].flags, C_LV5)) { cmd_level = 5; } else if (IS_SET (commands[i].flags, C_LV4)) { cmd_level = 4; } else if (IS_SET (commands[i].flags, C_LV3)) { cmd_level = 3; } else if (IS_SET (commands[i].flags, C_LV2)) { cmd_level = 2; } else if (IS_SET (commands[i].flags, C_LV1)) { cmd_level = 1; } if (IS_SET (commands[i].flags, C_GDE) && (IS_NPC (ch) || (!ch->pc->is_guide && !ch->pc->level))) { send_to_char ("Eh?\n\r", ch); return; } /* Need to pass the CHAR_DATA pointer for the person who made the command and modify the following line to test the commanding char's trust against the trust level for the command. - Methuselah */ if ((!*commands[i].command) || (cmd_level > GET_TRUST (ch))) { if (!social (ch, argument)) { echo = number (1, 9); if (echo == 1) send_to_char ("Eh?\n\r", ch); else if (echo == 2) send_to_char ("Huh?\n\r", ch); else if (echo == 3) send_to_char ("I'm afraid that just isn't possible...\n\r", ch); else if (echo == 4) send_to_char ("I don't recognize that command.\n\r", ch); else if (echo == 5) send_to_char ("What?\n\r", ch); else if (echo == 6) send_to_char ("Perhaps you should try typing it a different way?\n\r", ch); else if (echo == 7) send_to_char ("Try checking your typing - I don't recognize it.\n\r", ch); else if (echo == 8) send_to_char ("That isn't a recognized command, craft, or social.\n\r", ch); else send_to_char ("Hmm?\n\r", ch); } else { if (!IS_SET (commands[i].flags, C_NWT)) show_to_watchers (ch, argument); } return; } if (ch->stun) { send_to_char ("You're still reeling.\n", ch); return; } if (ch->roundtime) { sprintf (buf, "You'll need to wait another %d seconds.\n", ch->roundtime); send_to_char (buf, ch); return; } if (IS_SET (commands[i].flags, C_WLK) && (ch->moves || GET_FLAG (ch, FLAG_LEAVING) || GET_FLAG (ch, FLAG_ENTERING))) { send_to_char ("Stop traveling first.\n\r", ch); return; } if (IS_SET (commands[i].flags, C_MNT) && IS_RIDER (ch)) { send_to_char ("Get off your mount first.\n", ch); return; } if (commands[i].min_position > GET_POS (ch)) { switch (GET_POS (ch)) { case DEAD: if (IS_MORTAL (ch)) { send_to_char ("You are dead. You can't do that.\n\r", ch); return; } case UNCON: case MORT: send_to_char ("You're seriously wounded and unconscious.\n\r", ch); return; case STUN: send_to_char ("You're too stunned to do that.\n\r", ch); return; case SLEEP: send_to_char ("You can't do that while sleeping.\n\r", ch); return; case REST: send_to_char ("You can't do that while lying down.\n\r", ch); return; case SIT: send_to_char ("You can't do that while sitting.\n\r", ch); return; case FIGHT: send_to_char ("No way! You are fighting for your life!\n\r", ch); return; } return; } if (!IS_NPC (ch) && ch->pc->create_state == STATE_DIED && !IS_SET (commands[i].flags, C_DOA)) { send_to_char ("You can't do that when you're dead.\n\r", ch); return; } if (!IS_SET (commands[i].flags, C_BLD) && is_blind (ch)) { if (get_equip (ch, WEAR_BLINDFOLD)) send_to_char ("You can't do that while blindfolded.\n\r", ch); else send_to_char ("You can't do that while blind.\n\r", ch); return; } if ((af = get_affect (ch, MAGIC_AFFECT_PARALYSIS)) && !IS_SET (commands[i].flags, C_PAR) && IS_MORTAL (ch)) { send_to_char ("You can't move.\n", ch); return; } if (IS_SUBDUEE (ch) && !IS_SET (commands[i].flags, C_SUB) && !cmd_level) { act ("$N won't let you.", false, ch, 0, ch->subdue, TO_CHAR); return; } /* Most commands break delays */ if (ch->delay && !IS_SET (commands[i].flags, C_DEL)) break_delay (ch); /* Send this command to the log */ if (!second_affect_active && (!IS_NPC (ch) || ch->desc)) { if (IS_SET (commands[i].flags, C_NLG)) ; else if (i > 0) { /* Log craft commands separately. */ if (!str_cmp (commands[i].command, ".")) player_log (ch, "say", command_args); else if (!str_cmp (commands[i].command, ",")) player_log (ch, "emote", command_args); else if (!str_cmp (commands[i].command, ":")) player_log (ch, "emote", command_args); else if (!str_cmp (commands[i].command, ";")) player_log (ch, "wiznet", command_args); else player_log (ch, commands[i].command, command_args); } } if (IS_MORTAL (ch) && get_affect (ch, MAGIC_HIDDEN) && !IS_SET (commands[i].flags, C_HID) && skill_level (ch, SKILL_SNEAK, 0) < number (1, MAX(100, skill_level(ch, SKILL_SNEAK, 0))) && would_reveal (ch)) { remove_affect_type (ch, MAGIC_HIDDEN); act ("$n reveals $mself.", true, ch, 0, 0, TO_ROOM | _ACT_FORMAT); act ("Your actions have compromised your concealment.", true, ch, 0, 0, TO_CHAR); } /* Execute command */ if (!IS_SET (commands[i].flags, C_NWT)) show_to_watchers (ch, social_args); if (!i) /* craft_command */ craft_command (ch, command_args, craft_affect); else (*commands[i].proc) (ch, command_args, 0); last_descriptor = NULL; }
void mobprog (CHAR_DATA * ch, CHAR_DATA * mob, MOBPROG_DATA * program, int trigger, char *argument, int *ret) { char line[MAX_STRING_LENGTH]; char command[MAX_STRING_LENGTH]; char *line_ptr; char *prog_ptr; char *prog; char token[MAX_STRING_LENGTH]; int levels[MAX_PROG_LINES]; char *level_ptrs[MAX_PROG_LINES]; int level_ifs[MAX_DEPTH]; int lines; int level; int cur_level; int line_no; int i; *ret = 0; // temporary lockout if (1 || !engine.in_test_mode ()) { return; } if (ch->desc) { return; } // don't want progs active on bp if (engine.in_build_mode ()) return; prog = program->prog; for (lines = 0; lines < MAX_PROG_LINES; lines++) { levels[lines] = 0; level_ptrs[lines] = NULL; } setvar (mob, "mob", (long int) mob, MP_TYPE_CHAR_DATA); setvar (mob, "ch", (long int) ch, MP_TYPE_CHAR_DATA); setvar (mob, "room", (long int) vtor (mob->in_room), MP_TYPE_ROOM_DATA); prog_ptr = prog; level = 0; lines = 0; while ((level_ptrs[lines] = get_line (&prog_ptr, line))) { line_ptr = line; get_prog_token (&line_ptr, token); if (!str_cmp (token, "if") || !str_cmp (token, "while")) levels[lines] = level++; else if (!str_cmp (token, "elseif") || !str_cmp (token, "else")) levels[lines] = level - 1; else if (!str_cmp (token, "endif") || !str_cmp (token, "endwhile")) levels[lines] = --level; else levels[lines] = level; lines++; } line_no = 0; /* Re-entry for a delayed trigger */ if (ch->trigger_id == trigger) { /* Reset delayed trigger if trigger re-activated (vs the delay timer expired) */ if (!ch->trigger_delay) { /* Make it so all ifs (elseifs..) appear executed */ for (i = 0; i < MAX_DEPTH; i++) level_ifs[i] = 1; line_no = ch->trigger_line; } ch->trigger_id = 0; ch->trigger_delay = 0; } prog_ptr = level_ptrs[line_no]; while (get_line (&prog_ptr, line)) { strcpy (current_line, line); if (GET_POS (ch) == POSITION_DEAD) { *ret = 0; return; } line_ptr = line; get_prog_token (&line_ptr, token); if (*token == '!') ; else if (!*token || *token == '\n' || *token == '\r' || *token == ' ') ; else if (!str_cmp (token, "ci")) { mob_string (mob, &line_ptr, command); if (*command) command_interpreter (mob, command); if (mob->deleted) return; if (mob->delay || GET_FLAG (mob, FLAG_ENTERING) || GET_FLAG (mob, FLAG_LEAVING)) { mob->flags |= FLAG_INHIBITTED; mob->trigger_delay = 1; mob->trigger_line = line_no + 1; mob->trigger_id = trigger; return; } } else if (!str_cmp (token, "global") || !str_cmp (token, "var")) define_variable (mob, program, line_ptr); else if (!str_cmp (token, "while")) { require_open_paren (&line_ptr); cur_level = levels[line_no]; if (!mp_eval_eq (mob, &line_ptr)) { line_no++; while (levels[line_no] != cur_level) line_no++; } } else if (!str_cmp (token, "if") || !str_cmp (token, "elseif")) { cur_level = levels[line_no]; if (!str_cmp (token, "if")) level_ifs[cur_level] = 0; if (!level_ifs[cur_level]) require_open_paren (&line_ptr); if (level_ifs[cur_level] || !mp_eval_eq (mob, &line_ptr)) { while (levels[line_no + 1] != cur_level) line_no++; } else level_ifs[cur_level] = 1; } else if (!str_cmp (token, "else")) { cur_level = levels[line_no]; if (level_ifs[cur_level]) { while (levels[line_no + 1] != cur_level) line_no++; } } else if (!str_cmp (token, "reject_command")) { *ret = 0; return; } else if (!str_cmp (token, "endwhile")) { cur_level = levels[line_no]; if (line_no > 0) /* If there is an endwhile on the first line */ line_no--; while (line_no && levels[line_no] != cur_level) line_no--; line_no--; /* Gets incremented at the end of the while */ } else if (!str_cmp (token, "endif")); else if (!str_cmp (token, "delay")) { /* A previously delayed trigger is forgotten */ mob->trigger_delay = mp_eval_eq (mob, &line_ptr); mob->trigger_line = line_no + 1; mob->trigger_id = trigger; return; } else if (!str_cmp (token, "alarm")) mob->alarm = mp_eval_eq (mob, &line_ptr); else if (!str_cmp (token, "return")) return; else assignment (mob, program, token, &line_ptr); prog_ptr = level_ptrs[++line_no]; } }