- Part 3 of TheUltraMage's socket cleanup.
- Fixed the packet structure in mmo_char_send006b for PACKETVER 8. - Removed search_str from add_str (add_str already searches for the string). - Native script words like do,while,for,... are case insensitive now. - Changed SCRIPT_HASH_SIZE to 1021 (prime hash sizes give better distributions). - Added alternative hash implementations to the script engine (to try out later). removed int_homun.c from header section of the VS8 map project files git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@9588 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
parent
807acd0aac
commit
f863581174
@ -4,6 +4,15 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO
|
|||||||
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
|
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
|
||||||
|
|
||||||
2006/12/28
|
2006/12/28
|
||||||
|
* Part 3 of TheUltraMage's socket cleanup.
|
||||||
|
* Fixed the packet structure in mmo_char_send006b for PACKETVER 8.
|
||||||
|
* Removed search_str from add_str (add_str already searches for the
|
||||||
|
string).
|
||||||
|
* Native script words like do,while,for,... are case insensitive now.
|
||||||
|
* Changed SCRIPT_HASH_SIZE to 1021 (prime hash sizes give better
|
||||||
|
distributions).
|
||||||
|
* Added alternative hash implementations to the script engine (to try out
|
||||||
|
later). [FlavioJS]
|
||||||
* Added a func_parse invocation when an invalid socket is found, so that
|
* Added a func_parse invocation when an invalid socket is found, so that
|
||||||
the underlying code (char/map/login) can handle it and free any related
|
the underlying code (char/map/login) can handle it and free any related
|
||||||
resources.
|
resources.
|
||||||
|
@ -1694,7 +1694,12 @@ int mmo_char_send006b(int fd, struct char_session_data *sd) {
|
|||||||
|
|
||||||
for(i = 0; i < found_num; i++) {
|
for(i = 0; i < found_num; i++) {
|
||||||
p = &char_dat[sd->found_char[i]].status;
|
p = &char_dat[sd->found_char[i]].status;
|
||||||
|
#if PACKETVER > 7
|
||||||
|
j = offset + (found_num * 2) + (i * 106); // increase speed of code
|
||||||
|
WFIFOW(fd,offset+(i*2)) = 1; //TODO: Handle this rename bit: 0 to enable renaming
|
||||||
|
#else
|
||||||
j = offset + (i * 106); // increase speed of code
|
j = offset + (i * 106); // increase speed of code
|
||||||
|
#endif
|
||||||
|
|
||||||
WFIFOL(fd,j) = p->char_id;
|
WFIFOL(fd,j) = p->char_id;
|
||||||
WFIFOL(fd,j+4) = p->base_exp>LONG_MAX?LONG_MAX:p->base_exp;
|
WFIFOL(fd,j+4) = p->base_exp>LONG_MAX?LONG_MAX:p->base_exp;
|
||||||
@ -1729,18 +1734,13 @@ int mmo_char_send006b(int fd, struct char_session_data *sd) {
|
|||||||
|
|
||||||
memcpy(WFIFOP(fd,j+74), p->name, NAME_LENGTH);
|
memcpy(WFIFOP(fd,j+74), p->name, NAME_LENGTH);
|
||||||
|
|
||||||
WFIFOB(fd,j+98) = (p->str > 255) ? 255 : p->str;
|
WFIFOB(fd,j+98) = (p->str > UCHAR_MAX) ? UCHAR_MAX : p->str;
|
||||||
WFIFOB(fd,j+99) = (p->agi > 255) ? 255 : p->agi;
|
WFIFOB(fd,j+99) = (p->agi > UCHAR_MAX) ? UCHAR_MAX : p->agi;
|
||||||
WFIFOB(fd,j+100) = (p->vit > 255) ? 255 : p->vit;
|
WFIFOB(fd,j+100) = (p->vit > UCHAR_MAX) ? UCHAR_MAX : p->vit;
|
||||||
WFIFOB(fd,j+101) = (p->int_ > 255) ? 255 : p->int_;
|
WFIFOB(fd,j+101) = (p->int_ > UCHAR_MAX) ? UCHAR_MAX : p->int_;
|
||||||
WFIFOB(fd,j+102) = (p->dex > 255) ? 255 : p->dex;
|
WFIFOB(fd,j+102) = (p->dex > UCHAR_MAX) ? UCHAR_MAX : p->dex;
|
||||||
WFIFOB(fd,j+103) = (p->luk > 255) ? 255 : p->luk;
|
WFIFOB(fd,j+103) = (p->luk > UCHAR_MAX) ? UCHAR_MAX : p->luk;
|
||||||
#if PACKETVER > 7
|
|
||||||
WFIFOW(fd,j+104) = p->char_num;
|
WFIFOW(fd,j+104) = p->char_num;
|
||||||
WFIFOB(fd,j+106) = 1; //TODO: Handle this rename bit: 0 to enable renaming
|
|
||||||
#else
|
|
||||||
WFIFOB(fd,j+104) = p->char_num;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
WFIFOSET(fd,WFIFOW(fd,2));
|
WFIFOSET(fd,WFIFOW(fd,2));
|
||||||
|
@ -1725,7 +1725,8 @@ int mmo_char_send006b(int fd, struct char_session_data *sd) {
|
|||||||
p = &char_dat;
|
p = &char_dat;
|
||||||
|
|
||||||
#if PACKETVER > 7
|
#if PACKETVER > 7
|
||||||
j = offset + (i * 108);
|
j = offset + (found_num * 2) + (i * 108);
|
||||||
|
WFIFOW(fd,offset+(i*2)) = 1; //TODO: Handle this rename bit: 0 to enable renaming //Updated packet structure with rename-button included. Credits to Sara-chan
|
||||||
#else
|
#else
|
||||||
j = offset + (i * 106); // increase speed of code
|
j = offset + (i * 106); // increase speed of code
|
||||||
#endif
|
#endif
|
||||||
@ -1769,13 +1770,7 @@ int mmo_char_send006b(int fd, struct char_session_data *sd) {
|
|||||||
WFIFOB(fd,j+101) = (p->int_ > UCHAR_MAX) ? UCHAR_MAX : p->int_;
|
WFIFOB(fd,j+101) = (p->int_ > UCHAR_MAX) ? UCHAR_MAX : p->int_;
|
||||||
WFIFOB(fd,j+102) = (p->dex > UCHAR_MAX) ? UCHAR_MAX : p->dex;
|
WFIFOB(fd,j+102) = (p->dex > UCHAR_MAX) ? UCHAR_MAX : p->dex;
|
||||||
WFIFOB(fd,j+103) = (p->luk > UCHAR_MAX) ? UCHAR_MAX : p->luk;
|
WFIFOB(fd,j+103) = (p->luk > UCHAR_MAX) ? UCHAR_MAX : p->luk;
|
||||||
#if PACKETVER > 7
|
|
||||||
//Updated packet structure with rename-button included. Credits to Sara-chan
|
|
||||||
WFIFOW(fd,j+104) = p->char_num;
|
WFIFOW(fd,j+104) = p->char_num;
|
||||||
WFIFOB(fd,j+106) = 1; //TODO: Handle this rename bit: 0 to enable renaming
|
|
||||||
#else
|
|
||||||
WFIFOB(fd,j+104) = p->char_num;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
WFIFOSET(fd,WFIFOW(fd,2));
|
WFIFOSET(fd,WFIFOW(fd,2));
|
||||||
// printf("mmo_char_send006b end..\n");
|
// printf("mmo_char_send006b end..\n");
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#ifdef __WIN32
|
#ifdef __WIN32
|
||||||
#define __USE_W32_SOCKETS
|
#define WIN32_LEAN_AND_MEAN
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <winsock.h>
|
#include <winsock.h>
|
||||||
#include <io.h>
|
#include <io.h>
|
||||||
@ -30,14 +30,21 @@
|
|||||||
// portability layer
|
// portability layer
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
typedef int socklen_t;
|
typedef int socklen_t;
|
||||||
#define EBADF WSAENOTSOCK
|
|
||||||
#define ECONNABORTED WSAECONNABORTED
|
#define s_errno WSAGetLastError()
|
||||||
#define EAGAIN WSAEWOULDBLOCK
|
#define S_ENOTSOCK WSAENOTSOCK
|
||||||
|
#define S_EWOULDBLOCK WSAEWOULDBLOCK
|
||||||
|
#define S_ECONNABORTED WSAECONNABORTED
|
||||||
#else
|
#else
|
||||||
#define SOCKET_ERROR -1
|
#define SOCKET_ERROR -1
|
||||||
#define INVALID_SOCKET -1
|
#define INVALID_SOCKET -1
|
||||||
#define ioctlsocket ioctl
|
#define ioctlsocket ioctl
|
||||||
#define closesocket close
|
#define closesocket close
|
||||||
|
|
||||||
|
#define s_errno errno
|
||||||
|
#define S_ENOTSOCK EBADF
|
||||||
|
#define S_EWOULDBLOCK EAGAIN
|
||||||
|
#define S_ECONNABORTED ECONNABORTED
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
@ -55,11 +62,6 @@ time_t last_tick;
|
|||||||
time_t stall_time = 60;
|
time_t stall_time = 60;
|
||||||
int ip_rules = 1;
|
int ip_rules = 1;
|
||||||
|
|
||||||
// reuse port
|
|
||||||
#ifndef SO_REUSEPORT
|
|
||||||
#define SO_REUSEPORT 15
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef TCP_FRAME_LEN
|
#ifndef TCP_FRAME_LEN
|
||||||
#define TCP_FRAME_LEN 1024
|
#define TCP_FRAME_LEN 1024
|
||||||
#endif
|
#endif
|
||||||
@ -126,7 +128,7 @@ void set_nonblocking(int fd, int yes)
|
|||||||
// FIONBIO Use with a nonzero argp parameter to enable the nonblocking mode of socket s.
|
// FIONBIO Use with a nonzero argp parameter to enable the nonblocking mode of socket s.
|
||||||
// The argp parameter is zero if nonblocking is to be disabled.
|
// The argp parameter is zero if nonblocking is to be disabled.
|
||||||
if (ioctlsocket(fd, FIONBIO, &yes) != 0)
|
if (ioctlsocket(fd, FIONBIO, &yes) != 0)
|
||||||
ShowError("Couldn't set the socket to non-blocking mode (code %d)!\n", h_errno);
|
ShowError("Couldn't set the socket to non-blocking mode (code %d)!\n", s_errno);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setsocketopts(int fd)
|
static void setsocketopts(int fd)
|
||||||
@ -176,12 +178,12 @@ static int recv_to_fifo(int fd)
|
|||||||
len = recv(fd, (char *) session[fd]->rdata + session[fd]->rdata_size, RFIFOSPACE(fd), 0);
|
len = recv(fd, (char *) session[fd]->rdata + session[fd]->rdata_size, RFIFOSPACE(fd), 0);
|
||||||
|
|
||||||
if (len == SOCKET_ERROR) {
|
if (len == SOCKET_ERROR) {
|
||||||
if (h_errno == ECONNABORTED) {
|
if (s_errno == S_ECONNABORTED) {
|
||||||
ShowWarning("recv_to_fifo: Software caused connection abort on session #%d\n", fd);
|
ShowWarning("recv_to_fifo: Software caused connection abort on session #%d\n", fd);
|
||||||
FD_CLR(fd, &readfds); //Remove the socket so the select() won't hang on it.
|
FD_CLR(fd, &readfds); //Remove the socket so the select() won't hang on it.
|
||||||
}
|
}
|
||||||
if (h_errno != EAGAIN) {
|
if (s_errno != S_EWOULDBLOCK) {
|
||||||
ShowDebug("recv_to_fifo: error %d, ending connection #%d\n", h_errno, fd);
|
ShowDebug("recv_to_fifo: error %d, ending connection #%d\n", s_errno, fd);
|
||||||
set_eof(fd);
|
set_eof(fd);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -210,14 +212,14 @@ static int send_from_fifo(int fd)
|
|||||||
len = send(fd, (const char *) session[fd]->wdata, session[fd]->wdata_size, 0);
|
len = send(fd, (const char *) session[fd]->wdata, session[fd]->wdata_size, 0);
|
||||||
|
|
||||||
if (len == SOCKET_ERROR) {
|
if (len == SOCKET_ERROR) {
|
||||||
if (h_errno == ECONNABORTED) {
|
if (s_errno == S_ECONNABORTED) {
|
||||||
ShowWarning("send_from_fifo: Software caused connection abort on session #%d\n", fd);
|
ShowWarning("send_from_fifo: Software caused connection abort on session #%d\n", fd);
|
||||||
session[fd]->wdata_size = 0; //Clear the send queue as we can't send anymore. [Skotlex]
|
session[fd]->wdata_size = 0; //Clear the send queue as we can't send anymore. [Skotlex]
|
||||||
set_eof(fd);
|
set_eof(fd);
|
||||||
FD_CLR(fd, &readfds); //Remove the socket so the select() won't hang on it.
|
FD_CLR(fd, &readfds); //Remove the socket so the select() won't hang on it.
|
||||||
}
|
}
|
||||||
if (h_errno != EAGAIN) {
|
if (s_errno != S_EWOULDBLOCK) {
|
||||||
ShowDebug("send_from_fifo: error %d, ending connection #%d\n", h_errno, fd);
|
ShowDebug("send_from_fifo: error %d, ending connection #%d\n", s_errno, fd);
|
||||||
session[fd]->wdata_size = 0; //Clear the send queue as we can't send anymore. [Skotlex]
|
session[fd]->wdata_size = 0; //Clear the send queue as we can't send anymore. [Skotlex]
|
||||||
set_eof(fd);
|
set_eof(fd);
|
||||||
}
|
}
|
||||||
@ -275,7 +277,7 @@ static int connect_client(int listen_fd)
|
|||||||
|
|
||||||
fd = accept(listen_fd,(struct sockaddr*)&client_address,&len);
|
fd = accept(listen_fd,(struct sockaddr*)&client_address,&len);
|
||||||
if ( fd == INVALID_SOCKET ) {
|
if ( fd == INVALID_SOCKET ) {
|
||||||
ShowError("accept failed (code %i)!\n", h_errno);
|
ShowError("accept failed (code %i)!\n", s_errno);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -316,7 +318,7 @@ int make_listen_bind(long ip,int port)
|
|||||||
fd = (int)socket( AF_INET, SOCK_STREAM, 0 );
|
fd = (int)socket( AF_INET, SOCK_STREAM, 0 );
|
||||||
|
|
||||||
if (fd == INVALID_SOCKET) {
|
if (fd == INVALID_SOCKET) {
|
||||||
ShowError("socket() creation failed (code %d)!\n", fd, h_errno);
|
ShowError("socket() creation failed (code %d)!\n", fd, s_errno);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -329,12 +331,12 @@ int make_listen_bind(long ip,int port)
|
|||||||
|
|
||||||
result = bind(fd, (struct sockaddr*)&server_address, sizeof(server_address));
|
result = bind(fd, (struct sockaddr*)&server_address, sizeof(server_address));
|
||||||
if( result == SOCKET_ERROR ) {
|
if( result == SOCKET_ERROR ) {
|
||||||
ShowError("bind failed (socket %d, code %d)!\n", fd, h_errno);
|
ShowError("bind failed (socket %d, code %d)!\n", fd, s_errno);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
result = listen( fd, 5 );
|
result = listen( fd, 5 );
|
||||||
if( result == SOCKET_ERROR ) {
|
if( result == SOCKET_ERROR ) {
|
||||||
ShowError("listen failed (socket %d, code %d)!\n", fd, h_errno);
|
ShowError("listen failed (socket %d, code %d)!\n", fd, s_errno);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
if ( fd < 0 || fd > FD_SETSIZE )
|
if ( fd < 0 || fd > FD_SETSIZE )
|
||||||
@ -444,7 +446,7 @@ int make_connection(long ip,int port)
|
|||||||
fd = (int)socket( AF_INET, SOCK_STREAM, 0 );
|
fd = (int)socket( AF_INET, SOCK_STREAM, 0 );
|
||||||
|
|
||||||
if (fd == INVALID_SOCKET) {
|
if (fd == INVALID_SOCKET) {
|
||||||
ShowError("socket() creation failed (code %d)!\n", fd, h_errno);
|
ShowError("socket() creation failed (code %d)!\n", fd, s_errno);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -459,7 +461,7 @@ int make_connection(long ip,int port)
|
|||||||
|
|
||||||
result = connect(fd, (struct sockaddr *)(&server_address), sizeof(struct sockaddr_in));
|
result = connect(fd, (struct sockaddr *)(&server_address), sizeof(struct sockaddr_in));
|
||||||
if( result == SOCKET_ERROR ) {
|
if( result == SOCKET_ERROR ) {
|
||||||
ShowError("connect failed (socket %d, code %d)!\n", fd, h_errno);
|
ShowError("connect failed (socket %d, code %d)!\n", fd, s_errno);
|
||||||
do_close(fd);
|
do_close(fd);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -598,8 +600,7 @@ int do_sendrecv(int next)
|
|||||||
fd_set rfd,efd; //Added the Error Set so that such sockets can be made eof. They are the same as the rfd for now. [Skotlex]
|
fd_set rfd,efd; //Added the Error Set so that such sockets can be made eof. They are the same as the rfd for now. [Skotlex]
|
||||||
struct sockaddr_in addr_check;
|
struct sockaddr_in addr_check;
|
||||||
struct timeval timeout;
|
struct timeval timeout;
|
||||||
int ret,i;
|
int ret,i,size;
|
||||||
const int size = sizeof(struct sockaddr);
|
|
||||||
|
|
||||||
last_tick = time(0);
|
last_tick = time(0);
|
||||||
|
|
||||||
@ -624,7 +625,7 @@ int do_sendrecv(int next)
|
|||||||
memcpy(&rfd, &readfds, sizeof(rfd)),
|
memcpy(&rfd, &readfds, sizeof(rfd)),
|
||||||
memcpy(&efd, &readfds, sizeof(efd)))
|
memcpy(&efd, &readfds, sizeof(efd)))
|
||||||
{
|
{
|
||||||
if(h_errno != EBADF)
|
if(s_errno != S_ENOTSOCK)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
//Well then the error is due to a bad socket. Lets find and remove it
|
//Well then the error is due to a bad socket. Lets find and remove it
|
||||||
@ -632,32 +633,22 @@ int do_sendrecv(int next)
|
|||||||
for(i = 1; i < fd_max; i++)
|
for(i = 1; i < fd_max; i++)
|
||||||
{
|
{
|
||||||
if(!session[i])
|
if(!session[i])
|
||||||
{
|
|
||||||
if (FD_ISSET(i, &readfds)) {
|
|
||||||
ShowError("Deleting non-cleared session %d\n", i);
|
|
||||||
FD_CLR(i, &readfds);
|
|
||||||
}
|
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
//check the validity of the socket. Does what the last thing did
|
//check the validity of the socket. Does what the last thing did
|
||||||
//just alot faster [Meruru]
|
//just alot faster [Meruru]
|
||||||
|
size = sizeof(struct sockaddr);
|
||||||
if(getsockname(i,(struct sockaddr*)&addr_check,&size)<0)
|
if(getsockname(i,(struct sockaddr*)&addr_check,&size)<0)
|
||||||
if(h_errno == EBADF) //See the #defines at the top
|
if(s_errno == S_ENOTSOCK)
|
||||||
{
|
{
|
||||||
ShowError("Deleting invalid session %d\n", i);
|
|
||||||
//So the code can react accordingly
|
|
||||||
session[i]->eof = 1;
|
|
||||||
if(session[i]->func_parse)
|
|
||||||
session[i]->func_parse(i);
|
|
||||||
free_session_mem(i); //free the bad session
|
free_session_mem(i); //free the bad session
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!FD_ISSET(i, &readfds))
|
|
||||||
FD_SET(i,&readfds);
|
FD_SET(i,&readfds);
|
||||||
ret = i;
|
ret = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
fd_max = ret;
|
fd_max = ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -673,10 +664,8 @@ int do_sendrecv(int next)
|
|||||||
session[rfd.fd_array[i]]->func_recv)
|
session[rfd.fd_array[i]]->func_recv)
|
||||||
session[rfd.fd_array[i]]->func_recv(rfd.fd_array[i]);
|
session[rfd.fd_array[i]]->func_recv(rfd.fd_array[i]);
|
||||||
}
|
}
|
||||||
for(i=0;i<(int)efd.fd_count;i++) {
|
for(i=0;i<(int)efd.fd_count;i++)
|
||||||
ShowDebug("do_sendrecv: Connection error on Session %d.\n", efd.fd_array[i]);
|
|
||||||
set_eof(efd.fd_array[i]);
|
set_eof(efd.fd_array[i]);
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 1; i < fd_max; i++)
|
for (i = 1; i < fd_max; i++)
|
||||||
{
|
{
|
||||||
@ -690,7 +679,7 @@ int do_sendrecv(int next)
|
|||||||
if(session[i]->wdata_size && session[i]->func_send)
|
if(session[i]->wdata_size && session[i]->func_send)
|
||||||
session[i]->func_send(i);
|
session[i]->func_send(i);
|
||||||
|
|
||||||
if(session[i]->eof) //func_send can't free a session, this is safe.
|
if(session[i] && session[i]->eof) //The session check is for when the connection ended in func_parse
|
||||||
{ //Finally, even if there is no data to parse, connections signalled eof should be closed, so we call parse_func [Skotlex]
|
{ //Finally, even if there is no data to parse, connections signalled eof should be closed, so we call parse_func [Skotlex]
|
||||||
if (session[i]->func_parse)
|
if (session[i]->func_parse)
|
||||||
session[i]->func_parse(i); //This should close the session inmediately.
|
session[i]->func_parse(i); //This should close the session inmediately.
|
||||||
@ -710,6 +699,7 @@ int do_sendrecv(int next)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if(FD_ISSET(i,&rfd)){
|
if(FD_ISSET(i,&rfd)){
|
||||||
//ShowMessage("read:%d\n",i);
|
//ShowMessage("read:%d\n",i);
|
||||||
if(session[i]->func_recv)
|
if(session[i]->func_recv)
|
||||||
@ -721,7 +711,7 @@ int do_sendrecv(int next)
|
|||||||
if(session[i]->wdata_size && session[i]->func_send)
|
if(session[i]->wdata_size && session[i]->func_send)
|
||||||
session[i]->func_send(i);
|
session[i]->func_send(i);
|
||||||
|
|
||||||
if(session[i]->eof)
|
if(session[i] && session[i]->eof) //The session check is for when the connection ended in func_parse
|
||||||
{ //Finally, even if there is no data to parse, connections signalled eof should be closed, so we call parse_func [Skotlex]
|
{ //Finally, even if there is no data to parse, connections signalled eof should be closed, so we call parse_func [Skotlex]
|
||||||
if (session[i]->func_parse)
|
if (session[i]->func_parse)
|
||||||
session[i]->func_parse(i); //This should close the session inmediately.
|
session[i]->func_parse(i); //This should close the session inmediately.
|
||||||
|
119
src/map/script.c
119
src/map/script.c
@ -78,8 +78,13 @@ static struct str_data_struct {
|
|||||||
int next;
|
int next;
|
||||||
} *str_data = NULL;
|
} *str_data = NULL;
|
||||||
int str_num=LABEL_START,str_data_size;
|
int str_num=LABEL_START,str_data_size;
|
||||||
#define SCRIPT_HASH_SIZE 1024
|
// Using a prime number for SCRIPT_HASH_SIZE should give better distributions
|
||||||
|
#define SCRIPT_HASH_SIZE 1021
|
||||||
int str_hash[SCRIPT_HASH_SIZE];
|
int str_hash[SCRIPT_HASH_SIZE];
|
||||||
|
//#define SCRIPT_HASH_DJB2
|
||||||
|
//#define SCRIPT_HASH_SDBM
|
||||||
|
//#define SCRIPT_HASH_ELF
|
||||||
|
//#define SCRIPT_HASH_PJW
|
||||||
|
|
||||||
static struct dbt *mapreg_db=NULL;
|
static struct dbt *mapreg_db=NULL;
|
||||||
static struct dbt *mapregstr_db=NULL;
|
static struct dbt *mapregstr_db=NULL;
|
||||||
@ -272,18 +277,53 @@ static void check_event(struct script_state *st, const char *event){
|
|||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*==========================================
|
/*==========================================
|
||||||
* 文字列のハッシュを計算
|
* 文字列のハッシュを計算
|
||||||
*------------------------------------------
|
*------------------------------------------
|
||||||
*/
|
*/
|
||||||
static int calc_hash(const unsigned char *p)
|
#define calc_hash(x) calc_hash2(x)%SCRIPT_HASH_SIZE
|
||||||
|
static unsigned int calc_hash2(const unsigned char *p)
|
||||||
{
|
{
|
||||||
int h=0;
|
#if defined(SCRIPT_HASH_DJB2)
|
||||||
|
unsigned int h = 5381;
|
||||||
|
while( *p ) // hash*33 + c
|
||||||
|
h = ( h << 5 ) + h + ((unsigned char)tolower(*p++));
|
||||||
|
return h;
|
||||||
|
#elif defined(SCRIPT_HASH_SDBM)
|
||||||
|
unsigned int h = 0;
|
||||||
|
while( *p )
|
||||||
|
h = ( h << 6 ) + ( h << 16 ) - h + ((unsigned char)tolower(*p++));
|
||||||
|
return h;
|
||||||
|
#elif defined(SCRIPT_HASH_ELF)
|
||||||
|
unsigned int h = 0;
|
||||||
|
unsigned int g;
|
||||||
|
while( *p ){ // UNIX ELF hash
|
||||||
|
h = ( h << 4 ) + ((unsigned char)tolower(*p++));
|
||||||
|
if ( g = h & 0xF0000000 )
|
||||||
|
h ^= g >> 24;
|
||||||
|
h &= ~g;
|
||||||
|
}
|
||||||
|
return h;
|
||||||
|
#elif defined(SCRIPT_HASH_PJW)
|
||||||
|
unsigned int h = 0;
|
||||||
|
unsigned int g;
|
||||||
|
while( *p ){
|
||||||
|
h = ( h << 4 ) + ((unsigned char)tolower(*p++));
|
||||||
|
if ( (g=h&0xF0000000) ) {
|
||||||
|
h ^= g>>24;
|
||||||
|
h ^= g;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return h;
|
||||||
|
#else
|
||||||
|
unsigned int h = 0;
|
||||||
while( *p ){
|
while( *p ){
|
||||||
h = ( h << 1 ) + ( h >> 3 ) + ( h >> 5 ) + ( h >> 8 );
|
h = ( h << 1 ) + ( h >> 3 ) + ( h >> 5 ) + ( h >> 8 );
|
||||||
h+=(unsigned char)tolower(*p++);
|
h+=(unsigned char)tolower(*p++);
|
||||||
}
|
}
|
||||||
return h&(SCRIPT_HASH_SIZE-1);
|
return h;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*==========================================
|
/*==========================================
|
||||||
@ -314,9 +354,6 @@ int add_str(const char* p)
|
|||||||
int i;
|
int i;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
if((i=search_str(p)) >= 0)
|
|
||||||
return i;
|
|
||||||
|
|
||||||
i=calc_hash(p);
|
i=calc_hash(p);
|
||||||
if(str_hash[i]==0){
|
if(str_hash[i]==0){
|
||||||
str_hash[i]=str_num;
|
str_hash[i]=str_num;
|
||||||
@ -922,7 +959,7 @@ const char* parse_curly_close(const char* p) {
|
|||||||
const char* parse_syntax(const char* p) {
|
const char* parse_syntax(const char* p) {
|
||||||
switch(*p) {
|
switch(*p) {
|
||||||
case 'b':
|
case 'b':
|
||||||
if(!strncmp(p,"break",5) && !ISALPHA(p[5])) {
|
if(!strncasecmp(p,"break",5) && !ISALPHA(p[5])) {
|
||||||
// break の処理
|
// break の処理
|
||||||
char label[256];
|
char label[256];
|
||||||
int pos = syntax.curly_count - 1;
|
int pos = syntax.curly_count - 1;
|
||||||
@ -957,7 +994,7 @@ const char* parse_syntax(const char* p) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'c':
|
case 'c':
|
||||||
if(!strncmp(p,"case",4) && !ISALPHA(p[4])) {
|
if(!strncasecmp(p,"case",4) && !ISALPHA(p[4])) {
|
||||||
// case の処理
|
// case の処理
|
||||||
if(syntax.curly_count <= 0 || syntax.curly[syntax.curly_count - 1].type != TYPE_SWITCH) {
|
if(syntax.curly_count <= 0 || syntax.curly[syntax.curly_count - 1].type != TYPE_SWITCH) {
|
||||||
disp_error_message("parse_syntax: unexpected 'case' ",p);
|
disp_error_message("parse_syntax: unexpected 'case' ",p);
|
||||||
@ -1012,7 +1049,7 @@ const char* parse_syntax(const char* p) {
|
|||||||
syntax.curly[pos].count++;
|
syntax.curly[pos].count++;
|
||||||
}
|
}
|
||||||
return p + 1;
|
return p + 1;
|
||||||
} else if(!strncmp(p,"continue",8) && !ISALPHA(p[8])) {
|
} else if(!strncasecmp(p,"continue",8) && !ISALPHA(p[8])) {
|
||||||
// continue の処理
|
// continue の処理
|
||||||
char label[256];
|
char label[256];
|
||||||
int pos = syntax.curly_count - 1;
|
int pos = syntax.curly_count - 1;
|
||||||
@ -1045,7 +1082,7 @@ const char* parse_syntax(const char* p) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'd':
|
case 'd':
|
||||||
if(!strncmp(p,"default",7) && !ISALPHA(p[7])) {
|
if(!strncasecmp(p,"default",7) && !ISALPHA(p[7])) {
|
||||||
// switch - default の処理
|
// switch - default の処理
|
||||||
if(syntax.curly_count <= 0 || syntax.curly[syntax.curly_count - 1].type != TYPE_SWITCH) {
|
if(syntax.curly_count <= 0 || syntax.curly[syntax.curly_count - 1].type != TYPE_SWITCH) {
|
||||||
disp_error_message("parse_syntax: unexpected 'default'",p);
|
disp_error_message("parse_syntax: unexpected 'default'",p);
|
||||||
@ -1085,7 +1122,7 @@ const char* parse_syntax(const char* p) {
|
|||||||
p = skip_word(p);
|
p = skip_word(p);
|
||||||
return p + 1;
|
return p + 1;
|
||||||
}
|
}
|
||||||
} else if(!strncmp(p,"do",2) && !ISALPHA(p[2])) {
|
} else if(!strncasecmp(p,"do",2) && !ISALPHA(p[2])) {
|
||||||
int l;
|
int l;
|
||||||
char label[256];
|
char label[256];
|
||||||
p=skip_word(p);
|
p=skip_word(p);
|
||||||
@ -1104,7 +1141,7 @@ const char* parse_syntax(const char* p) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'f':
|
case 'f':
|
||||||
if(!strncmp(p,"for",3) && !ISALPHA(p[3])) {
|
if(!strncasecmp(p,"for",3) && !ISALPHA(p[3])) {
|
||||||
int l;
|
int l;
|
||||||
char label[256];
|
char label[256];
|
||||||
int pos = syntax.curly_count;
|
int pos = syntax.curly_count;
|
||||||
@ -1183,7 +1220,7 @@ const char* parse_syntax(const char* p) {
|
|||||||
l=add_str(label);
|
l=add_str(label);
|
||||||
set_label(l,script_pos,p);
|
set_label(l,script_pos,p);
|
||||||
return p;
|
return p;
|
||||||
} else if(!strncmp(p,"function",8) && !ISALPHA(p[8])) {
|
} else if(!strncasecmp(p,"function",8) && !ISALPHA(p[8])) {
|
||||||
const char *func_name;
|
const char *func_name;
|
||||||
// function
|
// function
|
||||||
p=skip_word(p);
|
p=skip_word(p);
|
||||||
@ -1226,7 +1263,7 @@ const char* parse_syntax(const char* p) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'i':
|
case 'i':
|
||||||
if(!strncmp(p,"if",2) && !ISALPHA(p[2])) {
|
if(!strncasecmp(p,"if",2) && !ISALPHA(p[2])) {
|
||||||
// if() の処理
|
// if() の処理
|
||||||
char label[256];
|
char label[256];
|
||||||
p=skip_word(p);
|
p=skip_word(p);
|
||||||
@ -1250,7 +1287,7 @@ const char* parse_syntax(const char* p) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 's':
|
case 's':
|
||||||
if(!strncmp(p,"switch",6) && !ISALPHA(p[6])) {
|
if(!strncasecmp(p,"switch",6) && !ISALPHA(p[6])) {
|
||||||
// switch() の処理
|
// switch() の処理
|
||||||
char label[256];
|
char label[256];
|
||||||
p=skip_word(p);
|
p=skip_word(p);
|
||||||
@ -1277,7 +1314,7 @@ const char* parse_syntax(const char* p) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'w':
|
case 'w':
|
||||||
if(!strncmp(p,"while",5) && !ISALPHA(p[5])) {
|
if(!strncasecmp(p,"while",5) && !ISALPHA(p[5])) {
|
||||||
int l;
|
int l;
|
||||||
char label[256];
|
char label[256];
|
||||||
p=skip_word(p);
|
p=skip_word(p);
|
||||||
@ -1347,11 +1384,11 @@ const char* parse_syntax_close_sub(const char* p,int* flag) {
|
|||||||
|
|
||||||
syntax.curly[pos].count++;
|
syntax.curly[pos].count++;
|
||||||
p = skip_space(p);
|
p = skip_space(p);
|
||||||
if(!syntax.curly[pos].flag && !strncmp(p,"else",4) && !ISALPHA(p[4])) {
|
if(!syntax.curly[pos].flag && !strncasecmp(p,"else",4) && !ISALPHA(p[4])) {
|
||||||
// else or else - if
|
// else or else - if
|
||||||
p = skip_word(p);
|
p = skip_word(p);
|
||||||
p = skip_space(p);
|
p = skip_space(p);
|
||||||
if(!strncmp(p,"if",2) && !ISALPHA(p[2])) {
|
if(!strncasecmp(p,"if",2) && !ISALPHA(p[2])) {
|
||||||
// else - if
|
// else - if
|
||||||
p=skip_word(p);
|
p=skip_word(p);
|
||||||
p=skip_space(p);
|
p=skip_space(p);
|
||||||
@ -1402,7 +1439,7 @@ const char* parse_syntax_close_sub(const char* p,int* flag) {
|
|||||||
// 条件が偽なら終了地点に飛ばす
|
// 条件が偽なら終了地点に飛ばす
|
||||||
p = skip_space(p);
|
p = skip_space(p);
|
||||||
p2 = skip_word(p);
|
p2 = skip_word(p);
|
||||||
if(p2 - p != 5 || strncmp("while",p,5)) {
|
if(p2 - p != 5 || strncasecmp("while",p,5)) {
|
||||||
disp_error_message("parse_syntax: need 'while'",p);
|
disp_error_message("parse_syntax: need 'while'",p);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1662,7 +1699,7 @@ struct script_code* parse_script(const char *src,const char *file,int line,int o
|
|||||||
p=skip_space(p);
|
p=skip_space(p);
|
||||||
// labelだけ特殊処理
|
// labelだけ特殊処理
|
||||||
tmpp=skip_space(skip_word(p));
|
tmpp=skip_space(skip_word(p));
|
||||||
if(*tmpp==':' && !(!strncmp(p,"default:",8) && p + 7 == tmpp)){
|
if(*tmpp==':' && !(!strncasecmp(p,"default:",8) && p + 7 == tmpp)){
|
||||||
i=add_word(p);
|
i=add_word(p);
|
||||||
set_label(i,script_pos,p);
|
set_label(i,script_pos,p);
|
||||||
if( parse_options&SCRIPT_USE_LABEL_DB )
|
if( parse_options&SCRIPT_USE_LABEL_DB )
|
||||||
@ -3266,24 +3303,25 @@ int do_final_script()
|
|||||||
FILE *fp = fopen("hash_dump.txt","wt");
|
FILE *fp = fopen("hash_dump.txt","wt");
|
||||||
if(fp) {
|
if(fp) {
|
||||||
int i,count[SCRIPT_HASH_SIZE];
|
int i,count[SCRIPT_HASH_SIZE];
|
||||||
int min=0x7fffffff,max=0,zero=0;
|
int count2[SCRIPT_HASH_SIZE]; // number of buckets with a certain number of items
|
||||||
|
int n=0;
|
||||||
|
int min=INT_MAX,max=0,zero=0;
|
||||||
|
double mean=0.0f;
|
||||||
|
double median=0.0f;
|
||||||
|
|
||||||
ShowNotice("Dumping script str hash information to hash_dump.txt\n");
|
ShowNotice("Dumping script str hash information to hash_dump.txt\n");
|
||||||
memset(count, 0, sizeof(count));
|
memset(count, 0, sizeof(count));
|
||||||
fprintf(fp,"num : calced_val -> hash : data_name\n");
|
fprintf(fp,"num : calced_val -> hash : data_name\n");
|
||||||
fprintf(fp,"---------------------------------------------------------------\n");
|
fprintf(fp,"---------------------------------------------------------------\n");
|
||||||
for(i=LABEL_START; i<str_num; i++) {
|
for(i=LABEL_START; i<str_num; i++) {
|
||||||
int h=0;
|
unsigned int h2=calc_hash2(str_buf+str_data[i].str);
|
||||||
char *p = str_buf+str_data[i].str;
|
unsigned int h =h2%SCRIPT_HASH_SIZE;
|
||||||
while(*p){
|
fprintf(fp,"%04d: %10u -> %3u : %s\n",i,h2,h,str_buf+str_data[i].str);
|
||||||
h=(h<<1)+(h>>3)+(h>>5)+(h>>8);
|
++count[h];
|
||||||
h+=(unsigned char)tolower(*p++);
|
|
||||||
}
|
|
||||||
fprintf(fp,"%04d: %10d -> %3d : %s\n",i,h,h&(SCRIPT_HASH_SIZE-1),str_buf+str_data[i].str);
|
|
||||||
count[h&(SCRIPT_HASH_SIZE-1)]++;
|
|
||||||
}
|
}
|
||||||
fprintf(fp,"--------------------\n\n");
|
fprintf(fp,"--------------------\n\n");
|
||||||
for(i=0; i<sizeof(count)/sizeof(count[0]); i++) {
|
memset(count2, 0, sizeof(count2));
|
||||||
|
for(i=0; i<SCRIPT_HASH_SIZE; i++) {
|
||||||
fprintf(fp," hash %3d = %d\n",i,count[i]);
|
fprintf(fp," hash %3d = %d\n",i,count[i]);
|
||||||
if(min > count[i])
|
if(min > count[i])
|
||||||
min = count[i]; // minimun count of collision
|
min = count[i]; // minimun count of collision
|
||||||
@ -3291,8 +3329,25 @@ int do_final_script()
|
|||||||
max = count[i]; // maximun count of collision
|
max = count[i]; // maximun count of collision
|
||||||
if(count[i] == 0)
|
if(count[i] == 0)
|
||||||
zero++;
|
zero++;
|
||||||
|
++count2[count[i]];
|
||||||
}
|
}
|
||||||
fprintf(fp,"--------------------\n min = %d, max = %d, zero = %d\n",min,max,zero);
|
fprintf(fp,"\n--------------------\n items : buckets\n--------------------\n");
|
||||||
|
for( i=min; i <= max; ++i ){
|
||||||
|
fprintf(fp," %5d : %7d\n",i,count2[i]);
|
||||||
|
mean += 1.0f*i*count2[i]/SCRIPT_HASH_SIZE; // Note: this will always result in <nr labels>/<nr buckets>
|
||||||
|
}
|
||||||
|
for( i=min; i <= max; ++i ){
|
||||||
|
n += count2[i];
|
||||||
|
if( n*2 >= SCRIPT_HASH_SIZE )
|
||||||
|
{
|
||||||
|
if( SCRIPT_HASH_SIZE%2 == 0 && SCRIPT_HASH_SIZE/2 == n )
|
||||||
|
median = (i+i+1)/2.0f;
|
||||||
|
else
|
||||||
|
median = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fprintf(fp,"--------------------\n min = %d, max = %d, zero = %d\n mean = %lf, median = %lf\n",min,max,zero,mean,median);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
<VisualStudioProject
|
<VisualStudioProject
|
||||||
ProjectType="Visual C++"
|
ProjectType="Visual C++"
|
||||||
Version="8.00"
|
Version="8,00"
|
||||||
Name="char-server_txt"
|
Name="char-server_txt"
|
||||||
ProjectGUID="{D356871D-58E1-450B-967A-E3E9646175AF}"
|
ProjectGUID="{D356871D-58E1-450B-967A-E3E9646175AF}"
|
||||||
RootNamespace="char-server_txt"
|
RootNamespace="char-server_txt"
|
||||||
@ -221,6 +221,10 @@
|
|||||||
RelativePath="..\src\char\int_guild.c"
|
RelativePath="..\src\char\int_guild.c"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\src\char\int_homun.c"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\char\int_party.c"
|
RelativePath="..\src\char\int_party.c"
|
||||||
>
|
>
|
||||||
@ -229,10 +233,6 @@
|
|||||||
RelativePath="..\src\char\int_pet.c"
|
RelativePath="..\src\char\int_pet.c"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath="..\src\char\int_homun.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\char\int_status.c"
|
RelativePath="..\src\char\int_status.c"
|
||||||
>
|
>
|
||||||
@ -300,81 +300,102 @@
|
|||||||
</Filter>
|
</Filter>
|
||||||
<Filter
|
<Filter
|
||||||
Name="Header Files"
|
Name="Header Files"
|
||||||
Filter="">
|
>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\char\char.h">
|
RelativePath="..\src\char\char.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\core.h">
|
RelativePath="..\src\common\core.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\db.h">
|
RelativePath="..\src\common\db.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\graph.h">
|
RelativePath="..\src\common\graph.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\grfio.h">
|
RelativePath="..\src\common\grfio.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\char\int_guild.h">
|
RelativePath="..\src\char\int_guild.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\char\int_homun.c">
|
RelativePath="..\src\char\int_party.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\char\int_party.h">
|
RelativePath="..\src\char\int_pet.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\char\int_pet.h">
|
RelativePath="..\src\char\int_status.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\char\int_status.h">
|
RelativePath="..\src\char\int_storage.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\char\int_storage.h">
|
RelativePath="..\src\char\inter.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\char\inter.h">
|
RelativePath="..\src\common\lock.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\lock.h">
|
RelativePath="..\src\common\malloc.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\malloc.h">
|
RelativePath="..\src\common\mapindex.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\mapindex.h">
|
RelativePath="..\src\common\mmo.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\mmo.h">
|
RelativePath="..\src\common\nullpo.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\nullpo.h">
|
RelativePath="..\src\common\plugin.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\plugin.h">
|
RelativePath="..\src\common\plugins.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\plugins.h">
|
RelativePath="..\src\common\showmsg.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\showmsg.h">
|
RelativePath="..\src\common\socket.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\socket.h">
|
RelativePath="..\src\common\strlib.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\strlib.h">
|
RelativePath="..\src\common\timer.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\timer.h">
|
RelativePath="..\src\common\utils.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\utils.h">
|
RelativePath="..\src\common\version.h"
|
||||||
</File>
|
>
|
||||||
<File
|
|
||||||
RelativePath="..\src\common\version.h">
|
|
||||||
</File>
|
</File>
|
||||||
</Filter>
|
</Filter>
|
||||||
</Files>
|
</Files>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
<VisualStudioProject
|
<VisualStudioProject
|
||||||
ProjectType="Visual C++"
|
ProjectType="Visual C++"
|
||||||
Version="8.00"
|
Version="8,00"
|
||||||
Name="map-server_txt"
|
Name="map-server_txt"
|
||||||
ProjectGUID="{D356871D-58E1-450B-967A-E1E9646175AF}"
|
ProjectGUID="{D356871D-58E1-450B-967A-E1E9646175AF}"
|
||||||
RootNamespace="map-server_txt"
|
RootNamespace="map-server_txt"
|
||||||
@ -392,153 +392,202 @@
|
|||||||
</Filter>
|
</Filter>
|
||||||
<Filter
|
<Filter
|
||||||
Name="Header Files"
|
Name="Header Files"
|
||||||
Filter="">
|
>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\map\atcommand.h">
|
RelativePath="..\src\map\atcommand.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\map\battle.h">
|
RelativePath="..\src\map\battle.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\cbasetypes.h">
|
RelativePath="..\src\common\cbasetypes.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\map\charcommand.h">
|
RelativePath="..\src\map\charcommand.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\map\charsave.h">
|
RelativePath="..\src\map\charsave.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\map\chat.h">
|
RelativePath="..\src\map\chat.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\map\chrif.h">
|
RelativePath="..\src\map\chrif.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\map\clif.h">
|
RelativePath="..\src\map\clif.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\core.h">
|
RelativePath="..\src\common\core.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\map\date.h">
|
RelativePath="..\src\map\date.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\db.h">
|
RelativePath="..\src\common\db.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\ers.h">
|
RelativePath="..\src\common\ers.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\graph.h">
|
RelativePath="..\src\common\graph.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\grfio.h">
|
RelativePath="..\src\common\grfio.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\map\guild.h">
|
RelativePath="..\src\map\guild.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\map\intif.h">
|
RelativePath="..\src\map\intif.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\map\irc.h">
|
RelativePath="..\src\map\irc.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\map\itemdb.h">
|
RelativePath="..\src\map\itemdb.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\limits.h">
|
RelativePath="..\src\common\limits.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\lock.h">
|
RelativePath="..\src\common\lock.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\map\log.h">
|
RelativePath="..\src\map\log.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\map\mail.h">
|
RelativePath="..\src\map\mail.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\malloc.h">
|
RelativePath="..\src\common\malloc.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\map\map.h">
|
RelativePath="..\src\map\map.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\mapindex.h">
|
RelativePath="..\src\common\mapindex.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\map\mercenary.h">
|
RelativePath="..\src\map\mercenary.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\mmo.h">
|
RelativePath="..\src\common\mmo.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\map\mob.h">
|
RelativePath="..\src\map\mob.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\map\npc.h">
|
RelativePath="..\src\map\npc.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\nullpo.h">
|
RelativePath="..\src\common\nullpo.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\map\party.h">
|
RelativePath="..\src\map\party.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\map\pc.h">
|
RelativePath="..\src\map\pc.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\map\pcre.h">
|
RelativePath="..\src\map\pcre.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\map\pet.h">
|
RelativePath="..\src\map\pet.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\plugin.h">
|
RelativePath="..\src\common\plugin.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\plugins.h">
|
RelativePath="..\src\common\plugins.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\map\script.h">
|
RelativePath="..\src\map\script.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\showmsg.h">
|
RelativePath="..\src\common\showmsg.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\map\skill.h">
|
RelativePath="..\src\map\skill.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\socket.h">
|
RelativePath="..\src\common\socket.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\map\status.h">
|
RelativePath="..\src\map\status.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\map\storage.h">
|
RelativePath="..\src\map\storage.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\strlib.h">
|
RelativePath="..\src\common\strlib.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\timer.h">
|
RelativePath="..\src\common\timer.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\map\trade.h">
|
RelativePath="..\src\map\trade.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\map\unit.h">
|
RelativePath="..\src\map\unit.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\utils.h">
|
RelativePath="..\src\common\utils.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\map\vending.h">
|
RelativePath="..\src\map\vending.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\src\common\version.h">
|
RelativePath="..\src\common\version.h"
|
||||||
|
>
|
||||||
</File>
|
</File>
|
||||||
</Filter>
|
</Filter>
|
||||||
</Files>
|
</Files>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user