diff -u /home/prool/mud/src/act.comm.cpp ./act.comm.cpp
--- /home/prool/mud/src/act.comm.cpp 2013-01-20 20:29:55.000000000 +0200
+++ ./act.comm.cpp 2013-02-09 16:11:04.000000000 +0200
@@ -671,7 +671,7 @@
{"Вы не можете орать.\r\n", /* holler */
"орать",
"Вы вне видимости канала.",
- KIYEL,
+ KIGRN, // KIYEL,
"заорали",
"заорал$g",
4,
@@ -681,7 +681,7 @@
{"Вам запрещено кричать.\r\n", /* shout */
"кричать",
"Вы вне видимости канала.\r\n",
- KIYEL,
+ KIGRN, // KIYEL,
"закричали",
"закричал$g",
2,
@@ -691,10 +691,10 @@
{"Вам недозволено болтать.\r\n", /* gossip */
"болтать",
"Вы вне видимости канала.\r\n",
- KYEL,
+ KIGRN, // KYEL,
"заметили",
"заметил$g",
- 3,
+ 2,
15,
PRF_NOGOSS},
diff -u /home/prool/mud/src/act.informative.cpp ./act.informative.cpp
--- /home/prool/mud/src/act.informative.cpp 2013-02-04 16:02:32.000000000 +0200
+++ ./act.informative.cpp 2013-02-08 16:28:51.000000000 +0200
@@ -79,6 +79,8 @@
extern int top_imtypes;
extern void show_code_date(CHAR_DATA *ch);
+extern int total_players;
+
/* extern functions */
long find_class_bitvector(char arg);
int level_exp(CHAR_DATA * ch, int level);
@@ -5681,8 +5683,8 @@
if ((opf = fopen(WHOLIST_FILE, "w")) == 0)
return; /* or log it ? *shrug* */
- fprintf(opf, "
Кто сейчас в Былинах?\n");
- fprintf(opf, "Кто сейчас живет в Былинах?
\n");
+ fprintf(opf, "Кто сейчас в MUD Virtustan-2\n");
+ fprintf(opf, "Кто сейчас в MUD Virtustan-2
\n");
sprintf(buf, "БОГИ
\r\n");
imms = str_add(imms, buf);
@@ -5710,7 +5712,7 @@
if (morts_num + imms_num == 0)
{
- sprintf(buf, "Все ушли на фронт!
");
+ sprintf(buf, "НИКОГО
");
buffer = str_add(buffer, buf);
}
else
@@ -5737,6 +5739,9 @@
buffer = str_add(buffer, ".\n");
}
+
+ sprintf(buf, "
Всего игроков %d", total_players=imms_num+morts_num); // prool
+ buffer = str_add(buffer, buf);
fprintf(opf, buffer);
Только в .: act.informative.cpp.orig
diff -u /home/prool/mud/src/act.other.cpp ./act.other.cpp
--- /home/prool/mud/src/act.other.cpp 2013-02-07 14:18:05.000000000 +0200
+++ ./act.other.cpp 2013-02-08 16:28:51.000000000 +0200
@@ -48,6 +48,8 @@
#include "room.hpp"
#include "objsave.h"
+#include "vmud2.h" // prool
+
using std::ifstream;
using std::fstream;
using std::map;
@@ -163,6 +165,8 @@
}
if (!GET_INVIS_LEV(ch))
act("$n покинул$g игру.", TRUE, ch, 0, 0, TO_ROOM | TO_ARENA_LISTEN);
+ perslog("вышел", GET_NAME(ch)); // prool
+ printf("%s %s вышел\n", ptime(), GET_NAME(ch));
sprintf(buf, "%s quit the game.", GET_NAME(ch));
mudlog(buf, NRM, MAX(LVL_GOD, GET_INVIS_LEV(ch)), SYSLOG, TRUE);
send_to_char("До свидания, странник... Мы ждем тебя снова!\r\n", ch);
@@ -2670,22 +2674,22 @@
send_to_char("Вам некуда возвращаться!\r\n", ch);
return;
}
- if (SECT(ch->in_room) != SECT_SECRET &&
+ if (0/*SECT(ch->in_room) != SECT_SECRET &&
!ROOM_FLAGGED(ch->in_room, ROOM_DEATH) &&
!ROOM_FLAGGED(ch->in_room, ROOM_TUNNEL) &&
!ROOM_FLAGGED(ch->in_room, ROOM_NOTELEPORTIN) &&
!ROOM_FLAGGED(ch->in_room, ROOM_SLOWDEATH) &&
!ROOM_FLAGGED(ch->in_room, ROOM_ICEDEATH) &&
(!ROOM_FLAGGED(ch->in_room, ROOM_GODROOM) || IS_IMMORTAL(ch)) &&
- Clan::MayEnter(ch, ch->in_room, HCE_PORTAL))
+ Clan::MayEnter(ch, ch->in_room, HCE_PORTAL)*/) // prool
{
send_to_char("У вас не получилось вернуться!\r\n", ch);
return;
}
send_to_char("Вам очень захотелось оказаться подальше от этого места!\r\n", ch);
- if (((GET_LEVEL(ch) <= FREE_RECALL_LEVEL)
- && (world[ch->in_room]->number > 300)) || IS_GOD(ch))
+ if (1/*((GET_LEVEL(ch) <= FREE_RECALL_LEVEL) // prool
+ && (world[ch->in_room]->number > 300)) || IS_GOD(ch)*/)
{
if (ch->in_room != real_room(GET_LOADROOM(ch)))
{
diff -u /home/prool/mud/src/act.wizard.cpp ./act.wizard.cpp
--- /home/prool/mud/src/act.wizard.cpp 2013-02-07 14:18:05.000000000 +0200
+++ ./act.wizard.cpp 2013-02-08 16:28:51.000000000 +0200
@@ -1,17 +1,10 @@
/* ************************************************************************
-* File: act.wizard.cpp Part of Bylins *
+* File: act.wizard.cpp Part of VMUD *
* Usage: Player-level god commands and other goodies *
-* *
-* All rights reserved. See license.doc for complete information. *
-* *
-* Copyright (C) 1993, 94 by the Trustees of the Johns Hopkins University *
-* CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991. *
-* *
-* $Author$ *
-* $Date$ *
-* $Revision$ *
************************************************************************ */
+#define PROOL_MAX_STRLEN 255
+
#include
#include
@@ -175,6 +168,10 @@
//
ACMD(do_godtest);
+// prool:
+ACMD(do_fflush);
+ACMD(do_kogda);
+ACMD(do_igroki);
#define MAX_TIME 0x7fffffff
@@ -663,6 +660,8 @@
}
}
+ send_to_char(newpass, ch); // prool
+
Player t_victim;
if ((victim = get_player_vis(ch, name, FIND_CHAR_WORLD)))
{
@@ -2180,7 +2179,7 @@
if (!str_cmp(arg, "reboot") && times > 0)
{
- times = MAX(30, times);
+ times = MAX(1, times);
sprintf(buf, "[ПЕРЕЗАГРУЗКА через %d %s]\r\n", times, desc_count(times, WHAT_SEC));
send_to_all(buf);
log("(GC) Reboot by %s.", GET_NAME(ch));
@@ -2193,7 +2192,7 @@
}
else if (!str_cmp(arg, "die") && times > 0)
{
- times = MAX(30, times);
+ times = MAX(1, times);
sprintf(buf, "[ОСТАНОВКА через %d %s]\r\n", times, desc_count(times, WHAT_SEC));
send_to_all(buf);
log("(GC) Shutdown die by %s.", GET_NAME(ch));
@@ -2206,7 +2205,7 @@
}
else if (!str_cmp(arg, "pause") && times > 0)
{
- times = MAX(30, times);
+ times = MAX(1, times);
sprintf(buf, "[ОСТАНОВКА через %d %s]\r\n", times, desc_count(times, WHAT_SEC));
send_to_all(buf);
log("(GC) Shutdown pause by %s.", GET_NAME(ch));
@@ -6145,3 +6144,45 @@
send_to_char("Ничего не найдено.\r\n", ch);
}
}
+
+
+ACMD(do_fflush) // prool
+{
+fflush(NULL);
+send_to_char("fflushed\n",ch);
+}
+
+ACMD(do_kogda) // prool
+{
+char str[PROOL_MAX_STRLEN];
+FILE *fp;
+
+ system("sh kogda.sh");
+
+ // читаем файл вывода и транслируем его игроку
+ fp=fopen("system.txt","r");
+ while (fgets(str,PROOL_MAX_STRLEN,fp)!=NULL)
+ {
+ send_to_char(str,ch);
+ send_to_char("\r",ch);
+ }
+ fclose(fp);
+}
+
+ACMD(do_igroki) // prool
+{
+char str[PROOL_MAX_STRLEN];
+FILE *fp;
+
+ system("sh igroki.sh");
+
+ // читаем файл вывода и транслируем его игроку
+ fp=fopen("system.txt","r");
+ while (fgets(str,PROOL_MAX_STRLEN,fp)!=NULL)
+ {
+ send_to_char(str,ch);
+ send_to_char("\r",ch);
+ }
+ fclose(fp);
+}
+
Только в .: act.wizard.cpp.orig
diff -u /home/prool/mud/src/boards.cpp ./boards.cpp
--- /home/prool/mud/src/boards.cpp 2013-02-08 16:28:51.000000000 +0200
+++ ./boards.cpp 2013-02-08 16:28:51.000000000 +0200
@@ -40,7 +40,7 @@
// максимальный размер сообщения
const int MAX_MESSAGE_LENGTH = 4096;
// мин.левел для поста на общих досках
-const int MIN_WRITE_LEVEL = 6;
+const int MIN_WRITE_LEVEL = 2; // prool
// максимальное кол-во сообщений на одной доске
const unsigned int MAX_BOARD_MESSAGES = 200;
// максимальное кол-во сообщений в опечатках/ошибках
diff -u /home/prool/mud/src/class.cpp ./class.cpp
--- /home/prool/mud/src/class.cpp 2013-02-05 14:41:56.000000000 +0200
+++ ./class.cpp 2013-02-08 16:28:51.000000000 +0200
@@ -2002,10 +2002,12 @@
for (std::vector::iterator it = ItemList.begin();it != ItemList.end();++it)
{
obj = read_object((*it), VIRTUAL);
+#if 0 // prool: почему-то вызывает креш
if (!OBJ_FLAGGED(obj, ITEM_NOSELL))
SET_BIT(GET_OBJ_EXTRA(obj, ITEM_NOSELL), ITEM_NOSELL);
if (!OBJ_FLAGGED(obj, ITEM_DECAY))
SET_BIT(GET_OBJ_EXTRA(obj, ITEM_DECAY), ITEM_DECAY);
+#endif
if (obj)
obj_to_char(obj, ch);
};
@@ -3041,7 +3043,7 @@
{
log("Ошибка при чтении файла %s: дублирование параметров для %d ремортов",
LIB_MISC "grouping", remorts);
- return 2;
+ return 0; // prool: было 2
}
if (remorts > MAX_REMORT || remorts < 0)
{
Только в .: class.cpp.orig
diff -u /home/prool/mud/src/comm.cpp ./comm.cpp
--- /home/prool/mud/src/comm.cpp 2013-02-08 16:28:51.000000000 +0200
+++ ./comm.cpp 2013-02-08 16:28:51.000000000 +0200
@@ -68,6 +68,8 @@
#include "sets_drop.hpp"
#include "fight.h"
+#include "vmud2.h"
+
#ifdef CIRCLE_MACINTOSH /* Includes for the Macintosh */
# define SIGPIPE 13
# define SIGALRM 14
@@ -124,7 +126,6 @@
extern int circle_restrict;
extern int mini_mud;
extern FILE *player_fl;
-extern ush_int DFLT_PORT;
extern const char *DFLT_DIR;
extern const char *DFLT_IP;
extern const char *LOGNAME;
@@ -134,6 +135,15 @@
extern int autosave_time; /* see config.cpp */
extern int mana[];
+// prool:
+#if 1
+extern int statistic_zones;
+extern int statistic_rooms;
+extern int statistic_mobs;
+extern int statistic_objs;
+int total_players;
+#endif
+
extern char *help;
extern struct zone_data *zone_table;
extern const char *save_info_msg[]; /* In olc.cpp */
@@ -183,6 +193,11 @@
{NULL, "log/imlog.txt", "ИНГРЕДИЕНТНАЯ МАГИЯ"}
};
+// prool:
+/* Port options ( These need to be altered in order to add more ports.) */
+int ports[10] = {8888,3000,3001,-1,-1,-1,-1,-1,-1,-1};
+socket_t mother_descs[10] = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
+
char src_path[4096];
/* functions in this file */
@@ -195,9 +210,9 @@
void sanity_check(void);
void circle_sleep(struct timeval *timeout);
int get_from_q(struct txt_q *queue, char *dest, int *aliased);
-void init_game(ush_int port);
+void init_game(int ports[]); // prool
void signal_setup(void);
-void game_loop(socket_t mother_desc);
+void game_loop();
socket_t init_socket(ush_int port);
int new_descriptor(socket_t s);
@@ -218,7 +233,7 @@
int set_sendbuf(socket_t s);
void setup_logs(void);
int open_logfile(log_info * li, FILE * stderr_fp);
-//void make_who2html();
+void make_who2html();
#if defined(POSIX)
sigfunc *my_signal(int signo, sigfunc * func);
@@ -271,7 +286,14 @@
#define FD_CLR(x, y)
#endif
-#if defined(HAVE_ZLIB)
+#define TELOPT_COMPRESS 85
+#define TELOPT_COMPRESS2 86
+
+void mssp_start(DESCRIPTOR_DATA * t);
+
+const char mssp_will[] = {IAC, WILL, MSSP, '\0'};
+
+#if 1 // defined(HAVE_ZLIB) // prool:оно никому не мешает и при отсутствии ZLIB
/*
* MUD Client for Linux and mcclient compression support.
* "The COMPRESS option (unofficial and completely arbitary) is
@@ -291,8 +313,6 @@
int mccp_start(DESCRIPTOR_DATA * t, int ver);
int mccp_end(DESCRIPTOR_DATA * t, int ver);
-#define TELOPT_COMPRESS 85
-#define TELOPT_COMPRESS2 86
const char compress_will[] = { IAC, WILL, TELOPT_COMPRESS2,
IAC, WILL, TELOPT_COMPRESS, '\0'
};
@@ -346,7 +366,7 @@
malloc_options = "A";
#endif
- ush_int port;
+extern int ports[10]; // prool
int pos = 1;
const char *dir;
@@ -356,6 +376,8 @@
plant_magic(buf2);
plant_magic(arg);
+total_players=0;
+
#ifdef CIRCLE_MACINTOSH
/*
* ccommand() calls the command line/io redirection dialog box from
@@ -366,7 +388,6 @@
GUSIDefaultSetup();
#endif
- port = DFLT_PORT;
dir = DFLT_DIR;
while ((pos < argc) && (*(argv[pos]) == '-'))
@@ -437,9 +458,9 @@
printf("Usage: %s [-c] [-m] [-q] [-r] [-s] [-d pathname] [port #]\n", argv[0]);
exit(1);
}
- else if ((port = atoi(argv[pos])) <= 1024)
+ else if ((ports[0] = atoi(argv[pos])) <= 1024)
{
- printf("SYSERR: Illegal port number %d.\n", port);
+ printf("SYSERR: Illegal port number %d.\n", ports[0]);
exit(1);
}
}
@@ -468,14 +489,14 @@
}
else
{
- log("Running game on port %d.", port);
+ log("Running game on port %d.", ports[0]);
// стль и буст юзаются уже немало где, а про их экспешены никто не думает
// пока хотя бы стльные ловить и просто логировать факт того, что мы вышли
// по эксепшену для удобства отладки и штатного сброса сислога в файл, т.к. в коре будет фиг
try
{
- init_game(port);
+ init_game(ports);
}
catch (std::exception &e)
{
@@ -493,9 +514,9 @@
/* Init sockets, run game, and cleanup sockets */
-void init_game(ush_int port)
+void init_game(int ports[])
{
- socket_t mother_desc;
+ int i;
// We don't want to restart if we crash before we get up.
touch(KILLSCRIPT_FILE);
@@ -504,8 +525,12 @@
log("Finding player limit.");
max_players = get_max_players();
- log("Opening mother connection.");
- mother_desc = init_socket(port);
+ log("Binding interface to ports:");
+ for (i = 0; ports[i] != -1;i++) {
+ log( " Opening port %d ...", ports[i]);
+ mother_descs[i] = init_socket(ports[i]);
+ }
+
//python_off scripting::init();
boot_db();
@@ -519,7 +544,7 @@
log("Entering game loop.");
- game_loop(mother_desc);
+ game_loop();
flush_player_index();
@@ -562,7 +587,10 @@
// должно идти после дисконекта плееров
FileCRC::save(true);
- CLOSE_SOCKET(mother_desc);
+ for (i = 0; ports[i] != -1;i++) {
+ CLOSE_SOCKET(mother_descs[i]);
+ }
+
if (circle_reboot != 2 && olc_save_list) // Don't save zones.
{
struct olc_save_info *entry, *next_entry;
@@ -886,23 +914,27 @@
chdir(cwd);
}
-inline void process_io(fd_set input_set, fd_set output_set, fd_set exc_set, fd_set null_set,
- socket_t mother_desc, int maxdesc)
+inline void process_io(fd_set input_set, fd_set output_set, fd_set exc_set, fd_set null_set, int maxdesc)
{
DESCRIPTOR_DATA *d, *next_d;
char comm[MAX_INPUT_LENGTH];
- int aliased;
+ int i, aliased;
/* Poll (without blocking) for new input, output, and exceptions */
if (select(maxdesc + 1, &input_set, &output_set, &exc_set, &null_time)
< 0)
{
- perror("SYSERR: Select poll");
+ log("SYSERR: Select poll /prool"); // prool
+ //perror("SYSERR: Select poll"); // prool
+ //printf("%s SYSERR: Select poll\n", ptime()); // prool
return;
}
/* If there are new connections waiting, accept them. */
- if (FD_ISSET(mother_desc, &input_set))
- new_descriptor(mother_desc);
+
+ for (i = 0; mother_descs[i] != -1;i++) {
+ if (FD_ISSET(mother_descs[i], &input_set))
+ new_descriptor(mother_descs[i]);
+ }
/* Kick out the freaky folks in the exception set and marked for close */
for (d = descriptor_list; d; d = next_d)
@@ -1050,13 +1082,13 @@
* output and sending it out to players, and calling "heartbeat" functions
* such as mobile_activity().
*/
-void game_loop(socket_t mother_desc)
+void game_loop()
{
fd_set input_set, output_set, exc_set, null_set;
struct timeval last_time, opt_time, process_time, temp_time;
struct timeval before_sleep, now, timeout;
DESCRIPTOR_DATA *d;
- int missed_pulses = 0, maxdesc;
+ int i, missed_pulses = 0, maxdesc;
/* initialize various time values */
null_time.tv_sec = 0;
@@ -1074,27 +1106,42 @@
if (descriptor_list == NULL)
{
log("No connections. Going to sleep.");
- //make_who2html();
+ make_who2html();
FD_ZERO(&input_set);
- FD_SET(mother_desc, &input_set);
- if (select(mother_desc + 1, &input_set, (fd_set *) 0, (fd_set *) 0, NULL) < 0)
- {
- if (errno == EINTR)
- log("Waking up to process signal.");
- else
- perror("SYSERR: Select coma");
- }
- else
- log("New connection. Waking up.");
+#if 1 // 1 - prool
+ for (i = 0;mother_descs[i] != -1;i++)
+ FD_SET(mother_descs[i], &input_set);
+
+ if (select(mother_descs[i-1] + 1, &input_set, (fd_set *) 0, (fd_set *) 0, NULL) < 0) {
+
+ if (errno == EINTR)
+ {
+ log("Waking up to process signal");
+ //printf("Waking up to process signal\n"); //prool
+ }
+ else
+ perror("SYSERR: Select coma");
+ } else {
+ //printf("%s New connection. Waking up\n", ptime()); //prool
+ log("New connection. Waking up");
+ }
+#endif
gettimeofday(&last_time, (struct timezone *) 0);
}
/* Set up the input, output, and exception sets for select(). */
FD_ZERO(&input_set);
FD_ZERO(&output_set);
FD_ZERO(&exc_set);
- FD_SET(mother_desc, &input_set);
- maxdesc = mother_desc;
+ maxdesc = -1;
+ /* add all mother sockets */
+ for (i = 0; mother_descs[i] != -1;i++) {
+ FD_SET(mother_descs[i], &input_set);
+ if (mother_descs[i] > maxdesc)
+ maxdesc = mother_descs[i];
+ }
+
+
for (d = descriptor_list; d; d = d->next)
{
#ifndef CIRCLE_WINDOWS
@@ -1174,7 +1221,7 @@
/* Now execute the heartbeat functions */
while (missed_pulses--)
{
- process_io(input_set, output_set, exc_set, null_set, mother_desc, maxdesc);
+ process_io(input_set, output_set, exc_set, null_set, maxdesc);
heartbeat(missed_pulses);
}
@@ -1280,7 +1327,7 @@
if (!(pulse % (30 * PASSES_PER_SEC)))
{
- //make_who2html();
+ make_who2html();
if (uptime_minutes >= (reboot_uptime - 30) && shutdown_time == 0)
{
//reboot after 30 minutes minimum. Auto reboot cannot run earlier.
@@ -2334,6 +2381,7 @@
"Select one : ", newd);
#endif
+ write_to_descriptor(newd->descriptor, mssp_will, strlen(mssp_will));
#if defined(HAVE_ZLIB)
// write_to_descriptor(newd->descriptor, will_sig, strlen(will_sig));
write_to_descriptor(newd->descriptor, compress_will, strlen(compress_will));
@@ -2351,19 +2399,19 @@
if ((cd = iconv_open("UTF-8","KOI8-R")) == (iconv_t) - 1)
{
- printf("koi_to_utf8: iconv_open error\n");
+ printf("%s koi_to_utf8: iconv_open error\n", ptime());
return;
}
len_i = strlen(str_i);
if ((i = iconv(cd, &str_i, &len_i, &str_o, &len_o)) == (size_t) - 1)
{
- printf("koi_to_utf8: iconv error\n");
+ printf("%s koi_to_utf8: iconv error\n", ptime());
return;
}
*str_o = 0;
if (iconv_close(cd) == -1)
{
- printf("koi_to_utf8: iconv_close error\n");
+ printf("%s koi_to_utf8: iconv_close error\n", ptime());
return;
}
}
@@ -2376,18 +2424,18 @@
if ((cd = iconv_open("KOI8-R", "UTF-8")) == (iconv_t) - 1)
{
- printf("utf8_to_koi: iconv_open error\n");
+ printf("%s utf8_to_koi: iconv_open error\n", ptime());
return;
}
len_i = strlen(str_i);
if ((i=iconv(cd, &str_i, &len_i, &str_o, &len_o)) == (size_t) - 1)
{
- printf("utf8_to_koi: iconv error\n");
+ printf("%s utf8_to_koi: iconv error\n", ptime());
// return;
}
if (iconv_close(cd) == -1)
{
- printf("utf8_to_koi: iconv_close error\n");
+ printf("%s utf8_to_koi: iconv_close error\n", ptime());
return;
}
}
@@ -2818,7 +2866,7 @@
* We don't know what happened, cut them off. This qualifies for
* a SYSERR because we have no idea what happened at this point.
*/
- perror("SYSERR: perform_socket_read: about to lose connection");
+ //perror("SYSERR: perform_socket_read: about to lose connection"); // prool
return (-1);
}
@@ -2860,7 +2908,7 @@
read_point[bytes_read] = '\0'; /* terminate the string */
-#if defined(HAVE_ZLIB)
+#if 1 // defined(HAVE_ZLIB) // prool:этот блок уже не только занимается сжатием, но и MSSP
/* Search for an "Interpret As Command" marker. */
for (ptr = read_point; *ptr; ptr++)
{
@@ -2880,6 +2928,13 @@
mccp_start(t, 1);
else if (ptr[2] == (char) TELOPT_COMPRESS2)
mccp_start(t, 2);
+ else if (ptr[2] == (char) MSSP) // prool
+ {char buf0[100];
+ mssp_start(t);
+ // printf("%s MSSP start %s. Online %i\n", ptime(), t->host, total_players);
+ sprintf(buf0,"MSSP start %s. Online %i", t->host, total_players);
+ log(buf0);
+ }
else
continue;
memmove(ptr, ptr + 3, bytes_read - (ptr - read_point) - 3 + 1);
@@ -3307,6 +3362,8 @@
check_light(d->character, LIGHT_NO, LIGHT_NO, LIGHT_NO, LIGHT_NO, -1);
Crash_ldsave(d->character);
sprintf(buf, "Closing link to: %s.", GET_NAME(d->character));
+ perslog("потерял связь", GET_NAME(d->character)); // prool
+ printf("%s %s потерял связь\n", ptime(), GET_NAME(d->character)); // prool
mudlog(buf, NRM, MAX(LVL_GOD, GET_INVIS_LEV(d->character)), SYSLOG, TRUE);
}
d->character->desc = NULL;
@@ -3314,6 +3371,7 @@
else
{
sprintf(buf, "Losing player: %s %s.", GET_NAME(d->character) ? GET_NAME(d->character) : "", STATE(d) > CON_CLOSE && STATE(d) < CON_DISCONNECT ? d->host : "");
+ // printf("Losing player: %s %s\n", GET_NAME(d->character) ? GET_NAME(d->character) : "", STATE(d) > CON_CLOSE && STATE(d) < CON_DISCONNECT ? d->host : ""); // prool
mudlog(buf, LGH, MAX(LVL_GOD, GET_INVIS_LEV(d->character)), SYSLOG, TRUE);
if (!any_other_ch(d->character))
Depot::exit_char(d->character);
@@ -3375,7 +3433,7 @@
next_d = d->next;
if (STATE(d) != CON_PASSWORD && STATE(d) != CON_GET_NAME && STATE(d) != CON_GET_KEYTABLE)
continue;
- if (!d->idle_tics)
+ if (d->idle_tics<3) // prool: timeout in ticks
{
d->idle_tics++;
continue;
@@ -4251,7 +4309,7 @@
if (li->logfile)
{
- printf("Using log file '%s'%s.\n", li->filename, stderr_fp ? " with redirection" : "");
+ //printf("Using log file '%s'%s.\n", li->filename, stderr_fp ? " with redirection" : "");
return (TRUE);
}
Только в .: comm.cpp.orig
diff -u /home/prool/mud/src/config.cpp ./config.cpp
--- /home/prool/mud/src/config.cpp 2013-01-20 20:29:55.000000000 +0200
+++ ./config.cpp 2013-02-08 16:28:51.000000000 +0200
@@ -111,6 +111,8 @@
{
if ((GET_LEVEL(ch) < 15) && (GET_REMORT(ch) == 0))
return (0);
+ else if (GET_LEVEL(ch)==LVL_IMPL) // prool
+ return 0;
else
return ((GET_LEVEL(ch) + 30 * GET_REMORT(ch)) * 2);
}
@@ -189,18 +191,18 @@
/* ROOM NUMBERS */
/* virtual number of room that mortals should enter at */
-room_vnum mortal_start_room = 4056; /* tavern in village */
+room_vnum mortal_start_room = 9900; // 4056 tavern in village
/* virtual number of room that immorts should enter at by default */
room_vnum immort_start_room = 100; /* place in castle */
/* virtual number of room that frozen players should enter at */
-room_vnum frozen_start_room = 101; /* something in castle */
+room_vnum frozen_start_room = 102; /* something in castle */
/* virtual number of room that helled players should enter at */
-room_vnum helled_start_room = 101; /* something in castle */
-room_vnum named_start_room = 105;
-room_vnum unreg_start_room = 103;
+room_vnum helled_start_room = 102; /* something in castle */
+room_vnum named_start_room = 102;
+room_vnum unreg_start_room = 102;
/****************************************************************************/
/****************************************************************************/
@@ -209,15 +211,6 @@
/* GAME OPERATION OPTIONS */
/*
- * This is the default port on which the game should run if no port is
- * given on the command-line. NOTE WELL: If you're using the
- * 'autorun' script, the port number there will override this setting.
- * Change the PORT= line in autorun instead of (or in addition to)
- * changing this.
- */
-ush_int DFLT_PORT = 4000;
-
-/*
* IP address to which the MUD should bind. This is only useful if
* you're running Circle on a host that host more than one IP interface,
* and you only want to bind to *one* of them instead of all of them.
diff -u /home/prool/mud/src/constants.cpp ./constants.cpp
--- /home/prool/mud/src/constants.cpp 2013-02-05 14:41:56.000000000 +0200
+++ ./constants.cpp 2013-02-08 16:28:51.000000000 +0200
@@ -23,22 +23,22 @@
const char *circlemud_version = "CircleMUD, version 3.00 beta patchlevel 16";
-int HORSE_VNUM = 4014;
+int HORSE_VNUM = 2008;
int HORSE_COST = 100;
-int START_SWORD = 112;
-int START_CLUB = 121;
-int START_KNIFE = 122;
-int START_SCROLL = 115;
-int START_BREAD = 125;
-int CREATE_LIGHT = 126;
-int START_LIGHT = 127;
-int START_ARMOR = 113;
-int START_BOTTLE = 114;
-int START_BOW = 109;
-int START_WRUNE = 693;
-int START_ERUNE = 692;
-int START_ARUNE = 695;
-int START_FRUNE = 694;
+int START_SWORD = 9909;
+int START_CLUB = 2024;
+int START_KNIFE = 9908;
+int START_SCROLL = 9970;
+int START_BREAD = 9902;
+int CREATE_LIGHT = 9908;
+int START_LIGHT = 9907;
+int START_ARMOR = 9924;
+int START_BOTTLE = 9905;
+int START_BOW = 9974;
+int START_WRUNE = 223;
+int START_ERUNE = 222;
+int START_ARUNE = 225;
+int START_FRUNE = 224;
/*Experience multiplication coefficients*/
double exp_coefficients[] =
@@ -2291,7 +2291,7 @@
};
//-Polud
-const char *places_of_birth[] = { "Киев",
+const char *places_of_birth[] = { "Харьков",
"Новгород",
"\n"
};
Только в .: constants.cpp.orig
diff -u /home/prool/mud/src/db.cpp ./db.cpp
--- /home/prool/mud/src/db.cpp 2013-02-04 16:02:32.000000000 +0200
+++ ./db.cpp 2013-02-08 16:28:51.000000000 +0200
@@ -7,11 +7,10 @@
* Copyright (C) 1993, 94 by the Trustees of the Johns Hopkins University *
* CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991. *
* *
-* $Author$ *
-* $Date$ *
-* $Revision$ *
************************************************************************ */
+//#define DEBUG // by prool
+
#define __DB_C__
#include
@@ -73,8 +72,15 @@
#include "sets_drop.hpp"
#include "fight.h"
+#include "vmud2.h"
+
#define TEST_OBJECT_TIMER 30
+// prool:
+#define DEFAULT_MAX_MOB_IN_WORLD 100
+#define DEFAULT_MAX_MOB_IN_ROOM 2
+#define DEFAULT_MAX_OBJ_IN_WORLD 100
+
/**************************************************************************
* declarations of global containers and objects *
**************************************************************************/
@@ -1762,12 +1768,21 @@
exit(1);
log("Booting specials assigment");
+#ifdef DEBUG
+ puts("Booting specials assigment");
+#endif
init_spec_procs();
log("Booting guilds");
+#ifdef DEBUG
+ puts("Booting guilds"); // prool
+#endif
init_guilds();
log("Booting portals for 'town portal' spell");
+#ifdef DEBUG
+ puts("Booting portals for 'town portal' spell"); // prool
+#endif
portals_list = NULL;
init_portals();
@@ -1868,6 +1883,7 @@
ObjSystem::init_item_levels();
boot_time = time(0);
+ perslog("MUD перезапущен", " "); // prool
log("Boot db -- DONE.");
}
@@ -2217,14 +2233,15 @@
}
rewind(index);
- fscanf(index, "%s\n", buf1);
- while (*buf1 != '$')
+ while (1)
{
+ fscanf(index, "%s\n", buf1);
+ if (*buf1=='$') break; // prool
sprintf(buf2, "%s%s", prefix, buf1);
if (!(db_file = fopen(buf2, "r")))
{
log("SYSERR: %s: %s", buf2, strerror(errno));
- exit(1);
+ continue; // exit(1); // prool: отсутствие файла просто игнорируем, это не критично
}
switch (mode)
{
@@ -2254,7 +2271,6 @@
if (mode == DB_BOOT_WLD)
parse_room(db_file, 0, TRUE);
fclose(db_file);
- fscanf(index, "%s\n", buf1);
}
fclose(index);
// Create virtual room for zone
@@ -5204,6 +5220,17 @@
switch (ZCMD.command)
{
case 'M':
+
+ // by prool: Если ZCMD.arg2 (максимальное кол-во мобов в мире, как я понял) = 0 или -1
+ // (то есть, при создании моба в редакторе это поле забыли прописать), то присваиваем
+ // ему значение DEFAULT_MAX_MOB_IN_WORLD
+ if ((ZCMD.arg2==0) || (ZCMD.arg2==-1)) ZCMD.arg2=DEFAULT_MAX_MOB_IN_WORLD;
+
+ // by prool: Если ZCMD.arg4 (максимальное кол-во мобов в комнате, как я понял) = 0
+ // (то есть, при создании моба в редакторе это поле забыли прописать), то присваиваем
+ // ему значение DEFAULT_MAX_MOB_IN_ROOM
+ if (ZCMD.arg4==0) ZCMD.arg4=DEFAULT_MAX_MOB_IN_ROOM;
+
/* read a mobile */
// 'M'
mob = NULL; //Добавлено Ладником
@@ -5263,6 +5290,16 @@
case 'O':
/* read an object */
// 'O'
+
+ // by prool: Если ZCMD.arg2 (максимальное кол-во объектов в мире, как я понял) = 0 или -1
+ // (то есть, при создании объекта в редакторе это поле забыли прописать), то присваиваем
+ // ему значение DEFAULT_MAX_OBJ_IN_WORLD
+ if ((ZCMD.arg2==0) || (ZCMD.arg2==-1)) ZCMD.arg2=DEFAULT_MAX_OBJ_IN_WORLD;
+
+#ifdef DEBUG
+printf("load obj. lbl 1\n");
+#endif
+
/* Проверка - сколько всего таких же обьектов надо на эту клетку */
for (cmd_tmp = 0, obj_in_room_max = 0; ZCMD_CMD(cmd_tmp).command != 'S'; cmd_tmp++)
if ((ZCMD_CMD(cmd_tmp).command == 'O')
@@ -5277,7 +5314,7 @@
obj_in_room++;
/* Теперь грузим обьект если надо */
if ((obj_index[ZCMD.arg1].number + obj_index[ZCMD.arg1].stored <
- GET_OBJ_MIW(obj_proto[ZCMD.arg1]) || GET_OBJ_MIW(obj_proto[ZCMD.arg1]) == -1) &&
+ GET_OBJ_MIW(obj_proto[ZCMD.arg1]) || GET_OBJ_MIW(obj_proto[ZCMD.arg1])<=0) &&
(ZCMD.arg4 <= 0 || number(1, 100) <= ZCMD.arg4)
&& (obj_in_room < obj_in_room_max))
{
@@ -5288,8 +5325,17 @@
if (!obj_to_room(obj, ZCMD.arg3))
{
extract_obj(obj);
+#ifdef DEBUG
+printf("load obj. lbl NO\n");
+#endif
break;
}
+ else
+ {
+#ifdef DEBUG
+printf("load obj. lbl OK\n");
+#endif
+ }
load_otrigger(obj);
}
else
@@ -5307,6 +5353,9 @@
}
}
tmob = NULL;
+#ifdef DEBUG
+printf("load obj. lbl z\n");
+#endif
break;
case 'P':
diff -u /home/prool/mud/src/db.h ./db.h
--- /home/prool/mud/src/db.h 2012-11-21 23:43:02.000000000 +0200
+++ ./db.h 2013-02-08 16:28:51.000000000 +0200
@@ -166,7 +166,8 @@
#define BAN_FILE LIB_ETC"badsites" /* for the siteban system */
#define PROXY_BAN_FILE LIB_ETC"badproxy" /* for the siteban system */
-#define WHOLIST_FILE LIB_STAT"wholist.html" /* for the stat system */
+// #define WHOLIST_FILE LIB_STAT"wholist.html" /* for the stat system */
+#define WHOLIST_FILE "/var/www/mudstat/vmud2.html" // by prool
/*Dead load (dl_load) options*/
#define DL_ORDINARY 0
diff -u /home/prool/mud/src/.depend ./.depend
--- /home/prool/mud/src/.depend 2013-01-19 23:12:48.000000000 +0200
+++ ./.depend 2013-02-08 16:33:00.000000000 +0200
@@ -5,11 +5,11 @@
house.h house_exp.hpp room.hpp spam.hpp
act.informative.o: act.informative.cpp conf.h sysdep.h structs.h utils.h \
features.hpp obj.hpp pugixml.hpp pugiconfig.hpp comm.h interpreter.h \
- handler.h db.h spells.h skills.h fight.h screen.h constants.h pk.h \
- dg_scripts.h mail.h im.h house.h house_exp.hpp char.hpp player_i.hpp \
- morph.hpp remember.hpp description.h privilege.hpp depot.hpp glory.hpp \
- random.hpp char_player.hpp quested.hpp mobmax.hpp dps.hpp parcel.hpp \
- liquid.hpp modify.h room.hpp glory_const.hpp player_races.hpp corpse.hpp \
+ handler.h db.h spells.h skills.h fight.h char.hpp player_i.hpp morph.hpp \
+ screen.h constants.h pk.h dg_scripts.h mail.h im.h house.h house_exp.hpp \
+ remember.hpp description.h privilege.hpp depot.hpp glory.hpp random.hpp \
+ char_player.hpp quested.hpp mobmax.hpp dps.hpp parcel.hpp liquid.hpp \
+ modify.h room.hpp glory_const.hpp player_races.hpp corpse.hpp \
sets_drop.hpp
act.item.o: act.item.cpp conf.h sysdep.h structs.h utils.h features.hpp \
obj.hpp pugixml.hpp pugiconfig.hpp comm.h interpreter.h handler.h db.h \
@@ -31,7 +31,7 @@
spells.h skills.h screen.h house.h house_exp.hpp char.hpp player_i.hpp \
morph.hpp remember.hpp constants.h dg_scripts.h pk.h fight.h magic.h \
depot.hpp privilege.hpp random.hpp char_player.hpp quested.hpp \
- mobmax.hpp dps.hpp room.hpp objsave.h
+ mobmax.hpp dps.hpp room.hpp objsave.h vmud2.h
act.social.o: act.social.cpp conf.h sysdep.h structs.h utils.h \
features.hpp obj.hpp pugixml.hpp pugiconfig.hpp comm.h interpreter.h \
handler.h db.h spells.h char.hpp player_i.hpp morph.hpp room.hpp
@@ -42,9 +42,9 @@
pk.h im.h top.h ban.hpp diskio.h description.h title.hpp password.hpp \
privilege.hpp depot.hpp glory.hpp genchar.h file_crc.hpp char_player.hpp \
quested.hpp mobmax.hpp dps.hpp parcel.hpp liquid.hpp modify.h room.hpp \
- glory_misc.hpp glory_const.hpp shop_ext.hpp celebrates.hpp \
- player_races.hpp birth_places.hpp corpse.hpp sets_drop.hpp \
- fight.h
+ glory_misc.hpp glory_const.hpp shop_ext.hpp dictionary.hpp \
+ celebrates.hpp player_races.hpp birth_places.hpp corpse.hpp \
+ sets_drop.hpp fight.h
alias.o: alias.cpp conf.h sysdep.h structs.h utils.h features.hpp obj.hpp \
pugixml.hpp pugiconfig.hpp interpreter.h db.h char.hpp player_i.hpp \
morph.hpp comm.h
@@ -68,7 +68,7 @@
deathtrap.hpp title.hpp depot.hpp glory.hpp file_crc.hpp char_player.hpp \
quested.hpp mobmax.hpp dps.hpp parcel.hpp pk.h spells.h skills.h \
corpse.hpp room.hpp glory_misc.hpp glory_const.hpp celebrates.hpp \
- shop_ext.hpp sets_drop.hpp fight.h
+ shop_ext.hpp dictionary.hpp sets_drop.hpp fight.h vmud2.h
config.o: config.cpp conf.h sysdep.h structs.h interpreter.h utils.h \
features.hpp obj.hpp pugixml.hpp pugiconfig.hpp constants.h char.hpp \
player_i.hpp morph.hpp comm.h birth_places.hpp
@@ -89,11 +89,11 @@
genchar.h random.hpp file_crc.hpp skills.h char_player.hpp quested.hpp \
mobmax.hpp dps.hpp parcel.hpp liquid.hpp corpse.hpp name_list.hpp \
modify.h room.hpp glory_const.hpp glory_misc.hpp shop_ext.hpp \
- named_stuff.hpp celebrates.hpp player_races.hpp birth_places.hpp \
- sets_drop.hpp fight.h
+ dictionary.hpp named_stuff.hpp celebrates.hpp player_races.hpp \
+ birth_places.hpp sets_drop.hpp fight.h vmud2.h
fight.o: fight.cpp fight.h conf.h sysdep.h structs.h utils.h features.hpp \
- obj.hpp pugixml.hpp pugiconfig.hpp fight_local.hpp AffectHandler.hpp \
- char.hpp player_i.hpp morph.hpp comm.h handler.h interpreter.h db.h \
+ obj.hpp pugixml.hpp pugiconfig.hpp char.hpp player_i.hpp morph.hpp \
+ comm.h fight_local.hpp AffectHandler.hpp handler.h interpreter.h db.h \
spells.h screen.h constants.h dg_scripts.h im.h skills.h random.hpp \
char_player.hpp quested.hpp mobmax.hpp remember.hpp dps.hpp magic.h \
room.hpp genchar.h sets_drop.hpp olc.h
@@ -122,7 +122,7 @@
top.h title.hpp password.hpp privilege.hpp depot.hpp glory.hpp \
char_player.hpp quested.hpp mobmax.hpp dps.hpp parcel.hpp liquid.hpp \
name_list.hpp modify.h room.hpp glory_const.hpp glory_misc.hpp \
- named_stuff.hpp player_races.hpp birth_places.hpp
+ named_stuff.hpp player_races.hpp birth_places.hpp vmud2.h
limits.o: limits.cpp conf.h sysdep.h structs.h utils.h features.hpp \
obj.hpp pugixml.hpp pugiconfig.hpp spells.h skills.h comm.h db.h \
handler.h screen.h interpreter.h constants.h dg_scripts.h house.h \
@@ -133,7 +133,7 @@
magic.o: magic.cpp conf.h sysdep.h structs.h utils.h features.hpp obj.hpp \
pugixml.hpp pugiconfig.hpp comm.h spells.h skills.h handler.h db.h \
interpreter.h screen.h constants.h dg_scripts.h pk.h magic.h fight.h \
- deathtrap.hpp random.hpp char.hpp player_i.hpp morph.hpp poison.hpp \
+ char.hpp player_i.hpp morph.hpp deathtrap.hpp random.hpp poison.hpp \
modify.h room.hpp AffectHandler.hpp
mail.o: mail.cpp conf.h sysdep.h structs.h utils.h features.hpp obj.hpp \
pugixml.hpp pugiconfig.hpp comm.h db.h interpreter.h handler.h mail.h \
@@ -143,7 +143,7 @@
obj.hpp pugixml.hpp pugiconfig.hpp db.h comm.h interpreter.h handler.h \
spells.h skills.h constants.h pk.h random.hpp char.hpp player_i.hpp \
morph.hpp house.h house_exp.hpp remember.hpp room.hpp shop_ext.hpp \
- fight.h
+ dictionary.hpp fight.h
modify.o: modify.cpp conf.h sysdep.h structs.h utils.h features.hpp \
obj.hpp pugixml.hpp pugiconfig.hpp interpreter.h handler.h db.h comm.h \
spells.h mail.h boards.h screen.h olc.h house.h house_exp.hpp char.hpp \
@@ -151,17 +151,18 @@
objsave.o: objsave.cpp conf.h sysdep.h structs.h comm.h handler.h db.h \
pugixml.hpp pugiconfig.hpp interpreter.h utils.h features.hpp obj.hpp \
spells.h screen.h house.h house_exp.hpp char.hpp player_i.hpp morph.hpp \
- remember.hpp im.h depot.hpp liquid.hpp file_crc.hpp room.hpp mail.h \
- dg_scripts.h objsave.h
+ remember.hpp im.h depot.hpp liquid.hpp file_crc.hpp named_stuff.hpp \
+ room.hpp mail.h dg_scripts.h objsave.h vmud2.h
olc.o: olc.cpp conf.h sysdep.h structs.h interpreter.h utils.h \
features.hpp obj.hpp pugixml.hpp pugiconfig.hpp comm.h db.h olc.h \
dg_olc.h dg_scripts.h screen.h item.creation.hpp im.h privilege.hpp \
char.hpp player_i.hpp morph.hpp room.hpp
-random.o: random.cpp conf.h random.hpp sysdep.h
+random.o: random.cpp conf.h random.hpp sysdep.h utils.h features.hpp \
+ obj.hpp structs.h pugixml.hpp pugiconfig.hpp
shop.o: shop.cpp conf.h sysdep.h structs.h comm.h handler.h db.h \
pugixml.hpp pugiconfig.hpp interpreter.h utils.h features.hpp obj.hpp \
- shop.h dg_scripts.h constants.h char.hpp player_i.hpp morph.hpp modify.h \
- room.hpp pk.h
+ shop.h dg_scripts.h constants.h named_stuff.hpp char.hpp player_i.hpp \
+ morph.hpp modify.h room.hpp pk.h
spec_assign.o: spec_assign.cpp conf.h sysdep.h structs.h db.h pugixml.hpp \
pugiconfig.hpp constants.h interpreter.h utils.h features.hpp obj.hpp \
house.h house_exp.hpp char.hpp player_i.hpp morph.hpp comm.h \
@@ -201,8 +202,8 @@
features.hpp obj.hpp pugixml.hpp pugiconfig.hpp db.h shop.h olc.h \
dg_olc.h dg_scripts.h im.h depot.hpp char.hpp player_i.hpp morph.hpp \
house.h interpreter.h house_exp.hpp remember.hpp skills.h parcel.hpp \
- liquid.hpp name_list.hpp corpse.hpp shop_ext.hpp constants.h \
- sets_drop.hpp
+ liquid.hpp name_list.hpp corpse.hpp shop_ext.hpp dictionary.hpp \
+ constants.h sets_drop.hpp
zedit.o: zedit.cpp conf.h sysdep.h structs.h comm.h utils.h features.hpp \
obj.hpp pugixml.hpp pugiconfig.hpp db.h olc.h dg_scripts.h char.hpp \
player_i.hpp morph.hpp room.hpp
@@ -277,7 +278,7 @@
auction.o: auction.cpp conf.h sysdep.h structs.h screen.h utils.h \
features.hpp obj.hpp pugixml.hpp pugiconfig.hpp comm.h interpreter.h \
handler.h db.h auction.h constants.h char.hpp player_i.hpp morph.hpp \
- room.hpp pk.h
+ room.hpp named_stuff.hpp pk.h
item.creation.o: item.creation.cpp conf.h sysdep.h structs.h screen.h \
spells.h skills.h pugixml.hpp pugiconfig.hpp constants.h utils.h \
features.hpp obj.hpp comm.h interpreter.h handler.h db.h olc.h im.h \
@@ -291,7 +292,7 @@
obj.hpp pugixml.hpp pugiconfig.hpp comm.h interpreter.h handler.h db.h \
screen.h exchange.h im.h constants.h skills.h char.hpp player_i.hpp \
morph.hpp char_player.hpp quested.hpp mobmax.hpp remember.hpp dps.hpp \
- modify.h room.hpp mail.h objsave.h pk.h
+ named_stuff.hpp modify.h room.hpp mail.h objsave.h pk.h
top.o: top.cpp conf.h sysdep.h structs.h utils.h features.hpp obj.hpp \
pugixml.hpp pugiconfig.hpp interpreter.h comm.h screen.h top.h glory.hpp \
char.hpp player_i.hpp morph.hpp
@@ -402,10 +403,11 @@
comm.h db.h screen.h char_player.hpp quested.hpp mobmax.hpp remember.hpp \
dps.hpp modify.h
shop_ext.o: shop_ext.cpp pugixml.hpp pugiconfig.hpp shop_ext.hpp conf.h \
- sysdep.h interpreter.h utils.h features.hpp obj.hpp structs.h char.hpp \
- player_i.hpp morph.hpp comm.h db.h shop.h handler.h constants.h \
- dg_scripts.h room.hpp glory.hpp glory_const.hpp screen.h house.h \
- house_exp.hpp remember.hpp modify.h liquid.hpp
+ sysdep.h interpreter.h utils.h features.hpp obj.hpp structs.h \
+ dictionary.hpp char.hpp player_i.hpp morph.hpp comm.h db.h shop.h \
+ handler.h constants.h dg_scripts.h room.hpp glory.hpp glory_const.hpp \
+ named_stuff.hpp screen.h house.h house_exp.hpp remember.hpp modify.h \
+ liquid.hpp
named_stuff.o: named_stuff.cpp pugixml.hpp pugiconfig.hpp named_stuff.hpp \
conf.h sysdep.h interpreter.h utils.h features.hpp obj.hpp structs.h \
screen.h char.hpp player_i.hpp morph.hpp comm.h db.h handler.h house.h \
@@ -427,19 +429,25 @@
player_i.hpp morph.hpp comm.h handler.h dg_scripts.h im.h room.hpp \
modify.h house.h interpreter.h house_exp.hpp remember.hpp screen.h
fight_hit.o: fight_hit.cpp fight.h conf.h sysdep.h structs.h utils.h \
- features.hpp obj.hpp pugixml.hpp pugiconfig.hpp fight_local.hpp \
- AffectHandler.hpp char.hpp player_i.hpp morph.hpp comm.h skills.h \
- constants.h spells.h handler.h db.h room.hpp screen.h interpreter.h \
- dg_scripts.h pk.h dps.hpp house_exp.hpp poison.hpp
+ features.hpp obj.hpp pugixml.hpp pugiconfig.hpp char.hpp player_i.hpp \
+ morph.hpp comm.h fight_local.hpp AffectHandler.hpp skills.h constants.h \
+ spells.h handler.h db.h room.hpp screen.h interpreter.h dg_scripts.h \
+ pk.h dps.hpp house_exp.hpp poison.hpp
fight_stuff.o: fight_stuff.cpp fight.h conf.h sysdep.h structs.h utils.h \
- features.hpp obj.hpp pugixml.hpp pugiconfig.hpp fight_local.hpp \
- AffectHandler.hpp char.hpp player_i.hpp morph.hpp comm.h skills.h \
- handler.h db.h room.hpp spells.h dg_scripts.h corpse.hpp house.h \
- interpreter.h house_exp.hpp remember.hpp pk.h stuff.hpp double_map.hpp \
- sets_drop.hpp top.h constants.h screen.h magic.h
+ features.hpp obj.hpp pugixml.hpp pugiconfig.hpp char.hpp player_i.hpp \
+ morph.hpp comm.h fight_local.hpp AffectHandler.hpp skills.h handler.h \
+ db.h room.hpp spells.h dg_scripts.h corpse.hpp house.h interpreter.h \
+ house_exp.hpp remember.hpp pk.h stuff.hpp double_map.hpp sets_drop.hpp \
+ top.h constants.h screen.h magic.h
version.o: version.cpp conf.h sysdep.h structs.h comm.h utils.h \
features.hpp obj.hpp pugixml.hpp pugiconfig.hpp
objsave_ext.o: objsave_ext.cpp objsave.h conf.h sysdep.h structs.h \
house.h utils.h features.hpp obj.hpp pugixml.hpp pugiconfig.hpp db.h \
interpreter.h house_exp.hpp char.hpp player_i.hpp morph.hpp comm.h \
remember.hpp depot.hpp parcel.hpp
+dictionary.o: dictionary.cpp dictionary.hpp shop_ext.hpp conf.h sysdep.h \
+ interpreter.h utils.h features.hpp obj.hpp structs.h pugixml.hpp \
+ pugiconfig.hpp
+vmud2.o: vmud2.cpp interpreter.h conf.h utils.h features.hpp obj.hpp \
+ sysdep.h structs.h pugixml.hpp pugiconfig.hpp comm.h db.h handler.h \
+ dg_scripts.h char.hpp player_i.hpp morph.hpp telnet.h vmud2.h
diff -u /home/prool/mud/src/interpreter.cpp ./interpreter.cpp
--- /home/prool/mud/src/interpreter.cpp 2013-02-08 16:28:51.000000000 +0200
+++ ./interpreter.cpp 2013-02-08 16:28:51.000000000 +0200
@@ -57,6 +57,8 @@
#include "player_races.hpp"
#include "birth_places.hpp"
+#include "vmud2.h"
+
extern room_rnum r_mortal_start_room;
extern room_rnum r_immort_start_room;
extern room_rnum r_frozen_start_room;
@@ -405,6 +407,11 @@
//python_off ACMD(do_console);
ACMD(do_shops_list);
+// prool:
+ACMD(do_fflush);
+ACMD(do_kogda);
+ACMD(do_igroki);
+
/* This is the Master Command List(tm).
* You can put new commands in, take commands out, change the order
@@ -506,6 +513,7 @@
{"дрновости", POS_DEAD, DoBoard, 1, CLANNEWS_BOARD, -1},
{"дрвече", POS_DEAD, DoBoard, 1, CLAN_BOARD, -1},
{"дрлист", POS_DEAD, DoClanPkList, 0, 1, 0},
+ {"духмада", POS_DEAD, do_duhmada, 0, 1, 0}, // prool
{"есть", POS_RESTING, do_eat, 0, SCMD_EAT, 500},
@@ -537,6 +545,7 @@
{"инвентарь", POS_SLEEPING, do_inventory, 0, 0, 0},
{"игнорировать", POS_DEAD, do_ignore, 0, 0, 0},
+ {"игроки", POS_DEAD, do_igroki, 0, 0, 0},
{"идеи", POS_DEAD, DoBoard, 1, IDEA_BOARD, 0},
{"идея", POS_DEAD, do_gen_write, 0, SCMD_IDEA, 0},
{"изгнать нежить", POS_RESTING, do_turn_undead, 0, 0, -1},
@@ -549,6 +558,7 @@
{"казна", POS_RESTING, do_not_here, 1, 0, 0},
{"клан", POS_RESTING, DoHouse, 0, 0, 0},
{"клич", POS_FIGHTING, do_warcry, 1, 0, -1},
+ {"когда", POS_DEAD, do_kogda, 0, 0, 0},
{"кодер", POS_DEAD, DoBoard, 1, GODCODE_BOARD, -1},
{"команды", POS_DEAD, do_commands, 0, SCMD_COMMANDS, 0},
{"коне", POS_SLEEPING, do_quit, 0, 0, 0},
@@ -816,6 +826,7 @@
{"exits", POS_RESTING, do_exits, 0, 0, 500},
{"featset", POS_SLEEPING, do_featset, LVL_IMPL, 0, 0},
{"features", POS_SLEEPING, do_features, 0, 0, 0},
+ {"fflush", POS_DEAD, do_fflush, LVL_GRGOD, 0, 0},
{"fill", POS_STANDING, do_pour, 0, SCMD_FILL, 500},
{"fit", POS_RESTING, do_fit, 0, SCMD_DO_ADAPT, 500},
{"flee", POS_FIGHTING, do_flee, 1, 0, -1},
@@ -1940,6 +1951,8 @@
check_light(d->character, LIGHT_NO, LIGHT_NO, LIGHT_NO, LIGHT_NO, 1);
act("$n восстановил$g связь.", TRUE, d->character, 0, 0, TO_ROOM);
sprintf(buf, "%s [%s] has reconnected.", GET_NAME(d->character), d->host);
+ printf("%s %s [%s] has reconnected\n", ptime(), GET_NAME(d->character), d->host); // prool
+ perslog("пересоединился", GET_NAME(d->character)); // prool
mudlog(buf, NRM, MAX(LVL_IMMORT, GET_INVIS_LEV(d->character)), SYSLOG, TRUE);
login_change_invoice(d->character);
break;
@@ -2051,7 +2064,7 @@
continue;
if (IS_NPC(ch))
continue;
- if (ch && !IS_IMMORTAL(ch) && (!str_cmp(GET_EMAIL(ch), GET_EMAIL(d->character))))
+ if (0/*ch && !IS_IMMORTAL(ch) && (!str_cmp(GET_EMAIL(ch), GET_EMAIL(d->character)))*/)
{
sprintf(buf, "Вы не можете войти одновременно с %s!\r\n"
"Одинаковый email адрес!\r\n", GET_PAD(ch, 4));
@@ -2342,6 +2355,10 @@
("Воспользуйтесь командой НОВИЧОК для получения вводной информации игроку.\r\n", d->character);
}
sprintf(buf, "%s вошел в игру.", GET_NAME(d->character));
+ if (strcmp(GET_NAME(d->character),"Пруль"))
+ send_email("VMUD", "proolix@gmail.com", "User logon", (char *) GET_NAME(d->character));
+ printf("%s %s вошел в игру [%s]\n", ptime(), GET_NAME(d->character), d->host);
+ perslog("вошел", GET_NAME(d->character)); // prool
mudlog(buf, NRM, MAX(LVL_IMMORT, GET_INVIS_LEV(d->character)), SYSLOG, TRUE);
look_at_room(d->character, 0);
d->has_prompt = 0;
@@ -2536,12 +2553,12 @@
if (parse_exist_name(pwd_name, tmp_name) ||
(player_i = load_char(tmp_name, d->character)) < 0)
{
- SEND_TO_Q("Некорректное имя. Повторите, пожалуйста.\r\n" "Имя : ", d);
+ SEND_TO_Q("Ошибка 1. Некорректное имя. Повторите, пожалуйста.\r\n" "Имя : ", d);
return;
}
if (PLR_FLAGGED(d->character, PLR_DELETED) || !Password::compare_password(d->character, pwd_pwd))
{
- SEND_TO_Q("Некорректное имя. Повторите, пожалуйста.\r\n" "Имя : ", d);
+ SEND_TO_Q("Ошибка 2. Некорректное имя. Повторите, пожалуйста.\r\n" "Имя : ", d);
if (!PLR_FLAGGED(d->character, PLR_DELETED))
{
sprintf(buf, "Bad PW: %s [%s]", GET_NAME(d->character), d->host);
@@ -2565,7 +2582,7 @@
strlen(tmp_name) > MAX_NAME_LENGTH ||
!Is_Valid_Name(tmp_name) || fill_word(tmp_name) || reserved_word(tmp_name))
{
- SEND_TO_Q("Некорректное имя. Повторите, пожалуйста.\r\n" "Имя : ", d);
+ SEND_TO_Q("Ошибка 3. Некорректное имя. Повторите, пожалуйста.\r\n" "Имя : ", d);
return;
}
else if (!Is_Valid_Dc(tmp_name))
@@ -2585,7 +2602,7 @@
/* Check for multiple creations... */
if (!Valid_Name(tmp_name) || _parse_name(tmp_name, tmp_name))
{
- SEND_TO_Q("Некорректное имя. Повторите, пожалуйста.\r\n" "Имя : ", d);
+ SEND_TO_Q("Ошибка 4. Некорректное имя. Повторите, пожалуйста.\r\n" "Имя : ", d);
return;
}
CreateChar(d);
@@ -2614,7 +2631,7 @@
/* Check for multiple creations of a character. */
if (!Valid_Name(tmp_name) || _parse_name(tmp_name, tmp_name))
{
- SEND_TO_Q("Некорректное имя. Повторите, пожалуйста.\r\n" "Имя : ", d);
+ SEND_TO_Q("Ошибка 5. Некорректное имя. Повторите, пожалуйста.\r\n" "Имя : ", d);
return;
}
if (cmp_ptable_by_name(tmp_name, MIN_NAME_LENGTH + 1) >= 0)
@@ -2663,7 +2680,7 @@
{
case 0: // Auto - agree
sprintf(buf,
- "Введите пароль для %s (не вводите пароли типа '123' или 'qwe', иначе ваших персонажев могут украсть) : ",
+ "Введите пароль для %s : ",
GET_PAD(d->character, 1));
SEND_TO_Q(buf, d);
STATE(d) = CON_NEWPASSWD;
@@ -2703,7 +2720,7 @@
strlen(tmp_name) > MAX_NAME_LENGTH ||
!Is_Valid_Name(tmp_name) || fill_word(tmp_name) || reserved_word(tmp_name))
{
- SEND_TO_Q("Некорректное имя. Повторите, пожалуйста.\r\n" "Имя : ", d);
+ SEND_TO_Q("Ошибка 6. Некорректное имя. Повторите, пожалуйста.\r\n" "Имя : ", d);
return;
}
player_i = load_char(tmp_name, d->character);
@@ -2725,7 +2742,7 @@
}
if (!Valid_Name(tmp_name))
{
- SEND_TO_Q("Некорректное имя. Повторите, пожалуйста.\r\n" "Имя : ", d);
+ SEND_TO_Q("Ошибка 7. Некорректное имя. Повторите, пожалуйста.\r\n" "Имя : ", d);
return;
}
if (cmp_ptable_by_name(tmp_name, MIN_NAME_LENGTH + 1) >= 0)
@@ -2761,7 +2778,7 @@
{
case 0: // Auto - agree
sprintf(buf,
- "Введите пароль для %s (не вводите пароли типа '123' или 'qwe', иначе ваших персонажев могут украсть) : ",
+ "Введите пароль для %s : ",
GET_PAD(d->character, 1));
SEND_TO_Q(buf, d);
STATE(d) = CON_NEWPASSWD;
@@ -3206,7 +3223,7 @@
{
case '0':
- SEND_TO_Q("\r\nДо встречи на земле Киевской.\r\n", d);
+ SEND_TO_Q("\r\nДо встречи на земле Харьковской.\r\n", d);
if (GET_REMORT(d->character) == 0 && GET_LEVEL(d->character) <= 25
&& !IS_SET(PLR_FLAGS(d->character, PLR_NODELETE), PLR_NODELETE))
@@ -3461,7 +3478,7 @@
CREATE(GET_PAD(d->character, 5), char, strlen(tmp_name) + 1);
strcpy(GET_PAD(d->character, 5), CAP(tmp_name));
sprintf(buf,
- "Введите пароль для %s (не вводите пароли типа '123' или 'qwe', иначе ваших персонажев могут украсть) : ",
+ "Введите пароль для %s : ",
GET_PAD(d->character, 1));
SEND_TO_Q(buf, d);
STATE(d) = CON_NEWPASSWD;
Только в .: interpreter.cpp.orig
diff -u /home/prool/mud/src/mail.cpp ./mail.cpp
--- /home/prool/mud/src/mail.cpp 2013-02-05 14:41:56.000000000 +0200
+++ ./mail.cpp 2013-02-08 16:28:51.000000000 +0200
@@ -672,7 +672,7 @@
GET_OBJ_WEIGHT(obj) = 1;
GET_OBJ_COST(obj) = 30;
GET_OBJ_RENT(obj) = 10;
- obj->set_timer(24 * 60);
+ obj->set_timer(24 * 60 * 10); // prool: увеличил время жизни писем в 10 раз
obj->action_description = read_delete(GET_IDNUM(ch));
if (obj->action_description == NULL)
Только в .: mail.cpp.orig
diff -u /home/prool/mud/src/mail.h ./mail.h
--- /home/prool/mud/src/mail.h 2012-11-21 23:43:03.000000000 +0200
+++ ./mail.h 2013-02-08 16:28:51.000000000 +0200
@@ -27,7 +27,7 @@
#define MIN_MAIL_LEVEL 2
/* # of gold coins required to send mail */
-#define STAMP_PRICE 50
+#define STAMP_PRICE 1 // 50
/* Maximum size of mail in bytes (arbitrary) */
#define MAX_MAIL_SIZE 4096
diff -u /home/prool/mud/src/Makefile ./Makefile
--- /home/prool/mud/src/Makefile 2013-02-05 14:41:56.000000000 +0200
+++ ./Makefile 2013-02-08 16:28:51.000000000 +0200
@@ -40,7 +40,8 @@
corpse.o house_exp.o remember.o name_list.o dps.o obj.spell.o obj.o room.o \
spam.o AffectHandler.o glory_const.o pugixml.o morph.o glory_misc.o \
shop_ext.o named_stuff.o birth_places.o player_races.o celebrates.o cache.o \
- sets_drop.o fight_hit.o fight_stuff.o objsave_ext.o dictionary.o version.o
+ sets_drop.o fight_hit.o fight_stuff.o objsave_ext.o dictionary.o \
+ vmud2.o version.o
CXREF_FILES = act.comm.cpp act.informative.cpp act.item.cpp act.movement.cpp \
@@ -60,9 +61,10 @@
name_list.cpp dps.cpp obj.spell.cpp obj.cpp room.cpp spam.cpp AffectHandler.cpp \
glory_const.cpp pugixml.cpp glory_misc.cpp shop_ext.cpp named_stuff.cpp \
celebrates.cpp birth_places.cpp player_races.cpp morph.cpp cache.cpp \
- sets_drop.cpp fight_hit.cpp fight_stuff.cpp version.cpp objsave_ext.cpp dictionary.cpp
+ sets_drop.cpp fight_hit.cpp fight_stuff.cpp version.cpp objsave_ext.cpp dictionary.cpp \
+ vmud2.cpp
-default: circle
+default: vmud2
#all: .accepted
# $(MAKE) $(BINDIR)/circle
@@ -70,12 +72,12 @@
#accepted:
# @./licheck less
-circle:
- $(MAKE) $(BINDIR)/circle
+vmud2:
+ $(MAKE) $(BINDIR)/vmud2
-$(BINDIR)/circle : $(OBJFILES)
+$(BINDIR)/vmud2 : $(OBJFILES)
$(MKDIR) $(BINDIR)
- $(CC) -o $(BINDIR)/circle $(OBJFILES) $(LIBS)
+ $(CC) -o $(BINDIR)/vmud2 $(OBJFILES) $(LIBS)
rm -f version.o
@echo "Done building Bylins."
@@ -91,13 +93,13 @@
@echo "Done building dependencies."
test:
- $(MAKE) CFLAGS="$(TESTCFLAGS)" CC="$(TESTCC)" $(BINDIR)/circle
+ $(MAKE) CFLAGS="$(TESTCFLAGS)" CC="$(TESTCC)" $(BINDIR)/vmud2
debug:
- $(MAKE) CFLAGS="$(TESTCFLAGS) $(DEBUGFLAGS)" CC="$(TESTCC)" $(BINDIR)/circle
+ $(MAKE) CFLAGS="$(TESTCFLAGS) $(DEBUGFLAGS)" CC="$(TESTCC)" $(BINDIR)/vmud2
fasttest:
- $(MAKE) CFLAGS="$(FASTTEST)" CC="$(TESTCC)" $(BINDIR)/circle
+ $(MAKE) CFLAGS="$(FASTTEST)" CC="$(TESTCC)" $(BINDIR)/vmud2
# Dependencies for the object files (automagically generated with
# gcc -MM)
diff -u /home/prool/mud/src/objsave.cpp ./objsave.cpp
--- /home/prool/mud/src/objsave.cpp 2013-02-01 12:37:41.000000000 +0200
+++ ./objsave.cpp 2013-02-08 16:28:51.000000000 +0200
@@ -37,6 +37,8 @@
#include "features.hpp"
#include "objsave.h"
+#include "vmud2.h" // prool
+
#define LOC_INVENTORY 0
#define MAX_BAG_ROWS 5
#define ITEM_DESTROYED 100
@@ -2927,6 +2929,9 @@
Crash_rentsave(ch, cost);
sprintf(buf, "%s has rented (%d/day, %ld tot.)",
GET_NAME(ch), cost, ch->get_gold() + ch->get_bank());
+ printf("%s %s has rented (%d/day, %ld tot.)\n", ptime(), // prool
+ GET_NAME(ch), cost, ch->get_gold() + ch->get_bank());
+ perslog("ушел на ренту", GET_NAME(ch)); // prool
}
else /* cryo */
{
Только в .: objsave.cpp.orig
diff -u /home/prool/mud/src/spec_assign.cpp ./spec_assign.cpp
--- /home/prool/mud/src/spec_assign.cpp 2012-12-19 22:37:15.000000000 +0200
+++ ./spec_assign.cpp 2013-02-08 16:28:51.000000000 +0200
@@ -188,6 +188,8 @@
{
log("Bad format for special string!\r\n"
"Format : ");
+ printf("Bad format for special string!\r\n"); // prool
+ fflush(NULL); // prool
_exit(1);
}
log("<%s>-%d-[%s]", line1, i, line2);
@@ -229,7 +231,9 @@
else
{
log("Error in specials file!\r\n" "May be : mob, obj or room...");
- _exit(1);
+ printf("Error in specials file!\r\n" "May be : mob, obj or room...\n\n"); // prool
+ fflush(NULL); // prool
+ _exit(1); // prool
}
}
fclose(magic);
diff -u /home/prool/mud/src/spec_procs.cpp ./spec_procs.cpp
--- /home/prool/mud/src/spec_procs.cpp 2013-01-20 20:29:55.000000000 +0200
+++ ./spec_procs.cpp 2013-02-08 16:28:51.000000000 +0200
@@ -12,6 +12,8 @@
* $Revision$ *
************************************************************************ */
+// #define DEBUG // prool
+
#include "conf.h"
#include "sysdep.h"
#include "structs.h"
@@ -598,6 +600,7 @@
if (lines < 5)
{
log("Bad format for monoguild header, #s #s #s #s #s need...");
+ puts("Bad format for monoguild header, #s #s #s #s #s need..."); // prool
_exit(1);
}
mono_guild.learn_info = NULL;
@@ -631,14 +634,18 @@
{
if ((num = atoi(line1)) == 0 || real_mobile(num) < 0)
{
- log("Cann't assign master %s in guilds.lst", line1);
- _exit(1);
+ log("Can't assign master %s in guilds.lst", line1);
+#ifdef DEBUG
+ printf("Can't assign master %s in guilds.lst\n", line1); // prool
+#endif
+ // _exit(1); // prool
}
if (!((type == 1 || type == 11) && mono_guild.learn_info) &&
!((type == 2 || type == 12) && poly_guild))
{
log("Cann't define guild info for master %s", line1);
+ printf("Cann't define guild info for master %s\n", line1); // prool
_exit(1);
}
if (type == 1 || type == 11)
@@ -692,6 +699,7 @@
if (lines < 3)
{
log("You need use 3 arguments for monoguild");
+ puts("You need use 3 arguments for monoguild"); // prool
_exit(1);
}
if ((spellnum = atoi(line)) == 0 || spellnum > MAX_SPELLS)
@@ -717,11 +725,13 @@
if (skillnum <= 0 && spellnum <= 0 && featnum <= 0)
{
log("Unknown skill, spell or feat for monoguild");
+ puts("Unknown skill, spell or feat for monoguild"); // prool
_exit(1);
}
if ((level = atoi(line2)) == 0 || level >= LVL_IMMORT)
{
log("Use 1-%d level for guilds", LVL_IMMORT);
+ printf("Use 1-%d level for guilds\n", LVL_IMMORT); // prool
_exit(1);
}
if (!mono_guild.learn_info)
@@ -740,6 +750,7 @@
if (lines < 7)
{
log("You need use 7 arguments for poluguild");
+ puts("You need use 7 arguments for poluguild"); // prool
_exit(1);
}
if (!poly_guild)
@@ -787,11 +798,13 @@
if (skillnum <= 0 && spellnum <= 0 && featnum <= 0)
{
log("Unknown skill, spell or feat for polyguild");
+ puts("Unknown skill, spell or feat for polyguild"); // prool
_exit(1);
}
if ((level = atoi(line6)) == 0 || level >= LVL_IMMORT)
{
log("Use 1-%d level for guilds", LVL_IMMORT);
+ printf("Use 1-%d level for guilds\n", LVL_IMMORT); // prool
_exit(1);
}
(poly_guild + pgcount)->spell_no = MAX(0, spellnum);
diff -u /home/prool/mud/src/spell_parser.cpp ./spell_parser.cpp
--- /home/prool/mud/src/spell_parser.cpp 2013-02-05 14:41:56.000000000 +0200
+++ ./spell_parser.cpp 2013-02-08 16:28:51.000000000 +0200
@@ -5190,7 +5190,7 @@
skillo(SKILL_WARCRY, "боевой клич", 100);
skillo(SKILL_TURN_UNDEAD, "изгнать нежить", 100);
skillo(SKILL_IRON_WIND, "железный ветер", 150);
- skillo(SKILL_STRANGLE, "удавить", 200);
+ skillo(SKILL_STRANGLE, "удавить", 150);
}
Только в .: spell_parser.cpp.orig
diff -u /home/prool/mud/src/structs.h ./structs.h
--- /home/prool/mud/src/structs.h 2013-02-07 14:18:05.000000000 +0200
+++ ./structs.h 2013-02-08 16:28:51.000000000 +0200
@@ -1129,7 +1129,7 @@
#define MAX_RAW_INPUT_LENGTH 512 /* Max size of *raw* input */
#define MAX_MESSAGES 600
#define MAX_NAME_LENGTH 20
-#define MIN_NAME_LENGTH 4
+#define MIN_NAME_LENGTH 3 // prool
#define HOST_LENGTH 30
#define EXDSCR_LENGTH 512
#define MAX_SPELLS 350
Только в .: structs.h.orig
diff -u /home/prool/mud/src/version.cpp ./version.cpp
--- /home/prool/mud/src/version.cpp 2012-11-21 23:43:03.000000000 +0200
+++ ./version.cpp 2013-02-08 16:28:51.000000000 +0200
@@ -14,7 +14,7 @@
void show_code_date(CHAR_DATA *ch)
{
- send_to_char(ch, "МПМ Былины, версия от %s %s\r\n", __DATE__, __TIME__);
+ send_to_char(ch, "Virtustan-2, after wipe; compile by %s %s\r\n", __DATE__, __TIME__);
}
void log_code_date()
Только в .: vmud2.cpp
Только в .: vmud2.h