Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Crash DB po starcie


Rekomendowane odpowiedzi

Opublikowano

Cześć. Mam pewien plik DB, który nie bardzo chce wstać, tj. wstaje i pracuje tylko za 1 razem po uruchomieniu systemu, kolejne próby odpalenia procesu (po uprzednim zabiciu pierwszego) generują mi SIGSEGV (11) w funkcji strtoul_l(). Zabawne jest to, że gdy próbuję odpalić to DB na innej maszynie (skonfigurowanej jakoś w 2015) to działa bez problemu i odpala się kilka razy pod rząd, natomiast na maszynie którą przygotowałem sobie wczoraj ten plik działać nie chce i rzuca tym cholernym strtoul_l().

 

DB Syserr:

 

 

SYSERR: Mar 27 21:53:04.673291 :: pid_init: 
Start of pid: 939
 
SYSERR: Mar 27 21:53:04.673350 :: Start: TABLE_POSTFIX not configured use default

 

 

 

DB Syslog

 

 

SYSERR: Mar 27 21:53:04.673291 :: pid_init: 
Start of pid: 939

Mar 27 21:53:04.673330 :: CONFIG: DISABLE_HOTBACKUP
SYSERR: Mar 27 21:53:04.673350 :: Start: TABLE_POSTFIX not configured use default
Mar 27 21:53:04.673375 :: connecting to MySQL server (player)
Mar 27 21:53:04.673387 :: CREATING DIRECT_SQL
Mar 27 21:53:04.673409 :: AsyncSQL: locale euckr
Mar 27 21:53:04.677793 :: CREATING MAIN_SQL
Mar 27 21:53:04.677830 :: AsyncSQL: locale euckr
Mar 27 21:53:04.677879 :: CREATING ASYNC_SQL
Mar 27 21:53:04.677913 :: AsyncSQL: locale euckr
Mar 27 21:53:04.677940 ::    OK
Mar 27 21:53:04.677969 :: connecting to MySQL server (account)
Mar 27 21:53:04.677981 :: CREATING DIRECT_SQL
Mar 27 21:53:04.677997 :: AsyncSQL: locale euckr
Mar 27 21:53:04.678254 :: CREATING MAIN_SQL
Mar 27 21:53:04.678279 :: AsyncSQL: locale euckr
Mar 27 21:53:04.678310 :: CREATING ASYNC_SQL
Mar 27 21:53:04.678333 :: AsyncSQL: locale euckr
Mar 27 21:53:04.678363 ::    OK
Mar 27 21:53:04.678388 :: connecting to MySQL server (common)
Mar 27 21:53:04.678401 :: CREATING DIRECT_SQL
Mar 27 21:53:04.678416 :: AsyncSQL: locale euckr
Mar 27 21:53:04.678655 :: CREATING MAIN_SQL
Mar 27 21:53:04.678679 :: AsyncSQL: locale euckr
Mar 27 21:53:04.678708 :: CREATING ASYNC_SQL
Mar 27 21:53:04.678730 :: AsyncSQL: locale euckr
Mar 27 21:53:04.678756 ::    OK
Mar 27 21:53:04.678780 :: connecting to MySQL server (hotbackup)
Mar 27 21:53:04.678792 :: CREATING DIRECT_SQL
Mar 27 21:53:04.678807 :: AsyncSQL: locale euckr
Mar 27 21:53:04.679039 :: CREATING MAIN_SQL
Mar 27 21:53:04.679063 :: AsyncSQL: locale euckr
Mar 27 21:53:04.679093 :: CREATING ASYNC_SQL
Mar 27 21:53:04.679117 :: AsyncSQL: locale euckr
Mar 27 21:53:04.679142 ::    OK
Mar 27 21:53:04.679199 :: ClientManager initialization.. 
Mar 27 21:53:04.679477 :: InitializeLocalization() - LoadLocaleTable(count:13)
Mar 27 21:53:04.679500 :: locale[LOCALE] = poland
Mar 27 21:53:04.679512 :: Changed g_stLocale euckr to euckr
Mar 27 21:53:04.679525 :: SetLocale start 

 

 

 

GDB:

DSvddV6.png

 

Oto, co próbowałem robić:

1. Rekompilacja DB. Brak efektu

2. Na maszynie konfigurowanej jakoś w 2015 roku DB działa aż miło. Na konfigurowanej wczoraj - nie. Stara maszyna jest fizycznym urządzeniem, wczorajsza - wirtualnym.

3. Używam statycznego linkowania podczas kompilacji (-static)

4. Na 99% nie jest to problem powiązany z source, gdyż próbowałem trzech różnych db: czystej mainline, DB1 (zmodyfikowany mainline) oraz DB2 (zmodyfikowany DB1) i żadna nie chciała działać na wczorajszej maszynie, natomiast działały na starej.

 

 

Czy ktoś mógłby mi powiedzieć co się do ciężkiej cholery dzieje?

57199140501148694665.png

Opublikowano

 

 

Masz wartosci NULL w pewnym mobie w mob_proto 

Zobacz jak ja to ogarnalem tutaj

http://www.mpcforum.pl/topic/1492223-c-funkcje-do-%C5%82adowania-item-protomob-proto-z-sql/#entry12638009

Co prawda nie czytam proto z bazy, tylko z pliku, ale zaimplementowałem Twój algorytm u siebie i dalej nie działa. @alchemik1

 

w gdb masz dobre liby? Bo je laduje z /usr/lib32 i dlatego tez czasem moze nie pokazywac pelnego debugowania, sprobuj tez wgrac inne liby do systemu bo mozliwe ze sa zle i jesli wgrales moj kod to teraz powinno rzucac z atoi() nie z strtoul

ban.gif

 

Opublikowano

 

 

 

Masz wartosci NULL w pewnym mobie w mob_proto 

Zobacz jak ja to ogarnalem tutaj

http://www.mpcforum.pl/topic/1492223-c-funkcje-do-%C5%82adowania-item-protomob-proto-z-sql/#entry12638009

Co prawda nie czytam proto z bazy, tylko z pliku, ale zaimplementowałem Twój algorytm u siebie i dalej nie działa. @alchemik1

 

w gdb masz dobre liby? Bo je laduje z /usr/lib32 i dlatego tez czasem moze nie pokazywac pelnego debugowania, sprobuj tez wgrac inne liby do systemu bo mozliwe ze sa zle i jesli wgrales moj kod to teraz powinno rzucac z atoi() nie z strtoul

 

Nie rozumiem o co pytasz z tymi libami, posiadam wersję i386, ale na wszelki wypadek zassałem liby stąd i wkleiłem je do /usr/lib32. Nic się nie zmieniło, db dalej leży, gdb pokazuje to samo.

57199140501148694665.png

Opublikowano

 

 

 

 

Masz wartosci NULL w pewnym mobie w mob_proto 

Zobacz jak ja to ogarnalem tutaj

http://www.mpcforum.pl/topic/1492223-c-funkcje-do-%C5%82adowania-item-protomob-proto-z-sql/#entry12638009

Co prawda nie czytam proto z bazy, tylko z pliku, ale zaimplementowałem Twój algorytm u siebie i dalej nie działa. @alchemik1

 

w gdb masz dobre liby? Bo je laduje z /usr/lib32 i dlatego tez czasem moze nie pokazywac pelnego debugowania, sprobuj tez wgrac inne liby do systemu bo mozliwe ze sa zle i jesli wgrales moj kod to teraz powinno rzucac z atoi() nie z strtoul

 

Nie rozumiem o co pytasz z tymi libami, posiadam wersję i386, ale na wszelki wypadek zassałem liby stąd i wkleiłem je do /usr/lib32. Nic się nie zmieniło, db dalej leży, gdb pokazuje to samo.

 

Wlasnie oto mi chodzilo co zrobiles z libami  :D Ok, pokaz mi swoj makefile z DB i jakie masz bsd na vps gdzie probujesz uruchomic db a jaki bsd na tym co kompilujesz?

ban.gif

 

Opublikowano

Wlasnie oto mi chodzilo co zrobiles z libami  :D Ok, pokaz mi swoj makefile z DB i jakie masz bsd na vps gdzie probujesz uruchomic db a jaki bsd na tym co kompilujesz?

 

@alchemik1

Makefile:

 

 

MAKE = gmake
CC = g++

INCDIR =
LIBDIR =
BINDIR = ..
OBJDIR = .obj

GCC_VERSION = $(shell $(CC) --version 2>&1 | grep "(GCC)" | cut -d' ' -f3  | cut -d'.' -f1)
BSD_VERSION = $(shell uname -v 2>&1 | cut -d' ' -f2 | cut -d'.' -f1)
$(shell if [ ! -d $(OBJDIR) ]; then mkdir $(OBJDIR); fi)

TARGET = $(BINDIR)/db

CFLAGS = -g -Wall -O2 -pipe -fno-rtti -fno-exceptions -pthread -D_THREAD_SAFE -static

ifeq ($(GCC_VERSION), 4)
CFLAGS += -mtune=i686
else
CFLAGS += -mcpu=i686
endif

# boost
INCDIR += -I../../boost

LIBDIR += -L../../libthecore/lib -L../../libsql -L../../libpoly -L../../libgame/lib

INCDIR += -I../../libmysql/7.x-5.1.35
LIBDIR += -L../../libmysql/7.x-5.1.35

LIBS = -lthecore -lmysqlclient -lsql -lpoly -lgame -lm -lz

SRCS =	Config.cpp NetBase.cpp Peer.cpp PeerBase.cpp Main.cpp Lock.cpp DBManager.cpp \
		Cache.cpp LoginData.cpp ClientManager.cpp ClientManagerPlayer.cpp ClientManagerLogin.cpp \
		ClientManagerBoot.cpp ClientManagerParty.cpp ClientManagerGuild.cpp GuildManager.cpp HB.cpp \
		PrivManager.cpp MoneyLog.cpp ItemAwardManager.cpp ClientManagerEventFlag.cpp Marriage.cpp \
		Monarch.cpp BlockCountry.cpp ItemIDRangeManager.cpp ClientManagerHorseName.cpp version.cpp \
		AuctionManager.cpp ProtoReader.cpp CsvReader.cpp 

OBJS = $(SRCS:%.cpp=$(OBJDIR)/%.o)

default: $(TARGET)

$(TARGET): $(OBJS)
	@echo linking ...
	@$(CC) $(CFLAGS) $(LIBDIR) $(OBJS) $(LIBS) -o $(TARGET)
	@ version.cpp

$(OBJDIR)/%.o: %.cpp
	@echo compile $<
	@$(CC) $(CFLAGS) $(INCDIR) -c $< -o $@

$(OBJDIR)/version.o: version.cpp
	@$(CC) $(CFLAGS) -D__USER__=\"$(USER)\" -D__HOSTNAME__=\"$(HOSTNAME)\" -D__PWD__=\"$(PWD)\" -c $< -o $@
	@echo compile $<

$(OBJDIR):
	@ $(OBJDIR)

clean:
	@rm -f $(OBJS) $(BINDIR)/db_r*

dep:
	@ Depend
	makedepend -fDepend $(INCDIR) -I/usr/include/c++/3.3 -I/usr/include/c++/4.2 -p$(OBJDIR)/ $(SRCS) 2> /dev/null

sinclude Depend

 

 

 

Co do wersji bsd to teraz próbuję skompilować na tej samej maszynie co uruchamiam:

root:~ # uname -a
FreeBSD Averis.local 9.3-RELEASE FreeBSD 9.3-RELEASE #0 r268512: Fri Jul 11 03:13:02 UTC 2014 /usr/obj/usr/src/sys/GENERIC  i386

//edit: po wprowadzeniu Twojego kodu zmieniłem jedynie unique_ptr na auto_ptr, bo się pruło g++ że nie ma czegoś takiego jak -std=c++11 ani -std=gnu++11

57199140501148694665.png

Opublikowano

 

Wlasnie oto mi chodzilo co zrobiles z libami  :D Ok, pokaz mi swoj makefile z DB i jakie masz bsd na vps gdzie probujesz uruchomic db a jaki bsd na tym co kompilujesz?

 

@alchemik1

Makefile:

 

 

MAKE = gmake
CC = g++

INCDIR =
LIBDIR =
BINDIR = ..
OBJDIR = .obj

GCC_VERSION = $(shell $(CC) --version 2>&1 | grep "(GCC)" | cut -d' ' -f3  | cut -d'.' -f1)
BSD_VERSION = $(shell uname -v 2>&1 | cut -d' ' -f2 | cut -d'.' -f1)
$(shell if [ ! -d $(OBJDIR) ]; then mkdir $(OBJDIR); fi)

TARGET = $(BINDIR)/db

CFLAGS = -g -Wall -O2 -pipe -fno-rtti -fno-exceptions -pthread -D_THREAD_SAFE -static

ifeq ($(GCC_VERSION), 4)
CFLAGS += -mtune=i686
else
CFLAGS += -mcpu=i686
endif

# boost
INCDIR += -I../../boost

LIBDIR += -L../../libthecore/lib -L../../libsql -L../../libpoly -L../../libgame/lib

INCDIR += -I../../libmysql/7.x-5.1.35
LIBDIR += -L../../libmysql/7.x-5.1.35

LIBS = -lthecore -lmysqlclient -lsql -lpoly -lgame -lm -lz

SRCS =	Config.cpp NetBase.cpp Peer.cpp PeerBase.cpp Main.cpp Lock.cpp DBManager.cpp \
		Cache.cpp LoginData.cpp ClientManager.cpp ClientManagerPlayer.cpp ClientManagerLogin.cpp \
		ClientManagerBoot.cpp ClientManagerParty.cpp ClientManagerGuild.cpp GuildManager.cpp HB.cpp \
		PrivManager.cpp MoneyLog.cpp ItemAwardManager.cpp ClientManagerEventFlag.cpp Marriage.cpp \
		Monarch.cpp BlockCountry.cpp ItemIDRangeManager.cpp ClientManagerHorseName.cpp version.cpp \
		AuctionManager.cpp ProtoReader.cpp CsvReader.cpp 

OBJS = $(SRCS:%.cpp=$(OBJDIR)/%.o)

default: $(TARGET)

$(TARGET): $(OBJS)
	@echo linking ...
	@$(CC) $(CFLAGS) $(LIBDIR) $(OBJS) $(LIBS) -o $(TARGET)
	@ version.cpp

$(OBJDIR)/%.o: %.cpp
	@echo compile $<
	@$(CC) $(CFLAGS) $(INCDIR) -c $< -o $@

$(OBJDIR)/version.o: version.cpp
	@$(CC) $(CFLAGS) -D__USER__=\"$(USER)\" -D__HOSTNAME__=\"$(HOSTNAME)\" -D__PWD__=\"$(PWD)\" -c $< -o $@
	@echo compile $<

$(OBJDIR):
	@ $(OBJDIR)

clean:
	@rm -f $(OBJS) $(BINDIR)/db_r*

dep:
	@ Depend
	makedepend -fDepend $(INCDIR) -I/usr/include/c++/3.3 -I/usr/include/c++/4.2 -p$(OBJDIR)/ $(SRCS) 2> /dev/null

sinclude Depend

 

 

 

Co do wersji bsd to teraz próbuję skompilować na tej samej maszynie co uruchamiam:

root:~ # uname -a
FreeBSD Averis.local 9.3-RELEASE FreeBSD 9.3-RELEASE #0 r268512: Fri Jul 11 03:13:02 UTC 2014 /usr/obj/usr/src/sys/GENERIC  i386

//edit: po wprowadzeniu Twojego kodu zmieniłem jedynie unique_ptr na auto_ptr, bo się pruło g++ że nie ma czegoś takiego jak -std=c++11 ani -std=gnu++11

 

Aj wiem juz. w protoreader.cpp zmien strtol() na atoi() bo to jednak lubilo crashowac sie

ban.gif

 

Opublikowano

 

 

Wlasnie oto mi chodzilo co zrobiles z libami  :D Ok, pokaz mi swoj makefile z DB i jakie masz bsd na vps gdzie probujesz uruchomic db a jaki bsd na tym co kompilujesz?

 

@alchemik1

Makefile:

 

 

MAKE = gmake
CC = g++

INCDIR =
LIBDIR =
BINDIR = ..
OBJDIR = .obj

GCC_VERSION = $(shell $(CC) --version 2>&1 | grep "(GCC)" | cut -d' ' -f3  | cut -d'.' -f1)
BSD_VERSION = $(shell uname -v 2>&1 | cut -d' ' -f2 | cut -d'.' -f1)
$(shell if [ ! -d $(OBJDIR) ]; then mkdir $(OBJDIR); fi)

TARGET = $(BINDIR)/db

CFLAGS = -g -Wall -O2 -pipe -fno-rtti -fno-exceptions -pthread -D_THREAD_SAFE -static

ifeq ($(GCC_VERSION), 4)
CFLAGS += -mtune=i686
else
CFLAGS += -mcpu=i686
endif

# boost
INCDIR += -I../../boost

LIBDIR += -L../../libthecore/lib -L../../libsql -L../../libpoly -L../../libgame/lib

INCDIR += -I../../libmysql/7.x-5.1.35
LIBDIR += -L../../libmysql/7.x-5.1.35

LIBS = -lthecore -lmysqlclient -lsql -lpoly -lgame -lm -lz

SRCS =	Config.cpp NetBase.cpp Peer.cpp PeerBase.cpp Main.cpp Lock.cpp DBManager.cpp \
		Cache.cpp LoginData.cpp ClientManager.cpp ClientManagerPlayer.cpp ClientManagerLogin.cpp \
		ClientManagerBoot.cpp ClientManagerParty.cpp ClientManagerGuild.cpp GuildManager.cpp HB.cpp \
		PrivManager.cpp MoneyLog.cpp ItemAwardManager.cpp ClientManagerEventFlag.cpp Marriage.cpp \
		Monarch.cpp BlockCountry.cpp ItemIDRangeManager.cpp ClientManagerHorseName.cpp version.cpp \
		AuctionManager.cpp ProtoReader.cpp CsvReader.cpp 

OBJS = $(SRCS:%.cpp=$(OBJDIR)/%.o)

default: $(TARGET)

$(TARGET): $(OBJS)
	@echo linking ...
	@$(CC) $(CFLAGS) $(LIBDIR) $(OBJS) $(LIBS) -o $(TARGET)
	@ version.cpp

$(OBJDIR)/%.o: %.cpp
	@echo compile $<
	@$(CC) $(CFLAGS) $(INCDIR) -c $< -o $@

$(OBJDIR)/version.o: version.cpp
	@$(CC) $(CFLAGS) -D__USER__=\"$(USER)\" -D__HOSTNAME__=\"$(HOSTNAME)\" -D__PWD__=\"$(PWD)\" -c $< -o $@
	@echo compile $<

$(OBJDIR):
	@ $(OBJDIR)

clean:
	@rm -f $(OBJS) $(BINDIR)/db_r*

dep:
	@ Depend
	makedepend -fDepend $(INCDIR) -I/usr/include/c++/3.3 -I/usr/include/c++/4.2 -p$(OBJDIR)/ $(SRCS) 2> /dev/null

sinclude Depend

 

 

 

Co do wersji bsd to teraz próbuję skompilować na tej samej maszynie co uruchamiam:

root:~ # uname -a
FreeBSD Averis.local 9.3-RELEASE FreeBSD 9.3-RELEASE #0 r268512: Fri Jul 11 03:13:02 UTC 2014 /usr/obj/usr/src/sys/GENERIC  i386

//edit: po wprowadzeniu Twojego kodu zmieniłem jedynie unique_ptr na auto_ptr, bo się pruło g++ że nie ma czegoś takiego jak -std=c++11 ani -std=gnu++11

 

Aj wiem juz. w protoreader.cpp zmien strtol() na atoi() bo to jednak lubilo crashowac sie

 

Nie było tam strtol :(

57199140501148694665.png

Opublikowano

 

Pokaz swoje ProtoReader.cpp bo normalnie masz 

strtol(string_from_row(row[col], length[col]).c_str(), NULL, 10)

 

 

#include "stdafx.h"
 
#include <math.h>
#include "ProtoReader.h"
 
#include "CsvReader.h"
 
#include <sstream>
 
using namespace std;
 
inline string trim_left(const string& str)
{
    string::size_type n = str.find_first_not_of(" \t\v\n\r");
    return n == string::npos ? str : str.substr(n, str.length());
}
 
inline string trim_right(const string& str)
{
    string::size_type n = str.find_last_not_of(" \t\v\n\r");
    return n == string::npos ? str : str.substr(0, n + 1);
}
 
string trim(const string& str){return trim_left(trim_right(str));}
 
static string* StringSplit(string strOrigin, string strTok)
{
    int     cutAt;                            //ŔÚ¸Ł´ÂŔ§Äˇ
    int     index     = 0;                    //ą®ŔÚż­Ŕε¦˝ş
    string* strResult = new string[30];   //°á°úreturn ÇŇşŻĽö
 
    //strTokŔ»ĂŁŔ»¶§±îÁöąÝşą
    while ((cutAt = strOrigin.find_first_of(strTok)) != strOrigin.npos)
    {
       if (cutAt > 0)  //ŔÚ¸Ł´ÂŔ§Äˇ°ˇ0ş¸´ŮĹ©¸é(Ľş°ř˝Ă)
       {
            strResult[index++] = strOrigin.substr(0, cutAt);  //°á°úąčż­żˇĂß°ˇ
       }
       strOrigin = strOrigin.substr(cutAt+1);  //żřş»ŔşŔÚ¸ĄşÎşĐÁ¦żÜÇŃłŞ¸ÓÁö
    }
 
    if(strOrigin.length() > 0)  //żřş»ŔĚľĆÁ÷ł˛ľŇŔ¸¸é
    {
        strResult[index++] = strOrigin.substr(0, cutAt);  //łŞ¸ÓÁö¸¦°á°úąčż­żˇĂß°ˇ
    }
 
for( int i=0;i<index;i++)
{
strResult[i] = trim(strResult[i]);
}
 
    return strResult;  //°á°úreturn
}
 
 
 
int get_Item_Type_Value(string inputString)
{
string arType[] = {"ITEM_NONE", "ITEM_WEAPON",
"ITEM_ARMOR", "ITEM_USE", 
"ITEM_AUTOUSE", "ITEM_MATERIAL",
"ITEM_SPECIAL", "ITEM_TOOL", 
"ITEM_LOTTERY", "ITEM_ELK", //10°ł
 
"ITEM_METIN", "ITEM_CONTAINER", 
"ITEM_FISH", "ITEM_ROD", 
"ITEM_RESOURCE", "ITEM_CAMPFIRE",
"ITEM_UNIQUE", "ITEM_SKILLBOOK", 
"ITEM_QUEST", "ITEM_POLYMORPH", //20°ł
 
"ITEM_TREASURE_BOX", "ITEM_TREASURE_KEY",
"ITEM_SKILLFORGET", "ITEM_GIFTBOX", 
"ITEM_PICK", "ITEM_HAIR", 
"ITEM_TOTEM", "ITEM_BLEND", 
"ITEM_COSTUME", "ITEM_DS", //30°ł
 
"ITEM_SPECIAL_DS", "ITEM_EXTRACT",
"ITEM_SECONDARY_COIN", //33°ł
 
"ITEM_RING",
"ITEM_BELT", //35°ł (EItemTypes °ŞŔ¸·Î ġ¸é 34)
};
 
 
int retInt = -1;
//cout << "Type : " << typeStr << " -> ";
for (int j=0;j<sizeof(arType)/sizeof(arType[0]);j++) {
string tempString = arType[j];
if (inputString.find(tempString)!=string::npos && tempString.find(inputString)!=string::npos) {
//cout << j << " ";
retInt =  j;
break;
}
}
//cout << endl;
 
return retInt;
 
}
 
int get_Item_SubType_Value(int type_value, string inputString) 
{
static string arSub1[] = { "WEAPON_SWORD", "WEAPON_DAGGER", "WEAPON_BOW", "WEAPON_TWO_HANDED",
"WEAPON_BELL", "WEAPON_FAN", "WEAPON_ARROW", "WEAPON_MOUNT_SPEAR"};
static string arSub2[] = { "ARMOR_BODY", "ARMOR_HEAD", "ARMOR_SHIELD", "ARMOR_WRIST", "ARMOR_FOOTS",
"ARMOR_NECK", "ARMOR_EAR", "ARMOR_NUM_TYPES"};
static string arSub3[] = { "USE_POTION", "USE_TALISMAN", "USE_TUNING", "USE_MOVE", "USE_TREASURE_BOX", "USE_MONEYBAG", "USE_BAIT",
"USE_ABILITY_UP", "USE_AFFECT", "USE_CREATE_STONE", "USE_SPECIAL", "USE_POTION_NODELAY", "USE_CLEAR",
"USE_INVISIBILITY", "USE_DETACHMENT", "USE_BUCKET", "USE_POTION_CONTINUE", "USE_CLEAN_SOCKET",
"USE_CHANGE_ATTRIBUTE", "USE_ADD_ATTRIBUTE", "USE_ADD_ACCESSORY_SOCKET", "USE_PUT_INTO_ACCESSORY_SOCKET",
"USE_ADD_ATTRIBUTE2", "USE_RECIPE", "USE_CHANGE_ATTRIBUTE2", "USE_BIND", "USE_UNBIND", "USE_TIME_CHARGE_PER", "USE_TIME_CHARGE_FIX", "USE_PUT_INTO_BELT_SOCKET", "USE_PUT_INTO_RING_SOCKET"};
static string arSub4[] = { "AUTOUSE_POTION", "AUTOUSE_ABILITY_UP", "AUTOUSE_BOMB", "AUTOUSE_GOLD", "AUTOUSE_MONEYBAG", "AUTOUSE_TREASURE_BOX"};
static string arSub5[] = { "MATERIAL_LEATHER", "MATERIAL_BLOOD", "MATERIAL_ROOT", "MATERIAL_NEEDLE", "MATERIAL_JEWEL", 
"MATERIAL_DS_REFINE_NORMAL", "MATERIAL_DS_REFINE_BLESSED", "MATERIAL_DS_REFINE_HOLLY"};
static string arSub6[] = { "SPECIAL_MAP", "SPECIAL_KEY", "SPECIAL_DOC", "SPECIAL_SPIRIT"};
static string arSub7[] = { "TOOL_FISHING_ROD" };
static string arSub8[] = { "LOTTERY_TICKET", "LOTTERY_INSTANT" };
static string arSub10[] = { "METIN_NORMAL", "METIN_GOLD" };
static string arSub12[] = { "FISH_ALIVE", "FISH_DEAD"};
static string arSub14[] = { "RESOURCE_FISHBONE", "RESOURCE_WATERSTONEPIECE", "RESOURCE_WATERSTONE", "RESOURCE_BLOOD_PEARL",
"RESOURCE_BLUE_PEARL", "RESOURCE_WHITE_PEARL", "RESOURCE_BUCKET", "RESOURCE_CRYSTAL", "RESOURCE_GEM",
"RESOURCE_STONE", "RESOURCE_METIN", "RESOURCE_ORE" };
static string arSub16[] = { "UNIQUE_NONE", "UNIQUE_BOOK", "UNIQUE_SPECIAL_RIDE", "UNIQUE_3", "UNIQUE_4", "UNIQUE_5",
"UNIQUE_6", "UNIQUE_7", "UNIQUE_8", "UNIQUE_9", "USE_SPECIAL"};
static string arSub28[] = { "COSTUME_BODY", "COSTUME_HAIR" };
static string arSub29[] = { "DS_SLOT1", "DS_SLOT2", "DS_SLOT3", "DS_SLOT4", "DS_SLOT5", "DS_SLOT6" };
static string arSub31[] = { "EXTRACT_DRAGON_SOUL", "EXTRACT_DRAGON_HEART" };
 
static string* arSubType[] = {0, //0
arSub1, //1
arSub2, //2
arSub3, //3
arSub4, //4
arSub5, //5
arSub6, //6
arSub7, //7
arSub8, //8
0, //9
arSub10, //10
0, //11
arSub12, //12
0, //13
arSub14, //14
0, //15
arSub16, //16
0, //17
0, //18
0, //19
0, //20
0, //21
0, //22
0, //23
0, //24
0, //25
0, //26
0, //27
arSub28, //28
arSub29, //29
arSub29, //30
arSub31, //31
0, //32
0, //33 ąÝÁö
0, //34 ş§Ć®
};
static int arNumberOfSubtype[_countof(arSubType)] = {
0,
sizeof(arSub1)/sizeof(arSub1[0]),
sizeof(arSub2)/sizeof(arSub2[0]),
sizeof(arSub3)/sizeof(arSub3[0]),
sizeof(arSub4)/sizeof(arSub4[0]),
sizeof(arSub5)/sizeof(arSub5[0]),
sizeof(arSub6)/sizeof(arSub6[0]),
sizeof(arSub7)/sizeof(arSub7[0]),
sizeof(arSub8)/sizeof(arSub8[0]),
0,
sizeof(arSub10)/sizeof(arSub10[0]),
0,
sizeof(arSub12)/sizeof(arSub12[0]),
0,
sizeof(arSub14)/sizeof(arSub14[0]),
0,
sizeof(arSub16)/sizeof(arSub16[0]),
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
sizeof(arSub28)/sizeof(arSub28[0]),
sizeof(arSub29)/sizeof(arSub29[0]),
sizeof(arSub29)/sizeof(arSub29[0]),
sizeof(arSub31)/sizeof(arSub31[0]),
0, // 32
0, // 33 ąÝÁö
0, // 34 ş§Ć®
};
 
 
assert(_countof(arSubType) > type_value && "Subtype rule: Out of range!!");
 
// assert ľČ ¸ÔČ÷´Â µí..
if (_countof(arSubType) <= type_value)
{
sys_err("SubType : Out of range!! (type_value: %d, count of registered subtype: %d", type_value, _countof(arSubType));
return -1;
}
 
//ľĆŔĚĹŰ Ĺ¸ŔÔŔÇ Ľ­şęŸŔÔ ľî·ąŔ̰ˇ Á¸ŔçÇĎ´ÂÁö ľËľĆş¸°í, ľřŔ¸¸é 0 ¸®ĹĎ
if (arSubType[type_value]==0) {
return 0;
}
//
 
int retInt = -1;
//cout << "SubType : " << subTypeStr << " -> ";
for (int j=0;j<arNumberOfSubtype[type_value];j++) {
string tempString = arSubType[type_value][j];
string tempInputString = trim(inputString);
if (tempInputString.compare(tempString)==0)
{
//cout << j << " ";
retInt =  j;
break;
}
}
//cout << endl;
 
return retInt;
}
 
 
 
 
 
int get_Item_AntiFlag_Value(string inputString) 
{
 
string arAntiFlag[] = {"ANTI_FEMALE", "ANTI_MALE", "ANTI_MUSA", "ANTI_ASSASSIN", "ANTI_SURA", "ANTI_MUDANG",
"ANTI_GET", "ANTI_DROP", "ANTI_SELL", "ANTI_EMPIRE_A", "ANTI_EMPIRE_B", "ANTI_EMPIRE_C",
"ANTI_SAVE", "ANTI_GIVE", "ANTI_PKDROP", "ANTI_STACK", "ANTI_MYSHOP", "ANTI_SAFEBOX"};
 
 
int retValue = 0;
string* arInputString = StringSplit(inputString, "|"); //ÇÁ·ÎĹä Á¤ş¸ ł»żëŔ» ´Üľîş°·Î Âɰµ ąčż­.
for(int i =0;i<sizeof(arAntiFlag)/sizeof(arAntiFlag[0]);i++) {
string tempString = arAntiFlag[i];
for (int j=0; j<30 ; j++) //ĂÖ´ë 30°ł ´Üľî±îÁö. (ÇϵĺÄÚµů)
{
string tempString2 = arInputString[j];
if (tempString2.compare(tempString)==0) { //ŔĎġÇĎ´ÂÁö Č®ŔÎ.
retValue = retValue + pow((float)2,(float)i);
}
 
if(tempString2.compare("") == 0)
break;
}
}
delete []arInputString;
//cout << "AntiFlag : " << antiFlagStr << " -> " << retValue << endl;
 
return retValue;
}
 
int get_Item_Flag_Value(string inputString) 
{
 
string arFlag[] = {"ITEM_TUNABLE", "ITEM_SAVE", "ITEM_STACKABLE", "COUNT_PER_1GOLD", "ITEM_SLOW_QUERY", "ITEM_UNIQUE",
"ITEM_MAKECOUNT", "ITEM_IRREMOVABLE", "CONFIRM_WHEN_USE", "QUEST_USE", "QUEST_USE_MULTIPLE",
"QUEST_GIVE", "ITEM_QUEST", "LOG", "STACKABLE", "SLOW_QUERY", "REFINEABLE", "IRREMOVABLE", "ITEM_APPLICABLE"};
 
 
int retValue = 0;
string* arInputString = StringSplit(inputString, "|"); //ÇÁ·ÎĹä Á¤ş¸ ł»żëŔ» ´Üľîş°·Î Âɰµ ąčż­.
for(int i =0;i<sizeof(arFlag)/sizeof(arFlag[0]);i++) {
string tempString = arFlag[i];
for (int j=0; j<30 ; j++) //ĂÖ´ë 30°ł ´Üľî±îÁö. (ÇϵĺÄÚµů)
{
string tempString2 = arInputString[j];
if (tempString2.compare(tempString)==0) { //ŔĎġÇĎ´ÂÁö Č®ŔÎ.
retValue = retValue + pow((float)2,(float)i);
}
 
if(tempString2.compare("") == 0)
break;
}
}
delete []arInputString;
//cout << "Flag : " << flagStr << " -> " << retValue << endl;
 
return retValue;
}
 
int get_Item_WearFlag_Value(string inputString) 
{
 
string arWearrFlag[] = {"WEAR_BODY", "WEAR_HEAD", "WEAR_FOOTS", "WEAR_WRIST", "WEAR_WEAPON", "WEAR_NECK", "WEAR_EAR", "WEAR_SHIELD", "WEAR_UNIQUE",
"WEAR_ARROW", "WEAR_HAIR", "WEAR_ABILITY"};
 
 
int retValue = 0;
string* arInputString = StringSplit(inputString, "|"); //ÇÁ·ÎĹä Á¤ş¸ ł»żëŔ» ´Üľîş°·Î Âɰµ ąčż­.
for(int i =0;i<sizeof(arWearrFlag)/sizeof(arWearrFlag[0]);i++) {
string tempString = arWearrFlag[i];
for (int j=0; j<30 ; j++) //ĂÖ´ë 30°ł ´Üľî±îÁö. (ÇϵĺÄÚµů)
{
string tempString2 = arInputString[j];
if (tempString2.compare(tempString)==0) { //ŔĎġÇĎ´ÂÁö Č®ŔÎ.
retValue = retValue + pow((float)2,(float)i);
}
 
if(tempString2.compare("") == 0)
break;
}
}
delete []arInputString;
//cout << "WearFlag : " << wearFlagStr << " -> " << retValue << endl;
 
return retValue;
}
 
int get_Item_Immune_Value(string inputString) 
{
 
string arImmune[] = {"PARA","CURSE","STUN","SLEEP","SLOW","POISON","TERROR"};
 
int retValue = 0;
string* arInputString = StringSplit(inputString, "|"); //ÇÁ·ÎĹä Á¤ş¸ ł»żëŔ» ´Üľîş°·Î Âɰµ ąčż­.
for(int i =0;i<sizeof(arImmune)/sizeof(arImmune[0]);i++) {
string tempString = arImmune[i];
for (int j=0; j<30 ; j++) //ĂÖ´ë 30°ł ´Üľî±îÁö. (ÇϵĺÄÚµů)
{
string tempString2 = arInputString[j];
if (tempString2.compare(tempString)==0) { //ŔĎġÇĎ´ÂÁö Č®ŔÎ.
retValue = retValue + pow((float)2,(float)i);
}
 
if(tempString2.compare("") == 0)
break;
}
}
delete []arInputString;
//cout << "Immune : " << immuneStr << " -> " << retValue << endl;
 
return retValue;
}
 
 
 
 
int get_Item_LimitType_Value(string inputString)
{
string arLimitType[] = {"LIMIT_NONE", "LEVEL", "STR", "DEX", "INT", "CON", "PC_BANG", "REAL_TIME", "REAL_TIME_FIRST_USE", "TIMER_BASED_ON_WEAR"};
 
int retInt = -1;
//cout << "LimitType : " << limitTypeStr << " -> ";
for (int j=0;j<sizeof(arLimitType)/sizeof(arLimitType[0]);j++) {
string tempString = arLimitType[j];
string tempInputString = trim(inputString);
if (tempInputString.compare(tempString)==0)
{
//cout << j << " ";
retInt =  j;
break;
}
}
//cout << endl;
 
return retInt;
}
 
 
int get_Item_ApplyType_Value(string inputString)
{
string arApplyType[] = {"APPLY_NONE", "APPLY_MAX_HP", "APPLY_MAX_SP", "APPLY_CON", "APPLY_INT", "APPLY_STR", "APPLY_DEX", "APPLY_ATT_SPEED",
"APPLY_MOV_SPEED", "APPLY_CAST_SPEED", "APPLY_HP_REGEN", "APPLY_SP_REGEN", "APPLY_POISON_PCT", "APPLY_STUN_PCT",
"APPLY_SLOW_PCT", "APPLY_CRITICAL_PCT", "APPLY_PENETRATE_PCT", "APPLY_ATTBONUS_HUMAN", "APPLY_ATTBONUS_ANIMAL",
"APPLY_ATTBONUS_ORC", "APPLY_ATTBONUS_MILGYO", "APPLY_ATTBONUS_UNDEAD", "APPLY_ATTBONUS_DEVIL", "APPLY_STEAL_HP",
"APPLY_STEAL_SP", "APPLY_MANA_BURN_PCT", "APPLY_DAMAGE_SP_RECOVER", "APPLY_BLOCK", "APPLY_DODGE", "APPLY_RESIST_SWORD",
"APPLY_RESIST_TWOHAND", "APPLY_RESIST_DAGGER", "APPLY_RESIST_BELL", "APPLY_RESIST_FAN", "APPLY_RESIST_BOW", "APPLY_RESIST_FIRE",
"APPLY_RESIST_ELEC", "APPLY_RESIST_MAGIC", "APPLY_RESIST_WIND", "APPLY_REFLECT_MELEE", "APPLY_REFLECT_CURSE", "APPLY_POISON_REDUCE",
"APPLY_KILL_SP_RECOVER", "APPLY_EXP_DOUBLE_BONUS", "APPLY_GOLD_DOUBLE_BONUS", "APPLY_ITEM_DROP_BONUS", "APPLY_POTION_BONUS",
"APPLY_KILL_HP_RECOVER", "APPLY_IMMUNE_STUN", "APPLY_IMMUNE_SLOW", "APPLY_IMMUNE_FALL", "APPLY_SKILL", "APPLY_BOW_DISTANCE",
"APPLY_ATT_GRADE_BONUS", "APPLY_DEF_GRADE_BONUS", "APPLY_MAGIC_ATT_GRADE", "APPLY_MAGIC_DEF_GRADE", "APPLY_CURSE_PCT",
"APPLY_MAX_STAMINA", "APPLY_ATTBONUS_WARRIOR", "APPLY_ATTBONUS_ASSASSIN", "APPLY_ATTBONUS_SURA", "APPLY_ATTBONUS_SHAMAN",
"APPLY_ATTBONUS_MONSTER", "APPLY_MALL_ATTBONUS", "APPLY_MALL_DEFBONUS", "APPLY_MALL_EXPBONUS", "APPLY_MALL_ITEMBONUS",
"APPLY_MALL_GOLDBONUS", "APPLY_MAX_HP_PCT", "APPLY_MAX_SP_PCT", "APPLY_SKILL_DAMAGE_BONUS", "APPLY_NORMAL_HIT_DAMAGE_BONUS",
"APPLY_SKILL_DEFEND_BONUS", "APPLY_NORMAL_HIT_DEFEND_BONUS", "APPLY_PC_BANG_EXP_BONUS", "APPLY_PC_BANG_DROP_BONUS",
"APPLY_EXTRACT_HP_PCT", "APPLY_RESIST_WARRIOR", "APPLY_RESIST_ASSASSIN", "APPLY_RESIST_SURA", "APPLY_RESIST_SHAMAN",
"APPLY_ENERGY", "APPLY_DEF_GRADE", "APPLY_COSTUME_ATTR_BONUS", "APPLY_MAGIC_ATTBONUS_PER", "APPLY_MELEE_MAGIC_ATTBONUS_PER",
"APPLY_RESIST_ICE", "APPLY_RESIST_EARTH", "APPLY_RESIST_DARK", "APPLY_ANTI_CRITICAL_PCT", "APPLY_ANTI_PENETRATE_PCT",
};
 
int retInt = -1;
//cout << "ApplyType : " << applyTypeStr << " -> ";
for (int j=0;j<sizeof(arApplyType)/sizeof(arApplyType[0]);j++) {
string tempString = arApplyType[j];
string tempInputString = trim(inputString);
if (tempInputString.compare(tempString)==0)
{ 
//cout << j << " ";
retInt =  j;
break;
}
}
//cout << endl;
 
return retInt;
 
}
 
 
//¸ó˝şĹÍ ÇÁ·ÎĹäµµ Ŕд´Ů.
 
 
int get_Mob_Rank_Value(string inputString) 
{
string arRank[] = {"PAWN", "S_PAWN", "KNIGHT", "S_KNIGHT", "BOSS", "KING"};
 
int retInt = -1;
//cout << "Rank : " << rankStr << " -> ";
for (int j=0;j<sizeof(arRank)/sizeof(arRank[0]);j++) {
string tempString = arRank[j];
string tempInputString = trim(inputString);
if (tempInputString.compare(tempString)==0) 
{
//cout << j << " ";
retInt =  j;
break;
}
}
//cout << endl;
 
return retInt;
}
 
 
int get_Mob_Type_Value(string inputString)
{
string arType[] = { "MONSTER", "NPC", "STONE", "WARP", "DOOR", "BUILDING", "PC", "POLYMORPH_PC", "HORSE", "GOTO"};
 
int retInt = -1;
//cout << "Type : " << typeStr << " -> ";
for (int j=0;j<sizeof(arType)/sizeof(arType[0]);j++) {
string tempString = arType[j];
string tempInputString = trim(inputString);
if (tempInputString.compare(tempString)==0) 
{
//cout << j << " ";
retInt =  j;
break;
}
}
//cout << endl;
 
return retInt;
}
 
int get_Mob_BattleType_Value(string inputString) 
{
string arBattleType[] = { "MELEE", "RANGE", "MAGIC", "SPECIAL", "POWER", "TANKER", "SUPER_POWER", "SUPER_TANKER"};
 
int retInt = -1;
//cout << "Battle Type : " << battleTypeStr << " -> ";
for (int j=0;j<sizeof(arBattleType)/sizeof(arBattleType[0]);j++) {
string tempString = arBattleType[j];
string tempInputString = trim(inputString);
if (tempInputString.compare(tempString)==0) 
{ 
//cout << j << " ";
retInt =  j;
break;
}
}
//cout << endl;
 
return retInt;
}
 
int get_Mob_Size_Value(string inputString)
{
string arSize[] = { "SAMLL", "MEDIUM", "BIG"};
 
int retInt = 0;
//cout << "Size : " << sizeStr << " -> ";
for (int j=0;j<sizeof(arSize)/sizeof(arSize[0]);j++) {
string tempString = arSize[j];
string tempInputString = trim(inputString);
if (tempInputString.compare(tempString)==0) 
{
//cout << j << " ";
retInt =  j + 1;
break;
}
}
//cout << endl;
 
return retInt;
}
 
int get_Mob_AIFlag_Value(string inputString)
{
string arAIFlag[] = {"AGGR","NOMOVE","COWARD","NOATTSHINSU","NOATTCHUNJO","NOATTJINNO","ATTMOB","BERSERK","STONESKIN","GODSPEED","DEATHBLOW","REVIVE"};
 
 
int retValue = 0;
string* arInputString = StringSplit(inputString, ","); //ÇÁ·ÎĹä Á¤ş¸ ł»żëŔ» ´Üľîş°·Î Âɰµ ąčż­.
for(int i =0;i<sizeof(arAIFlag)/sizeof(arAIFlag[0]);i++) {
string tempString = arAIFlag[i];
for (int j=0; j<30 ; j++) //ĂÖ´ë 30°ł ´Üľî±îÁö. (ÇϵĺÄÚµů)
{
string tempString2 = arInputString[j];
if (tempString2.compare(tempString)==0) { //ŔĎġÇĎ´ÂÁö Č®ŔÎ.
retValue = retValue + pow((float)2,(float)i);
}
 
if(tempString2.compare("") == 0)
break;
}
}
delete []arInputString;
//cout << "AIFlag : " << aiFlagStr << " -> " << retValue << endl;
 
return retValue;
}
int get_Mob_RaceFlag_Value(string inputString)
{
string arRaceFlag[] = {"ANIMAL","UNDEAD","DEVIL","HUMAN","ORC","MILGYO","INSECT","FIRE","ICE","DESERT","TREE",
"ATT_ELEC","ATT_FIRE","ATT_ICE","ATT_WIND","ATT_EARTH","ATT_DARK"};
 
int retValue = 0;
string* arInputString = StringSplit(inputString, ","); //ÇÁ·ÎĹä Á¤ş¸ ł»żëŔ» ´Üľîş°·Î Âɰµ ąčż­.
for(int i =0;i<sizeof(arRaceFlag)/sizeof(arRaceFlag[0]);i++) {
string tempString = arRaceFlag[i];
for (int j=0; j<30 ; j++) //ĂÖ´ë 30°ł ´Üľî±îÁö. (ÇϵĺÄÚµů)
{
string tempString2 = arInputString[j];
if (tempString2.compare(tempString)==0) { //ŔĎġÇĎ´ÂÁö Č®ŔÎ.
retValue = retValue + pow((float)2,(float)i);
}
 
if(tempString2.compare("") == 0)
break;
}
}
delete []arInputString;
//cout << "Race Flag : " << raceFlagStr << " -> " << retValue << endl;
 
return retValue;
}
int get_Mob_ImmuneFlag_Value(string inputString)
{
string arImmuneFlag[] = {"STUN","SLOW","FALL","CURSE","POISON","TERROR", "REFLECT"};
 
int retValue = 0;
string* arInputString = StringSplit(inputString, ","); //ÇÁ·ÎĹä Á¤ş¸ ł»żëŔ» ´Üľîş°·Î Âɰµ ąčż­.
for(int i =0;i<sizeof(arImmuneFlag)/sizeof(arImmuneFlag[0]);i++) {
string tempString = arImmuneFlag[i];
for (int j=0; j<30 ; j++) //ĂÖ´ë 30°ł ´Üľî±îÁö. (ÇϵĺÄÚµů)
{
string tempString2 = arInputString[j];
if (tempString2.compare(tempString)==0) { //ŔĎġÇĎ´ÂÁö Č®ŔÎ.
retValue = retValue + pow((float)2,(float)i);
}
 
if(tempString2.compare("") == 0)
break;
}
}
delete []arInputString;
//cout << "Immune Flag : " << immuneFlagStr << " -> " << retValue << endl;
 
 
return retValue;
}
 
 
#ifndef __DUMP_PROTO__
 
//¸÷ Ĺ×ŔĚşíŔ» ĽÂĆĂÇŘÁŘ´Ů.
bool Set_Proto_Mob_Table(TMobTable *mobTable, cCsvTable &csvTable,std::map<int,const char*> &nameMap)
{
int col = 0;
str_to_number(mobTable->dwVnum, csvTable.AsStringByIndex(col++));
strlcpy(mobTable->szName, csvTable.AsStringByIndex(col++), sizeof(mobTable->szName));
 
//3. ÁöżŞş° Ŕ̸§ łÖľîÁÖ±â.
map<int,const char*>::iterator it;
it = nameMap.find(mobTable->dwVnum);
if (it != nameMap.end()) {
const char * localeName = it->second;
strlcpy(mobTable->szLocaleName, localeName, sizeof (mobTable->szLocaleName));
} else {
strlcpy(mobTable->szLocaleName, mobTable->szName, sizeof (mobTable->szLocaleName));
}
 
//RANK
int rankValue = get_Mob_Rank_Value(csvTable.AsStringByIndex(col++));
mobTable->bRank = rankValue;
//TYPE
int typeValue = get_Mob_Type_Value(csvTable.AsStringByIndex(col++));
mobTable->bType = typeValue;
//BATTLE_TYPE
int battleTypeValue = get_Mob_BattleType_Value(csvTable.AsStringByIndex(col++));
mobTable->bBattleType = battleTypeValue;
 
str_to_number(mobTable->bLevel, csvTable.AsStringByIndex(col++));
//SIZE
int sizeValue = get_Mob_Size_Value(csvTable.AsStringByIndex(col++));
mobTable->bSize = sizeValue;
//AI_FLAG
int aiFlagValue = get_Mob_AIFlag_Value(csvTable.AsStringByIndex(col++));
mobTable->dwAIFlag = aiFlagValue;
//mount_capacity;
col++;
//RACE_FLAG
int raceFlagValue = get_Mob_RaceFlag_Value(csvTable.AsStringByIndex(col++));
mobTable->dwRaceFlag = raceFlagValue;
//IMMUNE_FLAG
int immuneFlagValue = get_Mob_ImmuneFlag_Value(csvTable.AsStringByIndex(col++));
mobTable->dwImmuneFlag = immuneFlagValue;
 
str_to_number(mobTable->bEmpire, csvTable.AsStringByIndex(col++));  //col = 11
 
strlcpy(mobTable->szFolder, csvTable.AsStringByIndex(col++), sizeof(mobTable->szFolder));
 
str_to_number(mobTable->bOnClickType, csvTable.AsStringByIndex(col++)); 
 
str_to_number(mobTable->bStr, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->bDex, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->bCon, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->bInt, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->dwDamageRange[0], csvTable.AsStringByIndex(col++));
str_to_number(mobTable->dwDamageRange[1], csvTable.AsStringByIndex(col++));
str_to_number(mobTable->dwMaxHP, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->bRegenCycle, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->bRegenPercent, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->dwGoldMin, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->dwGoldMax, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->dwExp, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->wDef, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->sAttackSpeed, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->sMovingSpeed, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->bAggresiveHPPct, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->wAggressiveSight, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->wAttackRange, csvTable.AsStringByIndex(col++));
 
str_to_number(mobTable->dwDropItemVnum, csvTable.AsStringByIndex(col++)); //32
str_to_number(mobTable->dwResurrectionVnum, csvTable.AsStringByIndex(col++));
for (int i = 0; i < MOB_ENCHANTS_MAX_NUM; ++i)
str_to_number(mobTable->cEnchants[i], csvTable.AsStringByIndex(col++));
 
for (int i = 0; i < MOB_RESISTS_MAX_NUM; ++i)
str_to_number(mobTable->cResists[i], csvTable.AsStringByIndex(col++));
 
str_to_number(mobTable->fDamMultiply, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->dwSummonVnum, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->dwDrainSP, csvTable.AsStringByIndex(col++));
 
//Mob_Color
++col;
 
str_to_number(mobTable->dwPolymorphItemVnum, csvTable.AsStringByIndex(col++));
 
str_to_number(mobTable->Skills[0].bLevel, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->Skills[0].dwVnum, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->Skills[1].bLevel, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->Skills[1].dwVnum, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->Skills[2].bLevel, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->Skills[2].dwVnum, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->Skills[3].bLevel, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->Skills[3].dwVnum, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->Skills[4].bLevel, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->Skills[4].dwVnum, csvTable.AsStringByIndex(col++));
 
str_to_number(mobTable->bBerserkPoint, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->bStoneSkinPoint, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->bGodSpeedPoint, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->bDeathBlowPoint, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->bRevivePoint, csvTable.AsStringByIndex(col++));
 
sys_log(0, "MOB #%-5d %-24s level: %-3u rank: %u empire: %d", mobTable->dwVnum, mobTable->szLocaleName, mobTable->bLevel, mobTable->bRank, mobTable->bEmpire);
 
return true;
}
 
bool Set_Proto_Item_Table(TItemTable *itemTable, cCsvTable &csvTable,std::map<int,const char*> &nameMap)
{
int col = 0;
 
int dataArray[33];
for (int i=0; i<sizeof(dataArray)/sizeof(dataArray[0]);i++) {
int validCheck = 0;
if (i==2) {
dataArray[i] = get_Item_Type_Value(csvTable.AsStringByIndex(col));
validCheck = dataArray[i];
} else if (i==3) {
dataArray[i] = get_Item_SubType_Value(dataArray[i-1], csvTable.AsStringByIndex(col));
validCheck = dataArray[i];
} else if (i==5) {
dataArray[i] = get_Item_AntiFlag_Value(csvTable.AsStringByIndex(col));
validCheck = dataArray[i];
} else if (i==6) {
dataArray[i] = get_Item_Flag_Value(csvTable.AsStringByIndex(col));
validCheck = dataArray[i];
} else if (i==7) {
dataArray[i] = get_Item_WearFlag_Value(csvTable.AsStringByIndex(col));
validCheck = dataArray[i];
} else if (i==8) {
dataArray[i] = get_Item_Immune_Value(csvTable.AsStringByIndex(col));
validCheck = dataArray[i];
} else if (i==14) {
dataArray[i] = get_Item_LimitType_Value(csvTable.AsStringByIndex(col));
validCheck = dataArray[i];
} else if (i==16) {
dataArray[i] = get_Item_LimitType_Value(csvTable.AsStringByIndex(col));
validCheck = dataArray[i];
} else if (i==18) {
dataArray[i] = get_Item_ApplyType_Value(csvTable.AsStringByIndex(col));
validCheck = dataArray[i];
} else if (i==20) {
dataArray[i] = get_Item_ApplyType_Value(csvTable.AsStringByIndex(col));
validCheck = dataArray[i];
} else if (i==22) {
dataArray[i] = get_Item_ApplyType_Value(csvTable.AsStringByIndex(col));
validCheck = dataArray[i];
} else {
str_to_number(dataArray[i], csvTable.AsStringByIndex(col));
}
 
if (validCheck == -1)
{
std::ostringstream dataStream;
 
for (int j = 0; j < i; ++j)
dataStream << dataArray[j] << ",";
 
//fprintf(stderr, "ItemProto Reading Failed : Invalid value.\n");
sys_err("ItemProto Reading Failed : Invalid value. (index: %d, col: %d, value: %s)", i, col, csvTable.AsStringByIndex(col));
sys_err("\t%d ~ %d Values: %s", 0, i, dataStream.str().c_str());
 
exit(0);
}
 
col = col + 1;
}
 
// vnum ą× vnum range Ŕбâ.
{
std::string s(csvTable.AsStringByIndex(0));
int pos = s.find("~");
// vnum Çʵ忡 '~'°ˇ ľř´Ů¸é ĆĐ˝ş
if (std::string::npos == pos)
{
itemTable->dwVnum = dataArray[0];
itemTable->dwVnumRange = 0;
}
else
{
std::string s_start_vnum (s.substr(0, pos));
std::string s_end_vnum (s.substr(pos +1 ));
 
int start_vnum = atoi(s_start_vnum.c_str());
int end_vnum = atoi(s_end_vnum.c_str());
if (0 == start_vnum || (0 != end_vnum && end_vnum < start_vnum))
{
sys_err ("INVALID VNUM %s", s.c_str());
return false;
}
itemTable->dwVnum = start_vnum;
itemTable->dwVnumRange = end_vnum - start_vnum;
}
}
 
strlcpy(itemTable->szName, csvTable.AsStringByIndex(1), sizeof(itemTable->szName));
//ÁöżŞş° Ŕ̸§ łÖľîÁÖ±â.
map<int,const char*>::iterator it;
it = nameMap.find(itemTable->dwVnum);
if (it != nameMap.end()) {
const char * localeName = it->second;
strlcpy(itemTable->szLocaleName, localeName, sizeof (itemTable->szLocaleName));
} else {
strlcpy(itemTable->szLocaleName, itemTable->szName, sizeof (itemTable->szLocaleName));
}
itemTable->bType = dataArray[2];
itemTable->bSubType = dataArray[3];
itemTable->bSize = dataArray[4];
itemTable->dwAntiFlags = dataArray[5];
itemTable->dwFlags = dataArray[6];
itemTable->dwWearFlags = dataArray[7];
itemTable->dwImmuneFlag = dataArray[8];
itemTable->dwGold = dataArray[9];
itemTable->dwShopBuyPrice = dataArray[10];
itemTable->dwRefinedVnum = dataArray[11];
itemTable->wRefineSet = dataArray[12];
itemTable->bAlterToMagicItemPct = dataArray[13];
itemTable->cLimitRealTimeFirstUseIndex = -1;
itemTable->cLimitTimerBasedOnWearIndex = -1;
 
int i;
 
for (i = 0; i < ITEM_LIMIT_MAX_NUM; ++i)
{
itemTable->aLimits[i].bType = dataArray[14+i*2];
itemTable->aLimits[i].lValue = dataArray[15+i*2];
 
if (LIMIT_REAL_TIME_START_FIRST_USE == itemTable->aLimits[i].bType)
itemTable->cLimitRealTimeFirstUseIndex = (char)i;
 
if (LIMIT_TIMER_BASED_ON_WEAR == itemTable->aLimits[i].bType)
itemTable->cLimitTimerBasedOnWearIndex = (char)i;
 
}
 
for (i = 0; i < ITEM_APPLY_MAX_NUM; ++i)
{
itemTable->aApplies[i].bType = dataArray[18+i*2];
itemTable->aApplies[i].lValue = dataArray[19+i*2];
}
 
for (i = 0; i < ITEM_VALUES_MAX_NUM; ++i)
itemTable->alValues[i] = dataArray[24+i];
 
//column for 'Specular'
itemTable->bGainSocketPct = dataArray[31];
itemTable->sAddonType = dataArray[32];
 
//test
str_to_number(itemTable->bWeight, "0");
 
return true;
}
 
#endif

57199140501148694665.png

Opublikowano

 

 

Pokaz swoje ProtoReader.cpp bo normalnie masz 

strtol(string_from_row(row[col], length[col]).c_str(), NULL, 10)

 

 

#include "stdafx.h"
 
#include <math.h>
#include "ProtoReader.h"
 
#include "CsvReader.h"
 
#include <sstream>
 
using namespace std;
 
inline string trim_left(const string& str)
{
    string::size_type n = str.find_first_not_of(" \t\v\n\r");
    return n == string::npos ? str : str.substr(n, str.length());
}
 
inline string trim_right(const string& str)
{
    string::size_type n = str.find_last_not_of(" \t\v\n\r");
    return n == string::npos ? str : str.substr(0, n + 1);
}
 
string trim(const string& str){return trim_left(trim_right(str));}
 
static string* StringSplit(string strOrigin, string strTok)
{
    int     cutAt;                            //ŔÚ¸Ł´ÂŔ§Äˇ
    int     index     = 0;                    //ą®ŔÚż­Ŕε¦˝ş
    string* strResult = new string[30];   //°á°úreturn ÇŇşŻĽö
 
    //strTokŔ»ĂŁŔ»¶§±îÁöąÝşą
    while ((cutAt = strOrigin.find_first_of(strTok)) != strOrigin.npos)
    {
       if (cutAt > 0)  //ŔÚ¸Ł´ÂŔ§Äˇ°ˇ0ş¸´ŮĹ©¸é(Ľş°ř˝Ă)
       {
            strResult[index++] = strOrigin.substr(0, cutAt);  //°á°úąčż­żˇĂß°ˇ
       }
       strOrigin = strOrigin.substr(cutAt+1);  //żřş»ŔşŔÚ¸ĄşÎşĐÁ¦żÜÇŃłŞ¸ÓÁö
    }
 
    if(strOrigin.length() > 0)  //żřş»ŔĚľĆÁ÷ł˛ľŇŔ¸¸é
    {
        strResult[index++] = strOrigin.substr(0, cutAt);  //łŞ¸ÓÁö¸¦°á°úąčż­żˇĂß°ˇ
    }
 
for( int i=0;i<index;i++)
{
strResult[i] = trim(strResult[i]);
}
 
    return strResult;  //°á°úreturn
}
 
 
 
int get_Item_Type_Value(string inputString)
{
string arType[] = {"ITEM_NONE", "ITEM_WEAPON",
"ITEM_ARMOR", "ITEM_USE", 
"ITEM_AUTOUSE", "ITEM_MATERIAL",
"ITEM_SPECIAL", "ITEM_TOOL", 
"ITEM_LOTTERY", "ITEM_ELK", //10°ł
 
"ITEM_METIN", "ITEM_CONTAINER", 
"ITEM_FISH", "ITEM_ROD", 
"ITEM_RESOURCE", "ITEM_CAMPFIRE",
"ITEM_UNIQUE", "ITEM_SKILLBOOK", 
"ITEM_QUEST", "ITEM_POLYMORPH", //20°ł
 
"ITEM_TREASURE_BOX", "ITEM_TREASURE_KEY",
"ITEM_SKILLFORGET", "ITEM_GIFTBOX", 
"ITEM_PICK", "ITEM_HAIR", 
"ITEM_TOTEM", "ITEM_BLEND", 
"ITEM_COSTUME", "ITEM_DS", //30°ł
 
"ITEM_SPECIAL_DS", "ITEM_EXTRACT",
"ITEM_SECONDARY_COIN", //33°ł
 
"ITEM_RING",
"ITEM_BELT", //35°ł (EItemTypes °ŞŔ¸·Î ġ¸é 34)
};
 
 
int retInt = -1;
//cout << "Type : " << typeStr << " -> ";
for (int j=0;j<sizeof(arType)/sizeof(arType[0]);j++) {
string tempString = arType[j];
if (inputString.find(tempString)!=string::npos && tempString.find(inputString)!=string::npos) {
//cout << j << " ";
retInt =  j;
break;
}
}
//cout << endl;
 
return retInt;
 
}
 
int get_Item_SubType_Value(int type_value, string inputString) 
{
static string arSub1[] = { "WEAPON_SWORD", "WEAPON_DAGGER", "WEAPON_BOW", "WEAPON_TWO_HANDED",
"WEAPON_BELL", "WEAPON_FAN", "WEAPON_ARROW", "WEAPON_MOUNT_SPEAR"};
static string arSub2[] = { "ARMOR_BODY", "ARMOR_HEAD", "ARMOR_SHIELD", "ARMOR_WRIST", "ARMOR_FOOTS",
"ARMOR_NECK", "ARMOR_EAR", "ARMOR_NUM_TYPES"};
static string arSub3[] = { "USE_POTION", "USE_TALISMAN", "USE_TUNING", "USE_MOVE", "USE_TREASURE_BOX", "USE_MONEYBAG", "USE_BAIT",
"USE_ABILITY_UP", "USE_AFFECT", "USE_CREATE_STONE", "USE_SPECIAL", "USE_POTION_NODELAY", "USE_CLEAR",
"USE_INVISIBILITY", "USE_DETACHMENT", "USE_BUCKET", "USE_POTION_CONTINUE", "USE_CLEAN_SOCKET",
"USE_CHANGE_ATTRIBUTE", "USE_ADD_ATTRIBUTE", "USE_ADD_ACCESSORY_SOCKET", "USE_PUT_INTO_ACCESSORY_SOCKET",
"USE_ADD_ATTRIBUTE2", "USE_RECIPE", "USE_CHANGE_ATTRIBUTE2", "USE_BIND", "USE_UNBIND", "USE_TIME_CHARGE_PER", "USE_TIME_CHARGE_FIX", "USE_PUT_INTO_BELT_SOCKET", "USE_PUT_INTO_RING_SOCKET"};
static string arSub4[] = { "AUTOUSE_POTION", "AUTOUSE_ABILITY_UP", "AUTOUSE_BOMB", "AUTOUSE_GOLD", "AUTOUSE_MONEYBAG", "AUTOUSE_TREASURE_BOX"};
static string arSub5[] = { "MATERIAL_LEATHER", "MATERIAL_BLOOD", "MATERIAL_ROOT", "MATERIAL_NEEDLE", "MATERIAL_JEWEL", 
"MATERIAL_DS_REFINE_NORMAL", "MATERIAL_DS_REFINE_BLESSED", "MATERIAL_DS_REFINE_HOLLY"};
static string arSub6[] = { "SPECIAL_MAP", "SPECIAL_KEY", "SPECIAL_DOC", "SPECIAL_SPIRIT"};
static string arSub7[] = { "TOOL_FISHING_ROD" };
static string arSub8[] = { "LOTTERY_TICKET", "LOTTERY_INSTANT" };
static string arSub10[] = { "METIN_NORMAL", "METIN_GOLD" };
static string arSub12[] = { "FISH_ALIVE", "FISH_DEAD"};
static string arSub14[] = { "RESOURCE_FISHBONE", "RESOURCE_WATERSTONEPIECE", "RESOURCE_WATERSTONE", "RESOURCE_BLOOD_PEARL",
"RESOURCE_BLUE_PEARL", "RESOURCE_WHITE_PEARL", "RESOURCE_BUCKET", "RESOURCE_CRYSTAL", "RESOURCE_GEM",
"RESOURCE_STONE", "RESOURCE_METIN", "RESOURCE_ORE" };
static string arSub16[] = { "UNIQUE_NONE", "UNIQUE_BOOK", "UNIQUE_SPECIAL_RIDE", "UNIQUE_3", "UNIQUE_4", "UNIQUE_5",
"UNIQUE_6", "UNIQUE_7", "UNIQUE_8", "UNIQUE_9", "USE_SPECIAL"};
static string arSub28[] = { "COSTUME_BODY", "COSTUME_HAIR" };
static string arSub29[] = { "DS_SLOT1", "DS_SLOT2", "DS_SLOT3", "DS_SLOT4", "DS_SLOT5", "DS_SLOT6" };
static string arSub31[] = { "EXTRACT_DRAGON_SOUL", "EXTRACT_DRAGON_HEART" };
 
static string* arSubType[] = {0, //0
arSub1, //1
arSub2, //2
arSub3, //3
arSub4, //4
arSub5, //5
arSub6, //6
arSub7, //7
arSub8, //8
0, //9
arSub10, //10
0, //11
arSub12, //12
0, //13
arSub14, //14
0, //15
arSub16, //16
0, //17
0, //18
0, //19
0, //20
0, //21
0, //22
0, //23
0, //24
0, //25
0, //26
0, //27
arSub28, //28
arSub29, //29
arSub29, //30
arSub31, //31
0, //32
0, //33 ąÝÁö
0, //34 ş§Ć®
};
static int arNumberOfSubtype[_countof(arSubType)] = {
0,
sizeof(arSub1)/sizeof(arSub1[0]),
sizeof(arSub2)/sizeof(arSub2[0]),
sizeof(arSub3)/sizeof(arSub3[0]),
sizeof(arSub4)/sizeof(arSub4[0]),
sizeof(arSub5)/sizeof(arSub5[0]),
sizeof(arSub6)/sizeof(arSub6[0]),
sizeof(arSub7)/sizeof(arSub7[0]),
sizeof(arSub8)/sizeof(arSub8[0]),
0,
sizeof(arSub10)/sizeof(arSub10[0]),
0,
sizeof(arSub12)/sizeof(arSub12[0]),
0,
sizeof(arSub14)/sizeof(arSub14[0]),
0,
sizeof(arSub16)/sizeof(arSub16[0]),
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
sizeof(arSub28)/sizeof(arSub28[0]),
sizeof(arSub29)/sizeof(arSub29[0]),
sizeof(arSub29)/sizeof(arSub29[0]),
sizeof(arSub31)/sizeof(arSub31[0]),
0, // 32
0, // 33 ąÝÁö
0, // 34 ş§Ć®
};
 
 
assert(_countof(arSubType) > type_value && "Subtype rule: Out of range!!");
 
// assert ľČ ¸ÔČ÷´Â µí..
if (_countof(arSubType) <= type_value)
{
sys_err("SubType : Out of range!! (type_value: %d, count of registered subtype: %d", type_value, _countof(arSubType));
return -1;
}
 
//ľĆŔĚĹŰ Ĺ¸ŔÔŔÇ Ľ­şęŸŔÔ ľî·ąŔ̰ˇ Á¸ŔçÇĎ´ÂÁö ľËľĆş¸°í, ľřŔ¸¸é 0 ¸®ĹĎ
if (arSubType[type_value]==0) {
return 0;
}
//
 
int retInt = -1;
//cout << "SubType : " << subTypeStr << " -> ";
for (int j=0;j<arNumberOfSubtype[type_value];j++) {
string tempString = arSubType[type_value][j];
string tempInputString = trim(inputString);
if (tempInputString.compare(tempString)==0)
{
//cout << j << " ";
retInt =  j;
break;
}
}
//cout << endl;
 
return retInt;
}
 
 
 
 
 
int get_Item_AntiFlag_Value(string inputString) 
{
 
string arAntiFlag[] = {"ANTI_FEMALE", "ANTI_MALE", "ANTI_MUSA", "ANTI_ASSASSIN", "ANTI_SURA", "ANTI_MUDANG",
"ANTI_GET", "ANTI_DROP", "ANTI_SELL", "ANTI_EMPIRE_A", "ANTI_EMPIRE_B", "ANTI_EMPIRE_C",
"ANTI_SAVE", "ANTI_GIVE", "ANTI_PKDROP", "ANTI_STACK", "ANTI_MYSHOP", "ANTI_SAFEBOX"};
 
 
int retValue = 0;
string* arInputString = StringSplit(inputString, "|"); //ÇÁ·ÎĹä Á¤ş¸ ł»żëŔ» ´Üľîş°·Î Âɰµ ąčż­.
for(int i =0;i<sizeof(arAntiFlag)/sizeof(arAntiFlag[0]);i++) {
string tempString = arAntiFlag[i];
for (int j=0; j<30 ; j++) //ĂÖ´ë 30°ł ´Üľî±îÁö. (ÇϵĺÄÚµů)
{
string tempString2 = arInputString[j];
if (tempString2.compare(tempString)==0) { //ŔĎġÇĎ´ÂÁö Č®ŔÎ.
retValue = retValue + pow((float)2,(float)i);
}
 
if(tempString2.compare("") == 0)
break;
}
}
delete []arInputString;
//cout << "AntiFlag : " << antiFlagStr << " -> " << retValue << endl;
 
return retValue;
}
 
int get_Item_Flag_Value(string inputString) 
{
 
string arFlag[] = {"ITEM_TUNABLE", "ITEM_SAVE", "ITEM_STACKABLE", "COUNT_PER_1GOLD", "ITEM_SLOW_QUERY", "ITEM_UNIQUE",
"ITEM_MAKECOUNT", "ITEM_IRREMOVABLE", "CONFIRM_WHEN_USE", "QUEST_USE", "QUEST_USE_MULTIPLE",
"QUEST_GIVE", "ITEM_QUEST", "LOG", "STACKABLE", "SLOW_QUERY", "REFINEABLE", "IRREMOVABLE", "ITEM_APPLICABLE"};
 
 
int retValue = 0;
string* arInputString = StringSplit(inputString, "|"); //ÇÁ·ÎĹä Á¤ş¸ ł»żëŔ» ´Üľîş°·Î Âɰµ ąčż­.
for(int i =0;i<sizeof(arFlag)/sizeof(arFlag[0]);i++) {
string tempString = arFlag[i];
for (int j=0; j<30 ; j++) //ĂÖ´ë 30°ł ´Üľî±îÁö. (ÇϵĺÄÚµů)
{
string tempString2 = arInputString[j];
if (tempString2.compare(tempString)==0) { //ŔĎġÇĎ´ÂÁö Č®ŔÎ.
retValue = retValue + pow((float)2,(float)i);
}
 
if(tempString2.compare("") == 0)
break;
}
}
delete []arInputString;
//cout << "Flag : " << flagStr << " -> " << retValue << endl;
 
return retValue;
}
 
int get_Item_WearFlag_Value(string inputString) 
{
 
string arWearrFlag[] = {"WEAR_BODY", "WEAR_HEAD", "WEAR_FOOTS", "WEAR_WRIST", "WEAR_WEAPON", "WEAR_NECK", "WEAR_EAR", "WEAR_SHIELD", "WEAR_UNIQUE",
"WEAR_ARROW", "WEAR_HAIR", "WEAR_ABILITY"};
 
 
int retValue = 0;
string* arInputString = StringSplit(inputString, "|"); //ÇÁ·ÎĹä Á¤ş¸ ł»żëŔ» ´Üľîş°·Î Âɰµ ąčż­.
for(int i =0;i<sizeof(arWearrFlag)/sizeof(arWearrFlag[0]);i++) {
string tempString = arWearrFlag[i];
for (int j=0; j<30 ; j++) //ĂÖ´ë 30°ł ´Üľî±îÁö. (ÇϵĺÄÚµů)
{
string tempString2 = arInputString[j];
if (tempString2.compare(tempString)==0) { //ŔĎġÇĎ´ÂÁö Č®ŔÎ.
retValue = retValue + pow((float)2,(float)i);
}
 
if(tempString2.compare("") == 0)
break;
}
}
delete []arInputString;
//cout << "WearFlag : " << wearFlagStr << " -> " << retValue << endl;
 
return retValue;
}
 
int get_Item_Immune_Value(string inputString) 
{
 
string arImmune[] = {"PARA","CURSE","STUN","SLEEP","SLOW","POISON","TERROR"};
 
int retValue = 0;
string* arInputString = StringSplit(inputString, "|"); //ÇÁ·ÎĹä Á¤ş¸ ł»żëŔ» ´Üľîş°·Î Âɰµ ąčż­.
for(int i =0;i<sizeof(arImmune)/sizeof(arImmune[0]);i++) {
string tempString = arImmune[i];
for (int j=0; j<30 ; j++) //ĂÖ´ë 30°ł ´Üľî±îÁö. (ÇϵĺÄÚµů)
{
string tempString2 = arInputString[j];
if (tempString2.compare(tempString)==0) { //ŔĎġÇĎ´ÂÁö Č®ŔÎ.
retValue = retValue + pow((float)2,(float)i);
}
 
if(tempString2.compare("") == 0)
break;
}
}
delete []arInputString;
//cout << "Immune : " << immuneStr << " -> " << retValue << endl;
 
return retValue;
}
 
 
 
 
int get_Item_LimitType_Value(string inputString)
{
string arLimitType[] = {"LIMIT_NONE", "LEVEL", "STR", "DEX", "INT", "CON", "PC_BANG", "REAL_TIME", "REAL_TIME_FIRST_USE", "TIMER_BASED_ON_WEAR"};
 
int retInt = -1;
//cout << "LimitType : " << limitTypeStr << " -> ";
for (int j=0;j<sizeof(arLimitType)/sizeof(arLimitType[0]);j++) {
string tempString = arLimitType[j];
string tempInputString = trim(inputString);
if (tempInputString.compare(tempString)==0)
{
//cout << j << " ";
retInt =  j;
break;
}
}
//cout << endl;
 
return retInt;
}
 
 
int get_Item_ApplyType_Value(string inputString)
{
string arApplyType[] = {"APPLY_NONE", "APPLY_MAX_HP", "APPLY_MAX_SP", "APPLY_CON", "APPLY_INT", "APPLY_STR", "APPLY_DEX", "APPLY_ATT_SPEED",
"APPLY_MOV_SPEED", "APPLY_CAST_SPEED", "APPLY_HP_REGEN", "APPLY_SP_REGEN", "APPLY_POISON_PCT", "APPLY_STUN_PCT",
"APPLY_SLOW_PCT", "APPLY_CRITICAL_PCT", "APPLY_PENETRATE_PCT", "APPLY_ATTBONUS_HUMAN", "APPLY_ATTBONUS_ANIMAL",
"APPLY_ATTBONUS_ORC", "APPLY_ATTBONUS_MILGYO", "APPLY_ATTBONUS_UNDEAD", "APPLY_ATTBONUS_DEVIL", "APPLY_STEAL_HP",
"APPLY_STEAL_SP", "APPLY_MANA_BURN_PCT", "APPLY_DAMAGE_SP_RECOVER", "APPLY_BLOCK", "APPLY_DODGE", "APPLY_RESIST_SWORD",
"APPLY_RESIST_TWOHAND", "APPLY_RESIST_DAGGER", "APPLY_RESIST_BELL", "APPLY_RESIST_FAN", "APPLY_RESIST_BOW", "APPLY_RESIST_FIRE",
"APPLY_RESIST_ELEC", "APPLY_RESIST_MAGIC", "APPLY_RESIST_WIND", "APPLY_REFLECT_MELEE", "APPLY_REFLECT_CURSE", "APPLY_POISON_REDUCE",
"APPLY_KILL_SP_RECOVER", "APPLY_EXP_DOUBLE_BONUS", "APPLY_GOLD_DOUBLE_BONUS", "APPLY_ITEM_DROP_BONUS", "APPLY_POTION_BONUS",
"APPLY_KILL_HP_RECOVER", "APPLY_IMMUNE_STUN", "APPLY_IMMUNE_SLOW", "APPLY_IMMUNE_FALL", "APPLY_SKILL", "APPLY_BOW_DISTANCE",
"APPLY_ATT_GRADE_BONUS", "APPLY_DEF_GRADE_BONUS", "APPLY_MAGIC_ATT_GRADE", "APPLY_MAGIC_DEF_GRADE", "APPLY_CURSE_PCT",
"APPLY_MAX_STAMINA", "APPLY_ATTBONUS_WARRIOR", "APPLY_ATTBONUS_ASSASSIN", "APPLY_ATTBONUS_SURA", "APPLY_ATTBONUS_SHAMAN",
"APPLY_ATTBONUS_MONSTER", "APPLY_MALL_ATTBONUS", "APPLY_MALL_DEFBONUS", "APPLY_MALL_EXPBONUS", "APPLY_MALL_ITEMBONUS",
"APPLY_MALL_GOLDBONUS", "APPLY_MAX_HP_PCT", "APPLY_MAX_SP_PCT", "APPLY_SKILL_DAMAGE_BONUS", "APPLY_NORMAL_HIT_DAMAGE_BONUS",
"APPLY_SKILL_DEFEND_BONUS", "APPLY_NORMAL_HIT_DEFEND_BONUS", "APPLY_PC_BANG_EXP_BONUS", "APPLY_PC_BANG_DROP_BONUS",
"APPLY_EXTRACT_HP_PCT", "APPLY_RESIST_WARRIOR", "APPLY_RESIST_ASSASSIN", "APPLY_RESIST_SURA", "APPLY_RESIST_SHAMAN",
"APPLY_ENERGY", "APPLY_DEF_GRADE", "APPLY_COSTUME_ATTR_BONUS", "APPLY_MAGIC_ATTBONUS_PER", "APPLY_MELEE_MAGIC_ATTBONUS_PER",
"APPLY_RESIST_ICE", "APPLY_RESIST_EARTH", "APPLY_RESIST_DARK", "APPLY_ANTI_CRITICAL_PCT", "APPLY_ANTI_PENETRATE_PCT",
};
 
int retInt = -1;
//cout << "ApplyType : " << applyTypeStr << " -> ";
for (int j=0;j<sizeof(arApplyType)/sizeof(arApplyType[0]);j++) {
string tempString = arApplyType[j];
string tempInputString = trim(inputString);
if (tempInputString.compare(tempString)==0)
{ 
//cout << j << " ";
retInt =  j;
break;
}
}
//cout << endl;
 
return retInt;
 
}
 
 
//¸ó˝şĹÍ ÇÁ·ÎĹäµµ Ŕд´Ů.
 
 
int get_Mob_Rank_Value(string inputString) 
{
string arRank[] = {"PAWN", "S_PAWN", "KNIGHT", "S_KNIGHT", "BOSS", "KING"};
 
int retInt = -1;
//cout << "Rank : " << rankStr << " -> ";
for (int j=0;j<sizeof(arRank)/sizeof(arRank[0]);j++) {
string tempString = arRank[j];
string tempInputString = trim(inputString);
if (tempInputString.compare(tempString)==0) 
{
//cout << j << " ";
retInt =  j;
break;
}
}
//cout << endl;
 
return retInt;
}
 
 
int get_Mob_Type_Value(string inputString)
{
string arType[] = { "MONSTER", "NPC", "STONE", "WARP", "DOOR", "BUILDING", "PC", "POLYMORPH_PC", "HORSE", "GOTO"};
 
int retInt = -1;
//cout << "Type : " << typeStr << " -> ";
for (int j=0;j<sizeof(arType)/sizeof(arType[0]);j++) {
string tempString = arType[j];
string tempInputString = trim(inputString);
if (tempInputString.compare(tempString)==0) 
{
//cout << j << " ";
retInt =  j;
break;
}
}
//cout << endl;
 
return retInt;
}
 
int get_Mob_BattleType_Value(string inputString) 
{
string arBattleType[] = { "MELEE", "RANGE", "MAGIC", "SPECIAL", "POWER", "TANKER", "SUPER_POWER", "SUPER_TANKER"};
 
int retInt = -1;
//cout << "Battle Type : " << battleTypeStr << " -> ";
for (int j=0;j<sizeof(arBattleType)/sizeof(arBattleType[0]);j++) {
string tempString = arBattleType[j];
string tempInputString = trim(inputString);
if (tempInputString.compare(tempString)==0) 
{ 
//cout << j << " ";
retInt =  j;
break;
}
}
//cout << endl;
 
return retInt;
}
 
int get_Mob_Size_Value(string inputString)
{
string arSize[] = { "SAMLL", "MEDIUM", "BIG"};
 
int retInt = 0;
//cout << "Size : " << sizeStr << " -> ";
for (int j=0;j<sizeof(arSize)/sizeof(arSize[0]);j++) {
string tempString = arSize[j];
string tempInputString = trim(inputString);
if (tempInputString.compare(tempString)==0) 
{
//cout << j << " ";
retInt =  j + 1;
break;
}
}
//cout << endl;
 
return retInt;
}
 
int get_Mob_AIFlag_Value(string inputString)
{
string arAIFlag[] = {"AGGR","NOMOVE","COWARD","NOATTSHINSU","NOATTCHUNJO","NOATTJINNO","ATTMOB","BERSERK","STONESKIN","GODSPEED","DEATHBLOW","REVIVE"};
 
 
int retValue = 0;
string* arInputString = StringSplit(inputString, ","); //ÇÁ·ÎĹä Á¤ş¸ ł»żëŔ» ´Üľîş°·Î Âɰµ ąčż­.
for(int i =0;i<sizeof(arAIFlag)/sizeof(arAIFlag[0]);i++) {
string tempString = arAIFlag[i];
for (int j=0; j<30 ; j++) //ĂÖ´ë 30°ł ´Üľî±îÁö. (ÇϵĺÄÚµů)
{
string tempString2 = arInputString[j];
if (tempString2.compare(tempString)==0) { //ŔĎġÇĎ´ÂÁö Č®ŔÎ.
retValue = retValue + pow((float)2,(float)i);
}
 
if(tempString2.compare("") == 0)
break;
}
}
delete []arInputString;
//cout << "AIFlag : " << aiFlagStr << " -> " << retValue << endl;
 
return retValue;
}
int get_Mob_RaceFlag_Value(string inputString)
{
string arRaceFlag[] = {"ANIMAL","UNDEAD","DEVIL","HUMAN","ORC","MILGYO","INSECT","FIRE","ICE","DESERT","TREE",
"ATT_ELEC","ATT_FIRE","ATT_ICE","ATT_WIND","ATT_EARTH","ATT_DARK"};
 
int retValue = 0;
string* arInputString = StringSplit(inputString, ","); //ÇÁ·ÎĹä Á¤ş¸ ł»żëŔ» ´Üľîş°·Î Âɰµ ąčż­.
for(int i =0;i<sizeof(arRaceFlag)/sizeof(arRaceFlag[0]);i++) {
string tempString = arRaceFlag[i];
for (int j=0; j<30 ; j++) //ĂÖ´ë 30°ł ´Üľî±îÁö. (ÇϵĺÄÚµů)
{
string tempString2 = arInputString[j];
if (tempString2.compare(tempString)==0) { //ŔĎġÇĎ´ÂÁö Č®ŔÎ.
retValue = retValue + pow((float)2,(float)i);
}
 
if(tempString2.compare("") == 0)
break;
}
}
delete []arInputString;
//cout << "Race Flag : " << raceFlagStr << " -> " << retValue << endl;
 
return retValue;
}
int get_Mob_ImmuneFlag_Value(string inputString)
{
string arImmuneFlag[] = {"STUN","SLOW","FALL","CURSE","POISON","TERROR", "REFLECT"};
 
int retValue = 0;
string* arInputString = StringSplit(inputString, ","); //ÇÁ·ÎĹä Á¤ş¸ ł»żëŔ» ´Üľîş°·Î Âɰµ ąčż­.
for(int i =0;i<sizeof(arImmuneFlag)/sizeof(arImmuneFlag[0]);i++) {
string tempString = arImmuneFlag[i];
for (int j=0; j<30 ; j++) //ĂÖ´ë 30°ł ´Üľî±îÁö. (ÇϵĺÄÚµů)
{
string tempString2 = arInputString[j];
if (tempString2.compare(tempString)==0) { //ŔĎġÇĎ´ÂÁö Č®ŔÎ.
retValue = retValue + pow((float)2,(float)i);
}
 
if(tempString2.compare("") == 0)
break;
}
}
delete []arInputString;
//cout << "Immune Flag : " << immuneFlagStr << " -> " << retValue << endl;
 
 
return retValue;
}
 
 
#ifndef __DUMP_PROTO__
 
//¸÷ Ĺ×ŔĚşíŔ» ĽÂĆĂÇŘÁŘ´Ů.
bool Set_Proto_Mob_Table(TMobTable *mobTable, cCsvTable &csvTable,std::map<int,const char*> &nameMap)
{
int col = 0;
str_to_number(mobTable->dwVnum, csvTable.AsStringByIndex(col++));
strlcpy(mobTable->szName, csvTable.AsStringByIndex(col++), sizeof(mobTable->szName));
 
//3. ÁöżŞş° Ŕ̸§ łÖľîÁÖ±â.
map<int,const char*>::iterator it;
it = nameMap.find(mobTable->dwVnum);
if (it != nameMap.end()) {
const char * localeName = it->second;
strlcpy(mobTable->szLocaleName, localeName, sizeof (mobTable->szLocaleName));
} else {
strlcpy(mobTable->szLocaleName, mobTable->szName, sizeof (mobTable->szLocaleName));
}
 
//RANK
int rankValue = get_Mob_Rank_Value(csvTable.AsStringByIndex(col++));
mobTable->bRank = rankValue;
//TYPE
int typeValue = get_Mob_Type_Value(csvTable.AsStringByIndex(col++));
mobTable->bType = typeValue;
//BATTLE_TYPE
int battleTypeValue = get_Mob_BattleType_Value(csvTable.AsStringByIndex(col++));
mobTable->bBattleType = battleTypeValue;
 
str_to_number(mobTable->bLevel, csvTable.AsStringByIndex(col++));
//SIZE
int sizeValue = get_Mob_Size_Value(csvTable.AsStringByIndex(col++));
mobTable->bSize = sizeValue;
//AI_FLAG
int aiFlagValue = get_Mob_AIFlag_Value(csvTable.AsStringByIndex(col++));
mobTable->dwAIFlag = aiFlagValue;
//mount_capacity;
col++;
//RACE_FLAG
int raceFlagValue = get_Mob_RaceFlag_Value(csvTable.AsStringByIndex(col++));
mobTable->dwRaceFlag = raceFlagValue;
//IMMUNE_FLAG
int immuneFlagValue = get_Mob_ImmuneFlag_Value(csvTable.AsStringByIndex(col++));
mobTable->dwImmuneFlag = immuneFlagValue;
 
str_to_number(mobTable->bEmpire, csvTable.AsStringByIndex(col++));  //col = 11
 
strlcpy(mobTable->szFolder, csvTable.AsStringByIndex(col++), sizeof(mobTable->szFolder));
 
str_to_number(mobTable->bOnClickType, csvTable.AsStringByIndex(col++)); 
 
str_to_number(mobTable->bStr, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->bDex, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->bCon, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->bInt, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->dwDamageRange[0], csvTable.AsStringByIndex(col++));
str_to_number(mobTable->dwDamageRange[1], csvTable.AsStringByIndex(col++));
str_to_number(mobTable->dwMaxHP, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->bRegenCycle, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->bRegenPercent, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->dwGoldMin, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->dwGoldMax, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->dwExp, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->wDef, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->sAttackSpeed, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->sMovingSpeed, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->bAggresiveHPPct, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->wAggressiveSight, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->wAttackRange, csvTable.AsStringByIndex(col++));
 
str_to_number(mobTable->dwDropItemVnum, csvTable.AsStringByIndex(col++)); //32
str_to_number(mobTable->dwResurrectionVnum, csvTable.AsStringByIndex(col++));
for (int i = 0; i < MOB_ENCHANTS_MAX_NUM; ++i)
str_to_number(mobTable->cEnchants[i], csvTable.AsStringByIndex(col++));
 
for (int i = 0; i < MOB_RESISTS_MAX_NUM; ++i)
str_to_number(mobTable->cResists[i], csvTable.AsStringByIndex(col++));
 
str_to_number(mobTable->fDamMultiply, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->dwSummonVnum, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->dwDrainSP, csvTable.AsStringByIndex(col++));
 
//Mob_Color
++col;
 
str_to_number(mobTable->dwPolymorphItemVnum, csvTable.AsStringByIndex(col++));
 
str_to_number(mobTable->Skills[0].bLevel, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->Skills[0].dwVnum, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->Skills[1].bLevel, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->Skills[1].dwVnum, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->Skills[2].bLevel, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->Skills[2].dwVnum, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->Skills[3].bLevel, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->Skills[3].dwVnum, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->Skills[4].bLevel, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->Skills[4].dwVnum, csvTable.AsStringByIndex(col++));
 
str_to_number(mobTable->bBerserkPoint, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->bStoneSkinPoint, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->bGodSpeedPoint, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->bDeathBlowPoint, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->bRevivePoint, csvTable.AsStringByIndex(col++));
 
sys_log(0, "MOB #%-5d %-24s level: %-3u rank: %u empire: %d", mobTable->dwVnum, mobTable->szLocaleName, mobTable->bLevel, mobTable->bRank, mobTable->bEmpire);
 
return true;
}
 
bool Set_Proto_Item_Table(TItemTable *itemTable, cCsvTable &csvTable,std::map<int,const char*> &nameMap)
{
int col = 0;
 
int dataArray[33];
for (int i=0; i<sizeof(dataArray)/sizeof(dataArray[0]);i++) {
int validCheck = 0;
if (i==2) {
dataArray[i] = get_Item_Type_Value(csvTable.AsStringByIndex(col));
validCheck = dataArray[i];
} else if (i==3) {
dataArray[i] = get_Item_SubType_Value(dataArray[i-1], csvTable.AsStringByIndex(col));
validCheck = dataArray[i];
} else if (i==5) {
dataArray[i] = get_Item_AntiFlag_Value(csvTable.AsStringByIndex(col));
validCheck = dataArray[i];
} else if (i==6) {
dataArray[i] = get_Item_Flag_Value(csvTable.AsStringByIndex(col));
validCheck = dataArray[i];
} else if (i==7) {
dataArray[i] = get_Item_WearFlag_Value(csvTable.AsStringByIndex(col));
validCheck = dataArray[i];
} else if (i==8) {
dataArray[i] = get_Item_Immune_Value(csvTable.AsStringByIndex(col));
validCheck = dataArray[i];
} else if (i==14) {
dataArray[i] = get_Item_LimitType_Value(csvTable.AsStringByIndex(col));
validCheck = dataArray[i];
} else if (i==16) {
dataArray[i] = get_Item_LimitType_Value(csvTable.AsStringByIndex(col));
validCheck = dataArray[i];
} else if (i==18) {
dataArray[i] = get_Item_ApplyType_Value(csvTable.AsStringByIndex(col));
validCheck = dataArray[i];
} else if (i==20) {
dataArray[i] = get_Item_ApplyType_Value(csvTable.AsStringByIndex(col));
validCheck = dataArray[i];
} else if (i==22) {
dataArray[i] = get_Item_ApplyType_Value(csvTable.AsStringByIndex(col));
validCheck = dataArray[i];
} else {
str_to_number(dataArray[i], csvTable.AsStringByIndex(col));
}
 
if (validCheck == -1)
{
std::ostringstream dataStream;
 
for (int j = 0; j < i; ++j)
dataStream << dataArray[j] << ",";
 
//fprintf(stderr, "ItemProto Reading Failed : Invalid value.\n");
sys_err("ItemProto Reading Failed : Invalid value. (index: %d, col: %d, value: %s)", i, col, csvTable.AsStringByIndex(col));
sys_err("\t%d ~ %d Values: %s", 0, i, dataStream.str().c_str());
 
exit(0);
}
 
col = col + 1;
}
 
// vnum ą× vnum range Ŕбâ.
{
std::string s(csvTable.AsStringByIndex(0));
int pos = s.find("~");
// vnum Çʵ忡 '~'°ˇ ľř´Ů¸é ĆĐ˝ş
if (std::string::npos == pos)
{
itemTable->dwVnum = dataArray[0];
itemTable->dwVnumRange = 0;
}
else
{
std::string s_start_vnum (s.substr(0, pos));
std::string s_end_vnum (s.substr(pos +1 ));
 
int start_vnum = atoi(s_start_vnum.c_str());
int end_vnum = atoi(s_end_vnum.c_str());
if (0 == start_vnum || (0 != end_vnum && end_vnum < start_vnum))
{
sys_err ("INVALID VNUM %s", s.c_str());
return false;
}
itemTable->dwVnum = start_vnum;
itemTable->dwVnumRange = end_vnum - start_vnum;
}
}
 
strlcpy(itemTable->szName, csvTable.AsStringByIndex(1), sizeof(itemTable->szName));
//ÁöżŞş° Ŕ̸§ łÖľîÁÖ±â.
map<int,const char*>::iterator it;
it = nameMap.find(itemTable->dwVnum);
if (it != nameMap.end()) {
const char * localeName = it->second;
strlcpy(itemTable->szLocaleName, localeName, sizeof (itemTable->szLocaleName));
} else {
strlcpy(itemTable->szLocaleName, itemTable->szName, sizeof (itemTable->szLocaleName));
}
itemTable->bType = dataArray[2];
itemTable->bSubType = dataArray[3];
itemTable->bSize = dataArray[4];
itemTable->dwAntiFlags = dataArray[5];
itemTable->dwFlags = dataArray[6];
itemTable->dwWearFlags = dataArray[7];
itemTable->dwImmuneFlag = dataArray[8];
itemTable->dwGold = dataArray[9];
itemTable->dwShopBuyPrice = dataArray[10];
itemTable->dwRefinedVnum = dataArray[11];
itemTable->wRefineSet = dataArray[12];
itemTable->bAlterToMagicItemPct = dataArray[13];
itemTable->cLimitRealTimeFirstUseIndex = -1;
itemTable->cLimitTimerBasedOnWearIndex = -1;
 
int i;
 
for (i = 0; i < ITEM_LIMIT_MAX_NUM; ++i)
{
itemTable->aLimits[i].bType = dataArray[14+i*2];
itemTable->aLimits[i].lValue = dataArray[15+i*2];
 
if (LIMIT_REAL_TIME_START_FIRST_USE == itemTable->aLimits[i].bType)
itemTable->cLimitRealTimeFirstUseIndex = (char)i;
 
if (LIMIT_TIMER_BASED_ON_WEAR == itemTable->aLimits[i].bType)
itemTable->cLimitTimerBasedOnWearIndex = (char)i;
 
}
 
for (i = 0; i < ITEM_APPLY_MAX_NUM; ++i)
{
itemTable->aApplies[i].bType = dataArray[18+i*2];
itemTable->aApplies[i].lValue = dataArray[19+i*2];
}
 
for (i = 0; i < ITEM_VALUES_MAX_NUM; ++i)
itemTable->alValues[i] = dataArray[24+i];
 
//column for 'Specular'
itemTable->bGainSocketPct = dataArray[31];
itemTable->sAddonType = dataArray[32];
 
//test
str_to_number(itemTable->bWeight, "0");
 
return true;
}
 
#endif

 

Akurat funkcja str_to_number uzywa strtoul, sprawdz ten kod

http://hastebin.com/milanexici.hs

@alchemik1 Co ty to za serwer upodobniony do Pandory robisz :O?

 

ps. sorry za offtop xD

Swoj, niebawem zapowiedz. Akurat klimat starego serwera bedzie prawdziwy bo az sam bym w niego zagral

 

@ZoneWar.pl

Bedzie bo serwer gotowy tylko interfejsy koduje

ban.gif

 

Opublikowano

 

 

 

Pokaz swoje ProtoReader.cpp bo normalnie masz 

strtol(string_from_row(row[col], length[col]).c_str(), NULL, 10)

 

 

#include "stdafx.h"
 
#include <math.h>
#include "ProtoReader.h"
 
#include "CsvReader.h"
 
#include <sstream>
 
using namespace std;
 
inline string trim_left(const string& str)
{
    string::size_type n = str.find_first_not_of(" \t\v\n\r");
    return n == string::npos ? str : str.substr(n, str.length());
}
 
inline string trim_right(const string& str)
{
    string::size_type n = str.find_last_not_of(" \t\v\n\r");
    return n == string::npos ? str : str.substr(0, n + 1);
}
 
string trim(const string& str){return trim_left(trim_right(str));}
 
static string* StringSplit(string strOrigin, string strTok)
{
    int     cutAt;                            //ŔÚ¸Ł´ÂŔ§Äˇ
    int     index     = 0;                    //ą®ŔÚż­Ŕε¦˝ş
    string* strResult = new string[30];   //°á°úreturn ÇŇşŻĽö
 
    //strTokŔ»ĂŁŔ»¶§±îÁöąÝşą
    while ((cutAt = strOrigin.find_first_of(strTok)) != strOrigin.npos)
    {
       if (cutAt > 0)  //ŔÚ¸Ł´ÂŔ§Äˇ°ˇ0ş¸´ŮĹ©¸é(Ľş°ř˝Ă)
       {
            strResult[index++] = strOrigin.substr(0, cutAt);  //°á°úąčż­żˇĂß°ˇ
       }
       strOrigin = strOrigin.substr(cutAt+1);  //żřş»ŔşŔÚ¸ĄşÎşĐÁ¦żÜÇŃłŞ¸ÓÁö
    }
 
    if(strOrigin.length() > 0)  //żřş»ŔĚľĆÁ÷ł˛ľŇŔ¸¸é
    {
        strResult[index++] = strOrigin.substr(0, cutAt);  //łŞ¸ÓÁö¸¦°á°úąčż­żˇĂß°ˇ
    }
 
for( int i=0;i<index;i++)
{
strResult[i] = trim(strResult[i]);
}
 
    return strResult;  //°á°úreturn
}
 
 
 
int get_Item_Type_Value(string inputString)
{
string arType[] = {"ITEM_NONE", "ITEM_WEAPON",
"ITEM_ARMOR", "ITEM_USE", 
"ITEM_AUTOUSE", "ITEM_MATERIAL",
"ITEM_SPECIAL", "ITEM_TOOL", 
"ITEM_LOTTERY", "ITEM_ELK", //10°ł
 
"ITEM_METIN", "ITEM_CONTAINER", 
"ITEM_FISH", "ITEM_ROD", 
"ITEM_RESOURCE", "ITEM_CAMPFIRE",
"ITEM_UNIQUE", "ITEM_SKILLBOOK", 
"ITEM_QUEST", "ITEM_POLYMORPH", //20°ł
 
"ITEM_TREASURE_BOX", "ITEM_TREASURE_KEY",
"ITEM_SKILLFORGET", "ITEM_GIFTBOX", 
"ITEM_PICK", "ITEM_HAIR", 
"ITEM_TOTEM", "ITEM_BLEND", 
"ITEM_COSTUME", "ITEM_DS", //30°ł
 
"ITEM_SPECIAL_DS", "ITEM_EXTRACT",
"ITEM_SECONDARY_COIN", //33°ł
 
"ITEM_RING",
"ITEM_BELT", //35°ł (EItemTypes °ŞŔ¸·Î ġ¸é 34)
};
 
 
int retInt = -1;
//cout << "Type : " << typeStr << " -> ";
for (int j=0;j<sizeof(arType)/sizeof(arType[0]);j++) {
string tempString = arType[j];
if (inputString.find(tempString)!=string::npos && tempString.find(inputString)!=string::npos) {
//cout << j << " ";
retInt =  j;
break;
}
}
//cout << endl;
 
return retInt;
 
}
 
int get_Item_SubType_Value(int type_value, string inputString) 
{
static string arSub1[] = { "WEAPON_SWORD", "WEAPON_DAGGER", "WEAPON_BOW", "WEAPON_TWO_HANDED",
"WEAPON_BELL", "WEAPON_FAN", "WEAPON_ARROW", "WEAPON_MOUNT_SPEAR"};
static string arSub2[] = { "ARMOR_BODY", "ARMOR_HEAD", "ARMOR_SHIELD", "ARMOR_WRIST", "ARMOR_FOOTS",
"ARMOR_NECK", "ARMOR_EAR", "ARMOR_NUM_TYPES"};
static string arSub3[] = { "USE_POTION", "USE_TALISMAN", "USE_TUNING", "USE_MOVE", "USE_TREASURE_BOX", "USE_MONEYBAG", "USE_BAIT",
"USE_ABILITY_UP", "USE_AFFECT", "USE_CREATE_STONE", "USE_SPECIAL", "USE_POTION_NODELAY", "USE_CLEAR",
"USE_INVISIBILITY", "USE_DETACHMENT", "USE_BUCKET", "USE_POTION_CONTINUE", "USE_CLEAN_SOCKET",
"USE_CHANGE_ATTRIBUTE", "USE_ADD_ATTRIBUTE", "USE_ADD_ACCESSORY_SOCKET", "USE_PUT_INTO_ACCESSORY_SOCKET",
"USE_ADD_ATTRIBUTE2", "USE_RECIPE", "USE_CHANGE_ATTRIBUTE2", "USE_BIND", "USE_UNBIND", "USE_TIME_CHARGE_PER", "USE_TIME_CHARGE_FIX", "USE_PUT_INTO_BELT_SOCKET", "USE_PUT_INTO_RING_SOCKET"};
static string arSub4[] = { "AUTOUSE_POTION", "AUTOUSE_ABILITY_UP", "AUTOUSE_BOMB", "AUTOUSE_GOLD", "AUTOUSE_MONEYBAG", "AUTOUSE_TREASURE_BOX"};
static string arSub5[] = { "MATERIAL_LEATHER", "MATERIAL_BLOOD", "MATERIAL_ROOT", "MATERIAL_NEEDLE", "MATERIAL_JEWEL", 
"MATERIAL_DS_REFINE_NORMAL", "MATERIAL_DS_REFINE_BLESSED", "MATERIAL_DS_REFINE_HOLLY"};
static string arSub6[] = { "SPECIAL_MAP", "SPECIAL_KEY", "SPECIAL_DOC", "SPECIAL_SPIRIT"};
static string arSub7[] = { "TOOL_FISHING_ROD" };
static string arSub8[] = { "LOTTERY_TICKET", "LOTTERY_INSTANT" };
static string arSub10[] = { "METIN_NORMAL", "METIN_GOLD" };
static string arSub12[] = { "FISH_ALIVE", "FISH_DEAD"};
static string arSub14[] = { "RESOURCE_FISHBONE", "RESOURCE_WATERSTONEPIECE", "RESOURCE_WATERSTONE", "RESOURCE_BLOOD_PEARL",
"RESOURCE_BLUE_PEARL", "RESOURCE_WHITE_PEARL", "RESOURCE_BUCKET", "RESOURCE_CRYSTAL", "RESOURCE_GEM",
"RESOURCE_STONE", "RESOURCE_METIN", "RESOURCE_ORE" };
static string arSub16[] = { "UNIQUE_NONE", "UNIQUE_BOOK", "UNIQUE_SPECIAL_RIDE", "UNIQUE_3", "UNIQUE_4", "UNIQUE_5",
"UNIQUE_6", "UNIQUE_7", "UNIQUE_8", "UNIQUE_9", "USE_SPECIAL"};
static string arSub28[] = { "COSTUME_BODY", "COSTUME_HAIR" };
static string arSub29[] = { "DS_SLOT1", "DS_SLOT2", "DS_SLOT3", "DS_SLOT4", "DS_SLOT5", "DS_SLOT6" };
static string arSub31[] = { "EXTRACT_DRAGON_SOUL", "EXTRACT_DRAGON_HEART" };
 
static string* arSubType[] = {0, //0
arSub1, //1
arSub2, //2
arSub3, //3
arSub4, //4
arSub5, //5
arSub6, //6
arSub7, //7
arSub8, //8
0, //9
arSub10, //10
0, //11
arSub12, //12
0, //13
arSub14, //14
0, //15
arSub16, //16
0, //17
0, //18
0, //19
0, //20
0, //21
0, //22
0, //23
0, //24
0, //25
0, //26
0, //27
arSub28, //28
arSub29, //29
arSub29, //30
arSub31, //31
0, //32
0, //33 ąÝÁö
0, //34 ş§Ć®
};
static int arNumberOfSubtype[_countof(arSubType)] = {
0,
sizeof(arSub1)/sizeof(arSub1[0]),
sizeof(arSub2)/sizeof(arSub2[0]),
sizeof(arSub3)/sizeof(arSub3[0]),
sizeof(arSub4)/sizeof(arSub4[0]),
sizeof(arSub5)/sizeof(arSub5[0]),
sizeof(arSub6)/sizeof(arSub6[0]),
sizeof(arSub7)/sizeof(arSub7[0]),
sizeof(arSub8)/sizeof(arSub8[0]),
0,
sizeof(arSub10)/sizeof(arSub10[0]),
0,
sizeof(arSub12)/sizeof(arSub12[0]),
0,
sizeof(arSub14)/sizeof(arSub14[0]),
0,
sizeof(arSub16)/sizeof(arSub16[0]),
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
sizeof(arSub28)/sizeof(arSub28[0]),
sizeof(arSub29)/sizeof(arSub29[0]),
sizeof(arSub29)/sizeof(arSub29[0]),
sizeof(arSub31)/sizeof(arSub31[0]),
0, // 32
0, // 33 ąÝÁö
0, // 34 ş§Ć®
};
 
 
assert(_countof(arSubType) > type_value && "Subtype rule: Out of range!!");
 
// assert ľČ ¸ÔČ÷´Â µí..
if (_countof(arSubType) <= type_value)
{
sys_err("SubType : Out of range!! (type_value: %d, count of registered subtype: %d", type_value, _countof(arSubType));
return -1;
}
 
//ľĆŔĚĹŰ Ĺ¸ŔÔŔÇ Ľ­şęŸŔÔ ľî·ąŔ̰ˇ Á¸ŔçÇĎ´ÂÁö ľËľĆş¸°í, ľřŔ¸¸é 0 ¸®ĹĎ
if (arSubType[type_value]==0) {
return 0;
}
//
 
int retInt = -1;
//cout << "SubType : " << subTypeStr << " -> ";
for (int j=0;j<arNumberOfSubtype[type_value];j++) {
string tempString = arSubType[type_value][j];
string tempInputString = trim(inputString);
if (tempInputString.compare(tempString)==0)
{
//cout << j << " ";
retInt =  j;
break;
}
}
//cout << endl;
 
return retInt;
}
 
 
 
 
 
int get_Item_AntiFlag_Value(string inputString) 
{
 
string arAntiFlag[] = {"ANTI_FEMALE", "ANTI_MALE", "ANTI_MUSA", "ANTI_ASSASSIN", "ANTI_SURA", "ANTI_MUDANG",
"ANTI_GET", "ANTI_DROP", "ANTI_SELL", "ANTI_EMPIRE_A", "ANTI_EMPIRE_B", "ANTI_EMPIRE_C",
"ANTI_SAVE", "ANTI_GIVE", "ANTI_PKDROP", "ANTI_STACK", "ANTI_MYSHOP", "ANTI_SAFEBOX"};
 
 
int retValue = 0;
string* arInputString = StringSplit(inputString, "|"); //ÇÁ·ÎĹä Á¤ş¸ ł»żëŔ» ´Üľîş°·Î Âɰµ ąčż­.
for(int i =0;i<sizeof(arAntiFlag)/sizeof(arAntiFlag[0]);i++) {
string tempString = arAntiFlag[i];
for (int j=0; j<30 ; j++) //ĂÖ´ë 30°ł ´Üľî±îÁö. (ÇϵĺÄÚµů)
{
string tempString2 = arInputString[j];
if (tempString2.compare(tempString)==0) { //ŔĎġÇĎ´ÂÁö Č®ŔÎ.
retValue = retValue + pow((float)2,(float)i);
}
 
if(tempString2.compare("") == 0)
break;
}
}
delete []arInputString;
//cout << "AntiFlag : " << antiFlagStr << " -> " << retValue << endl;
 
return retValue;
}
 
int get_Item_Flag_Value(string inputString) 
{
 
string arFlag[] = {"ITEM_TUNABLE", "ITEM_SAVE", "ITEM_STACKABLE", "COUNT_PER_1GOLD", "ITEM_SLOW_QUERY", "ITEM_UNIQUE",
"ITEM_MAKECOUNT", "ITEM_IRREMOVABLE", "CONFIRM_WHEN_USE", "QUEST_USE", "QUEST_USE_MULTIPLE",
"QUEST_GIVE", "ITEM_QUEST", "LOG", "STACKABLE", "SLOW_QUERY", "REFINEABLE", "IRREMOVABLE", "ITEM_APPLICABLE"};
 
 
int retValue = 0;
string* arInputString = StringSplit(inputString, "|"); //ÇÁ·ÎĹä Á¤ş¸ ł»żëŔ» ´Üľîş°·Î Âɰµ ąčż­.
for(int i =0;i<sizeof(arFlag)/sizeof(arFlag[0]);i++) {
string tempString = arFlag[i];
for (int j=0; j<30 ; j++) //ĂÖ´ë 30°ł ´Üľî±îÁö. (ÇϵĺÄÚµů)
{
string tempString2 = arInputString[j];
if (tempString2.compare(tempString)==0) { //ŔĎġÇĎ´ÂÁö Č®ŔÎ.
retValue = retValue + pow((float)2,(float)i);
}
 
if(tempString2.compare("") == 0)
break;
}
}
delete []arInputString;
//cout << "Flag : " << flagStr << " -> " << retValue << endl;
 
return retValue;
}
 
int get_Item_WearFlag_Value(string inputString) 
{
 
string arWearrFlag[] = {"WEAR_BODY", "WEAR_HEAD", "WEAR_FOOTS", "WEAR_WRIST", "WEAR_WEAPON", "WEAR_NECK", "WEAR_EAR", "WEAR_SHIELD", "WEAR_UNIQUE",
"WEAR_ARROW", "WEAR_HAIR", "WEAR_ABILITY"};
 
 
int retValue = 0;
string* arInputString = StringSplit(inputString, "|"); //ÇÁ·ÎĹä Á¤ş¸ ł»żëŔ» ´Üľîş°·Î Âɰµ ąčż­.
for(int i =0;i<sizeof(arWearrFlag)/sizeof(arWearrFlag[0]);i++) {
string tempString = arWearrFlag[i];
for (int j=0; j<30 ; j++) //ĂÖ´ë 30°ł ´Üľî±îÁö. (ÇϵĺÄÚµů)
{
string tempString2 = arInputString[j];
if (tempString2.compare(tempString)==0) { //ŔĎġÇĎ´ÂÁö Č®ŔÎ.
retValue = retValue + pow((float)2,(float)i);
}
 
if(tempString2.compare("") == 0)
break;
}
}
delete []arInputString;
//cout << "WearFlag : " << wearFlagStr << " -> " << retValue << endl;
 
return retValue;
}
 
int get_Item_Immune_Value(string inputString) 
{
 
string arImmune[] = {"PARA","CURSE","STUN","SLEEP","SLOW","POISON","TERROR"};
 
int retValue = 0;
string* arInputString = StringSplit(inputString, "|"); //ÇÁ·ÎĹä Á¤ş¸ ł»żëŔ» ´Üľîş°·Î Âɰµ ąčż­.
for(int i =0;i<sizeof(arImmune)/sizeof(arImmune[0]);i++) {
string tempString = arImmune[i];
for (int j=0; j<30 ; j++) //ĂÖ´ë 30°ł ´Üľî±îÁö. (ÇϵĺÄÚµů)
{
string tempString2 = arInputString[j];
if (tempString2.compare(tempString)==0) { //ŔĎġÇĎ´ÂÁö Č®ŔÎ.
retValue = retValue + pow((float)2,(float)i);
}
 
if(tempString2.compare("") == 0)
break;
}
}
delete []arInputString;
//cout << "Immune : " << immuneStr << " -> " << retValue << endl;
 
return retValue;
}
 
 
 
 
int get_Item_LimitType_Value(string inputString)
{
string arLimitType[] = {"LIMIT_NONE", "LEVEL", "STR", "DEX", "INT", "CON", "PC_BANG", "REAL_TIME", "REAL_TIME_FIRST_USE", "TIMER_BASED_ON_WEAR"};
 
int retInt = -1;
//cout << "LimitType : " << limitTypeStr << " -> ";
for (int j=0;j<sizeof(arLimitType)/sizeof(arLimitType[0]);j++) {
string tempString = arLimitType[j];
string tempInputString = trim(inputString);
if (tempInputString.compare(tempString)==0)
{
//cout << j << " ";
retInt =  j;
break;
}
}
//cout << endl;
 
return retInt;
}
 
 
int get_Item_ApplyType_Value(string inputString)
{
string arApplyType[] = {"APPLY_NONE", "APPLY_MAX_HP", "APPLY_MAX_SP", "APPLY_CON", "APPLY_INT", "APPLY_STR", "APPLY_DEX", "APPLY_ATT_SPEED",
"APPLY_MOV_SPEED", "APPLY_CAST_SPEED", "APPLY_HP_REGEN", "APPLY_SP_REGEN", "APPLY_POISON_PCT", "APPLY_STUN_PCT",
"APPLY_SLOW_PCT", "APPLY_CRITICAL_PCT", "APPLY_PENETRATE_PCT", "APPLY_ATTBONUS_HUMAN", "APPLY_ATTBONUS_ANIMAL",
"APPLY_ATTBONUS_ORC", "APPLY_ATTBONUS_MILGYO", "APPLY_ATTBONUS_UNDEAD", "APPLY_ATTBONUS_DEVIL", "APPLY_STEAL_HP",
"APPLY_STEAL_SP", "APPLY_MANA_BURN_PCT", "APPLY_DAMAGE_SP_RECOVER", "APPLY_BLOCK", "APPLY_DODGE", "APPLY_RESIST_SWORD",
"APPLY_RESIST_TWOHAND", "APPLY_RESIST_DAGGER", "APPLY_RESIST_BELL", "APPLY_RESIST_FAN", "APPLY_RESIST_BOW", "APPLY_RESIST_FIRE",
"APPLY_RESIST_ELEC", "APPLY_RESIST_MAGIC", "APPLY_RESIST_WIND", "APPLY_REFLECT_MELEE", "APPLY_REFLECT_CURSE", "APPLY_POISON_REDUCE",
"APPLY_KILL_SP_RECOVER", "APPLY_EXP_DOUBLE_BONUS", "APPLY_GOLD_DOUBLE_BONUS", "APPLY_ITEM_DROP_BONUS", "APPLY_POTION_BONUS",
"APPLY_KILL_HP_RECOVER", "APPLY_IMMUNE_STUN", "APPLY_IMMUNE_SLOW", "APPLY_IMMUNE_FALL", "APPLY_SKILL", "APPLY_BOW_DISTANCE",
"APPLY_ATT_GRADE_BONUS", "APPLY_DEF_GRADE_BONUS", "APPLY_MAGIC_ATT_GRADE", "APPLY_MAGIC_DEF_GRADE", "APPLY_CURSE_PCT",
"APPLY_MAX_STAMINA", "APPLY_ATTBONUS_WARRIOR", "APPLY_ATTBONUS_ASSASSIN", "APPLY_ATTBONUS_SURA", "APPLY_ATTBONUS_SHAMAN",
"APPLY_ATTBONUS_MONSTER", "APPLY_MALL_ATTBONUS", "APPLY_MALL_DEFBONUS", "APPLY_MALL_EXPBONUS", "APPLY_MALL_ITEMBONUS",
"APPLY_MALL_GOLDBONUS", "APPLY_MAX_HP_PCT", "APPLY_MAX_SP_PCT", "APPLY_SKILL_DAMAGE_BONUS", "APPLY_NORMAL_HIT_DAMAGE_BONUS",
"APPLY_SKILL_DEFEND_BONUS", "APPLY_NORMAL_HIT_DEFEND_BONUS", "APPLY_PC_BANG_EXP_BONUS", "APPLY_PC_BANG_DROP_BONUS",
"APPLY_EXTRACT_HP_PCT", "APPLY_RESIST_WARRIOR", "APPLY_RESIST_ASSASSIN", "APPLY_RESIST_SURA", "APPLY_RESIST_SHAMAN",
"APPLY_ENERGY", "APPLY_DEF_GRADE", "APPLY_COSTUME_ATTR_BONUS", "APPLY_MAGIC_ATTBONUS_PER", "APPLY_MELEE_MAGIC_ATTBONUS_PER",
"APPLY_RESIST_ICE", "APPLY_RESIST_EARTH", "APPLY_RESIST_DARK", "APPLY_ANTI_CRITICAL_PCT", "APPLY_ANTI_PENETRATE_PCT",
};
 
int retInt = -1;
//cout << "ApplyType : " << applyTypeStr << " -> ";
for (int j=0;j<sizeof(arApplyType)/sizeof(arApplyType[0]);j++) {
string tempString = arApplyType[j];
string tempInputString = trim(inputString);
if (tempInputString.compare(tempString)==0)
{ 
//cout << j << " ";
retInt =  j;
break;
}
}
//cout << endl;
 
return retInt;
 
}
 
 
//¸ó˝şĹÍ ÇÁ·ÎĹäµµ Ŕд´Ů.
 
 
int get_Mob_Rank_Value(string inputString) 
{
string arRank[] = {"PAWN", "S_PAWN", "KNIGHT", "S_KNIGHT", "BOSS", "KING"};
 
int retInt = -1;
//cout << "Rank : " << rankStr << " -> ";
for (int j=0;j<sizeof(arRank)/sizeof(arRank[0]);j++) {
string tempString = arRank[j];
string tempInputString = trim(inputString);
if (tempInputString.compare(tempString)==0) 
{
//cout << j << " ";
retInt =  j;
break;
}
}
//cout << endl;
 
return retInt;
}
 
 
int get_Mob_Type_Value(string inputString)
{
string arType[] = { "MONSTER", "NPC", "STONE", "WARP", "DOOR", "BUILDING", "PC", "POLYMORPH_PC", "HORSE", "GOTO"};
 
int retInt = -1;
//cout << "Type : " << typeStr << " -> ";
for (int j=0;j<sizeof(arType)/sizeof(arType[0]);j++) {
string tempString = arType[j];
string tempInputString = trim(inputString);
if (tempInputString.compare(tempString)==0) 
{
//cout << j << " ";
retInt =  j;
break;
}
}
//cout << endl;
 
return retInt;
}
 
int get_Mob_BattleType_Value(string inputString) 
{
string arBattleType[] = { "MELEE", "RANGE", "MAGIC", "SPECIAL", "POWER", "TANKER", "SUPER_POWER", "SUPER_TANKER"};
 
int retInt = -1;
//cout << "Battle Type : " << battleTypeStr << " -> ";
for (int j=0;j<sizeof(arBattleType)/sizeof(arBattleType[0]);j++) {
string tempString = arBattleType[j];
string tempInputString = trim(inputString);
if (tempInputString.compare(tempString)==0) 
{ 
//cout << j << " ";
retInt =  j;
break;
}
}
//cout << endl;
 
return retInt;
}
 
int get_Mob_Size_Value(string inputString)
{
string arSize[] = { "SAMLL", "MEDIUM", "BIG"};
 
int retInt = 0;
//cout << "Size : " << sizeStr << " -> ";
for (int j=0;j<sizeof(arSize)/sizeof(arSize[0]);j++) {
string tempString = arSize[j];
string tempInputString = trim(inputString);
if (tempInputString.compare(tempString)==0) 
{
//cout << j << " ";
retInt =  j + 1;
break;
}
}
//cout << endl;
 
return retInt;
}
 
int get_Mob_AIFlag_Value(string inputString)
{
string arAIFlag[] = {"AGGR","NOMOVE","COWARD","NOATTSHINSU","NOATTCHUNJO","NOATTJINNO","ATTMOB","BERSERK","STONESKIN","GODSPEED","DEATHBLOW","REVIVE"};
 
 
int retValue = 0;
string* arInputString = StringSplit(inputString, ","); //ÇÁ·ÎĹä Á¤ş¸ ł»żëŔ» ´Üľîş°·Î Âɰµ ąčż­.
for(int i =0;i<sizeof(arAIFlag)/sizeof(arAIFlag[0]);i++) {
string tempString = arAIFlag[i];
for (int j=0; j<30 ; j++) //ĂÖ´ë 30°ł ´Üľî±îÁö. (ÇϵĺÄÚµů)
{
string tempString2 = arInputString[j];
if (tempString2.compare(tempString)==0) { //ŔĎġÇĎ´ÂÁö Č®ŔÎ.
retValue = retValue + pow((float)2,(float)i);
}
 
if(tempString2.compare("") == 0)
break;
}
}
delete []arInputString;
//cout << "AIFlag : " << aiFlagStr << " -> " << retValue << endl;
 
return retValue;
}
int get_Mob_RaceFlag_Value(string inputString)
{
string arRaceFlag[] = {"ANIMAL","UNDEAD","DEVIL","HUMAN","ORC","MILGYO","INSECT","FIRE","ICE","DESERT","TREE",
"ATT_ELEC","ATT_FIRE","ATT_ICE","ATT_WIND","ATT_EARTH","ATT_DARK"};
 
int retValue = 0;
string* arInputString = StringSplit(inputString, ","); //ÇÁ·ÎĹä Á¤ş¸ ł»żëŔ» ´Üľîş°·Î Âɰµ ąčż­.
for(int i =0;i<sizeof(arRaceFlag)/sizeof(arRaceFlag[0]);i++) {
string tempString = arRaceFlag[i];
for (int j=0; j<30 ; j++) //ĂÖ´ë 30°ł ´Üľî±îÁö. (ÇϵĺÄÚµů)
{
string tempString2 = arInputString[j];
if (tempString2.compare(tempString)==0) { //ŔĎġÇĎ´ÂÁö Č®ŔÎ.
retValue = retValue + pow((float)2,(float)i);
}
 
if(tempString2.compare("") == 0)
break;
}
}
delete []arInputString;
//cout << "Race Flag : " << raceFlagStr << " -> " << retValue << endl;
 
return retValue;
}
int get_Mob_ImmuneFlag_Value(string inputString)
{
string arImmuneFlag[] = {"STUN","SLOW","FALL","CURSE","POISON","TERROR", "REFLECT"};
 
int retValue = 0;
string* arInputString = StringSplit(inputString, ","); //ÇÁ·ÎĹä Á¤ş¸ ł»żëŔ» ´Üľîş°·Î Âɰµ ąčż­.
for(int i =0;i<sizeof(arImmuneFlag)/sizeof(arImmuneFlag[0]);i++) {
string tempString = arImmuneFlag[i];
for (int j=0; j<30 ; j++) //ĂÖ´ë 30°ł ´Üľî±îÁö. (ÇϵĺÄÚµů)
{
string tempString2 = arInputString[j];
if (tempString2.compare(tempString)==0) { //ŔĎġÇĎ´ÂÁö Č®ŔÎ.
retValue = retValue + pow((float)2,(float)i);
}
 
if(tempString2.compare("") == 0)
break;
}
}
delete []arInputString;
//cout << "Immune Flag : " << immuneFlagStr << " -> " << retValue << endl;
 
 
return retValue;
}
 
 
#ifndef __DUMP_PROTO__
 
//¸÷ Ĺ×ŔĚşíŔ» ĽÂĆĂÇŘÁŘ´Ů.
bool Set_Proto_Mob_Table(TMobTable *mobTable, cCsvTable &csvTable,std::map<int,const char*> &nameMap)
{
int col = 0;
str_to_number(mobTable->dwVnum, csvTable.AsStringByIndex(col++));
strlcpy(mobTable->szName, csvTable.AsStringByIndex(col++), sizeof(mobTable->szName));
 
//3. ÁöżŞş° Ŕ̸§ łÖľîÁÖ±â.
map<int,const char*>::iterator it;
it = nameMap.find(mobTable->dwVnum);
if (it != nameMap.end()) {
const char * localeName = it->second;
strlcpy(mobTable->szLocaleName, localeName, sizeof (mobTable->szLocaleName));
} else {
strlcpy(mobTable->szLocaleName, mobTable->szName, sizeof (mobTable->szLocaleName));
}
 
//RANK
int rankValue = get_Mob_Rank_Value(csvTable.AsStringByIndex(col++));
mobTable->bRank = rankValue;
//TYPE
int typeValue = get_Mob_Type_Value(csvTable.AsStringByIndex(col++));
mobTable->bType = typeValue;
//BATTLE_TYPE
int battleTypeValue = get_Mob_BattleType_Value(csvTable.AsStringByIndex(col++));
mobTable->bBattleType = battleTypeValue;
 
str_to_number(mobTable->bLevel, csvTable.AsStringByIndex(col++));
//SIZE
int sizeValue = get_Mob_Size_Value(csvTable.AsStringByIndex(col++));
mobTable->bSize = sizeValue;
//AI_FLAG
int aiFlagValue = get_Mob_AIFlag_Value(csvTable.AsStringByIndex(col++));
mobTable->dwAIFlag = aiFlagValue;
//mount_capacity;
col++;
//RACE_FLAG
int raceFlagValue = get_Mob_RaceFlag_Value(csvTable.AsStringByIndex(col++));
mobTable->dwRaceFlag = raceFlagValue;
//IMMUNE_FLAG
int immuneFlagValue = get_Mob_ImmuneFlag_Value(csvTable.AsStringByIndex(col++));
mobTable->dwImmuneFlag = immuneFlagValue;
 
str_to_number(mobTable->bEmpire, csvTable.AsStringByIndex(col++));  //col = 11
 
strlcpy(mobTable->szFolder, csvTable.AsStringByIndex(col++), sizeof(mobTable->szFolder));
 
str_to_number(mobTable->bOnClickType, csvTable.AsStringByIndex(col++)); 
 
str_to_number(mobTable->bStr, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->bDex, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->bCon, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->bInt, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->dwDamageRange[0], csvTable.AsStringByIndex(col++));
str_to_number(mobTable->dwDamageRange[1], csvTable.AsStringByIndex(col++));
str_to_number(mobTable->dwMaxHP, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->bRegenCycle, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->bRegenPercent, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->dwGoldMin, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->dwGoldMax, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->dwExp, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->wDef, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->sAttackSpeed, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->sMovingSpeed, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->bAggresiveHPPct, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->wAggressiveSight, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->wAttackRange, csvTable.AsStringByIndex(col++));
 
str_to_number(mobTable->dwDropItemVnum, csvTable.AsStringByIndex(col++)); //32
str_to_number(mobTable->dwResurrectionVnum, csvTable.AsStringByIndex(col++));
for (int i = 0; i < MOB_ENCHANTS_MAX_NUM; ++i)
str_to_number(mobTable->cEnchants[i], csvTable.AsStringByIndex(col++));
 
for (int i = 0; i < MOB_RESISTS_MAX_NUM; ++i)
str_to_number(mobTable->cResists[i], csvTable.AsStringByIndex(col++));
 
str_to_number(mobTable->fDamMultiply, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->dwSummonVnum, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->dwDrainSP, csvTable.AsStringByIndex(col++));
 
//Mob_Color
++col;
 
str_to_number(mobTable->dwPolymorphItemVnum, csvTable.AsStringByIndex(col++));
 
str_to_number(mobTable->Skills[0].bLevel, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->Skills[0].dwVnum, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->Skills[1].bLevel, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->Skills[1].dwVnum, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->Skills[2].bLevel, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->Skills[2].dwVnum, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->Skills[3].bLevel, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->Skills[3].dwVnum, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->Skills[4].bLevel, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->Skills[4].dwVnum, csvTable.AsStringByIndex(col++));
 
str_to_number(mobTable->bBerserkPoint, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->bStoneSkinPoint, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->bGodSpeedPoint, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->bDeathBlowPoint, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->bRevivePoint, csvTable.AsStringByIndex(col++));
 
sys_log(0, "MOB #%-5d %-24s level: %-3u rank: %u empire: %d", mobTable->dwVnum, mobTable->szLocaleName, mobTable->bLevel, mobTable->bRank, mobTable->bEmpire);
 
return true;
}
 
bool Set_Proto_Item_Table(TItemTable *itemTable, cCsvTable &csvTable,std::map<int,const char*> &nameMap)
{
int col = 0;
 
int dataArray[33];
for (int i=0; i<sizeof(dataArray)/sizeof(dataArray[0]);i++) {
int validCheck = 0;
if (i==2) {
dataArray[i] = get_Item_Type_Value(csvTable.AsStringByIndex(col));
validCheck = dataArray[i];
} else if (i==3) {
dataArray[i] = get_Item_SubType_Value(dataArray[i-1], csvTable.AsStringByIndex(col));
validCheck = dataArray[i];
} else if (i==5) {
dataArray[i] = get_Item_AntiFlag_Value(csvTable.AsStringByIndex(col));
validCheck = dataArray[i];
} else if (i==6) {
dataArray[i] = get_Item_Flag_Value(csvTable.AsStringByIndex(col));
validCheck = dataArray[i];
} else if (i==7) {
dataArray[i] = get_Item_WearFlag_Value(csvTable.AsStringByIndex(col));
validCheck = dataArray[i];
} else if (i==8) {
dataArray[i] = get_Item_Immune_Value(csvTable.AsStringByIndex(col));
validCheck = dataArray[i];
} else if (i==14) {
dataArray[i] = get_Item_LimitType_Value(csvTable.AsStringByIndex(col));
validCheck = dataArray[i];
} else if (i==16) {
dataArray[i] = get_Item_LimitType_Value(csvTable.AsStringByIndex(col));
validCheck = dataArray[i];
} else if (i==18) {
dataArray[i] = get_Item_ApplyType_Value(csvTable.AsStringByIndex(col));
validCheck = dataArray[i];
} else if (i==20) {
dataArray[i] = get_Item_ApplyType_Value(csvTable.AsStringByIndex(col));
validCheck = dataArray[i];
} else if (i==22) {
dataArray[i] = get_Item_ApplyType_Value(csvTable.AsStringByIndex(col));
validCheck = dataArray[i];
} else {
str_to_number(dataArray[i], csvTable.AsStringByIndex(col));
}
 
if (validCheck == -1)
{
std::ostringstream dataStream;
 
for (int j = 0; j < i; ++j)
dataStream << dataArray[j] << ",";
 
//fprintf(stderr, "ItemProto Reading Failed : Invalid value.\n");
sys_err("ItemProto Reading Failed : Invalid value. (index: %d, col: %d, value: %s)", i, col, csvTable.AsStringByIndex(col));
sys_err("\t%d ~ %d Values: %s", 0, i, dataStream.str().c_str());
 
exit(0);
}
 
col = col + 1;
}
 
// vnum ą× vnum range Ŕбâ.
{
std::string s(csvTable.AsStringByIndex(0));
int pos = s.find("~");
// vnum Çʵ忡 '~'°ˇ ľř´Ů¸é ĆĐ˝ş
if (std::string::npos == pos)
{
itemTable->dwVnum = dataArray[0];
itemTable->dwVnumRange = 0;
}
else
{
std::string s_start_vnum (s.substr(0, pos));
std::string s_end_vnum (s.substr(pos +1 ));
 
int start_vnum = atoi(s_start_vnum.c_str());
int end_vnum = atoi(s_end_vnum.c_str());
if (0 == start_vnum || (0 != end_vnum && end_vnum < start_vnum))
{
sys_err ("INVALID VNUM %s", s.c_str());
return false;
}
itemTable->dwVnum = start_vnum;
itemTable->dwVnumRange = end_vnum - start_vnum;
}
}
 
strlcpy(itemTable->szName, csvTable.AsStringByIndex(1), sizeof(itemTable->szName));
//ÁöżŞş° Ŕ̸§ łÖľîÁÖ±â.
map<int,const char*>::iterator it;
it = nameMap.find(itemTable->dwVnum);
if (it != nameMap.end()) {
const char * localeName = it->second;
strlcpy(itemTable->szLocaleName, localeName, sizeof (itemTable->szLocaleName));
} else {
strlcpy(itemTable->szLocaleName, itemTable->szName, sizeof (itemTable->szLocaleName));
}
itemTable->bType = dataArray[2];
itemTable->bSubType = dataArray[3];
itemTable->bSize = dataArray[4];
itemTable->dwAntiFlags = dataArray[5];
itemTable->dwFlags = dataArray[6];
itemTable->dwWearFlags = dataArray[7];
itemTable->dwImmuneFlag = dataArray[8];
itemTable->dwGold = dataArray[9];
itemTable->dwShopBuyPrice = dataArray[10];
itemTable->dwRefinedVnum = dataArray[11];
itemTable->wRefineSet = dataArray[12];
itemTable->bAlterToMagicItemPct = dataArray[13];
itemTable->cLimitRealTimeFirstUseIndex = -1;
itemTable->cLimitTimerBasedOnWearIndex = -1;
 
int i;
 
for (i = 0; i < ITEM_LIMIT_MAX_NUM; ++i)
{
itemTable->aLimits[i].bType = dataArray[14+i*2];
itemTable->aLimits[i].lValue = dataArray[15+i*2];
 
if (LIMIT_REAL_TIME_START_FIRST_USE == itemTable->aLimits[i].bType)
itemTable->cLimitRealTimeFirstUseIndex = (char)i;
 
if (LIMIT_TIMER_BASED_ON_WEAR == itemTable->aLimits[i].bType)
itemTable->cLimitTimerBasedOnWearIndex = (char)i;
 
}
 
for (i = 0; i < ITEM_APPLY_MAX_NUM; ++i)
{
itemTable->aApplies[i].bType = dataArray[18+i*2];
itemTable->aApplies[i].lValue = dataArray[19+i*2];
}
 
for (i = 0; i < ITEM_VALUES_MAX_NUM; ++i)
itemTable->alValues[i] = dataArray[24+i];
 
//column for 'Specular'
itemTable->bGainSocketPct = dataArray[31];
itemTable->sAddonType = dataArray[32];
 
//test
str_to_number(itemTable->bWeight, "0");
 
return true;
}
 
#endif

 

Akurat funkcja str_to_number uzywa strtoul, sprawdz ten kod

http://hastebin.com/milanexici.hs

@alchemik1 Co ty to za serwer upodobniony do Pandory robisz :O?

 

ps. sorry za offtop xD

Swoj, niebawem zapowiedz. Akurat klimat starego serwera bedzie prawdziwy bo az sam bym w niego zagral

 

To widzę ciekawie będzie ^^... Zrób dobra betę przed startem xD.... :D

Opublikowano

 

x

 

wrzuciłem ten kod, ale nie bardzo wiem gdzie go podlinkować w ClientManagerBoot. Próbowałem dorzucić to do InitializeMobTableMySQL() i InitializeItemTableMySQL() do while'a, ale nie wiem czym jest parametr length :D

57199140501148694665.png

Opublikowano

Cześć. Mam pewien plik DB, który nie bardzo chce wstać, tj. wstaje i pracuje tylko za 1 razem po uruchomieniu systemu, kolejne próby odpalenia procesu (po uprzednim zabiciu pierwszego) generują mi SIGSEGV (11) w funkcji strtoul_l(). Zabawne jest to, że gdy próbuję odpalić to DB na innej maszynie (skonfigurowanej jakoś w 2015) to działa bez problemu i odpala się kilka razy pod rząd, natomiast na maszynie którą przygotowałem sobie wczoraj ten plik działać nie chce i rzuca tym cholernym strtoul_l().

 

DB Syserr:

 

 

SYSERR: Mar 27 21:53:04.673291 :: pid_init: 
Start of pid: 939
 
SYSERR: Mar 27 21:53:04.673350 :: Start: TABLE_POSTFIX not configured use default

 

 

 

DB Syslog

 

 

SYSERR: Mar 27 21:53:04.673291 :: pid_init: 
Start of pid: 939

Mar 27 21:53:04.673330 :: CONFIG: DISABLE_HOTBACKUP
SYSERR: Mar 27 21:53:04.673350 :: Start: TABLE_POSTFIX not configured use default
Mar 27 21:53:04.673375 :: connecting to MySQL server (player)
Mar 27 21:53:04.673387 :: CREATING DIRECT_SQL
Mar 27 21:53:04.673409 :: AsyncSQL: locale euckr
Mar 27 21:53:04.677793 :: CREATING MAIN_SQL
Mar 27 21:53:04.677830 :: AsyncSQL: locale euckr
Mar 27 21:53:04.677879 :: CREATING ASYNC_SQL
Mar 27 21:53:04.677913 :: AsyncSQL: locale euckr
Mar 27 21:53:04.677940 ::    OK
Mar 27 21:53:04.677969 :: connecting to MySQL server (account)
Mar 27 21:53:04.677981 :: CREATING DIRECT_SQL
Mar 27 21:53:04.677997 :: AsyncSQL: locale euckr
Mar 27 21:53:04.678254 :: CREATING MAIN_SQL
Mar 27 21:53:04.678279 :: AsyncSQL: locale euckr
Mar 27 21:53:04.678310 :: CREATING ASYNC_SQL
Mar 27 21:53:04.678333 :: AsyncSQL: locale euckr
Mar 27 21:53:04.678363 ::    OK
Mar 27 21:53:04.678388 :: connecting to MySQL server (common)
Mar 27 21:53:04.678401 :: CREATING DIRECT_SQL
Mar 27 21:53:04.678416 :: AsyncSQL: locale euckr
Mar 27 21:53:04.678655 :: CREATING MAIN_SQL
Mar 27 21:53:04.678679 :: AsyncSQL: locale euckr
Mar 27 21:53:04.678708 :: CREATING ASYNC_SQL
Mar 27 21:53:04.678730 :: AsyncSQL: locale euckr
Mar 27 21:53:04.678756 ::    OK
Mar 27 21:53:04.678780 :: connecting to MySQL server (hotbackup)
Mar 27 21:53:04.678792 :: CREATING DIRECT_SQL
Mar 27 21:53:04.678807 :: AsyncSQL: locale euckr
Mar 27 21:53:04.679039 :: CREATING MAIN_SQL
Mar 27 21:53:04.679063 :: AsyncSQL: locale euckr
Mar 27 21:53:04.679093 :: CREATING ASYNC_SQL
Mar 27 21:53:04.679117 :: AsyncSQL: locale euckr
Mar 27 21:53:04.679142 ::    OK
Mar 27 21:53:04.679199 :: ClientManager initialization.. 
Mar 27 21:53:04.679477 :: InitializeLocalization() - LoadLocaleTable(count:13)
Mar 27 21:53:04.679500 :: locale[LOCALE] = poland
Mar 27 21:53:04.679512 :: Changed g_stLocale euckr to euckr
Mar 27 21:53:04.679525 :: SetLocale start 

 

 

 

GDB:

DSvddV6.png

 

Oto, co próbowałem robić:

1. Rekompilacja DB. Brak efektu

2. Na maszynie konfigurowanej jakoś w 2015 roku DB działa aż miło. Na konfigurowanej wczoraj - nie. Stara maszyna jest fizycznym urządzeniem, wczorajsza - wirtualnym.

3. Używam statycznego linkowania podczas kompilacji (-static)

4. Na 99% nie jest to problem powiązany z source, gdyż próbowałem trzech różnych db: czystej mainline, DB1 (zmodyfikowany mainline) oraz DB2 (zmodyfikowany DB1) i żadna nie chciała działać na wczorajszej maszynie, natomiast działały na starej.

 

 

Czy ktoś mógłby mi powiedzieć co się do ciężkiej cholery dzieje?

Hm, pokaż mi proszę uname -a z starej maszyny.

Pokaż mi proszę jeszcze wersję mysql na starej i nowej maszynie.

Daj mi tu proszę komendy jak instalowałeś g++(gcc).

Jeśli "instalowałeś" z pkg to pozdro. 

Jak działa na starej maszynie, to problem tkwi gdzie? na nowej maszynie a nie w kodzie. 

Kodu nie warto zmieniać, bo jak znowu zmienisz maszynę na np. serwer dedykowany to problem powróci. 

Ponadto jeśli stripujesz db, to nie stripuj. 

Jeśli mi ujawnisz to co wyżej napisałem, chętnie pomogę.

 

Pozdrawiam.

Pomogłem ? klik up to Like ;D ( Lubię to ! ) xD

300 postów-> 10.10.2013 godz. 9:00
400 postów-> 19.10.2013 godz. 9:00

 

Opublikowano

 

Hm, pokaż mi proszę uname -a z starej maszyny.

Pokaż mi proszę jeszcze wersję mysql na starej i nowej maszynie.

Daj mi tu proszę komendy jak instalowałeś g++(gcc).

Jeśli "instalowałeś" z pkg to pozdro. 

Jak działa na starej maszynie, to problem tkwi gdzie? na nowej maszynie a nie w kodzie. 

Kodu nie warto zmieniać, bo jak znowu zmienisz maszynę na np. serwer dedykowany to problem powróci. 

Ponadto jeśli stripujesz db, to nie stripuj. 

Jeśli mi ujawnisz to co wyżej napisałem, chętnie pomogę.

 

Pozdrawiam.

 

1. Na górze nowa, na dole stara

DJIflUT.png

2. pkg install gcc git makedepend gmake devil cryptopp boost-all

Tymi komendami konfigurowałem obydwie maszyny (starą i nową). Nie ma większej różnicy pomiędzy instalowaniem z portów a instalowaniem przez pkg.

3. DB jest niestripowane co widać po wcześniejszych screenach (nie byłoby nazwy funkcji która się wyjebała)

4. Na żadnej z tych maszyn kernel nie był rekompilowany

57199140501148694665.png

Opublikowano

 

 

Hm, pokaż mi proszę uname -a z starej maszyny.

Pokaż mi proszę jeszcze wersję mysql na starej i nowej maszynie.

Daj mi tu proszę komendy jak instalowałeś g++(gcc).

Jeśli "instalowałeś" z pkg to pozdro. 

Jak działa na starej maszynie, to problem tkwi gdzie? na nowej maszynie a nie w kodzie. 

Kodu nie warto zmieniać, bo jak znowu zmienisz maszynę na np. serwer dedykowany to problem powróci. 

Ponadto jeśli stripujesz db, to nie stripuj. 

Jeśli mi ujawnisz to co wyżej napisałem, chętnie pomogę.

 

Pozdrawiam.

 

1. Na górze nowa, na dole stara

DJIflUT.png

2. pkg install gcc git makedepend gmake devil cryptopp boost-all

Tymi komendami konfigurowałem obydwie maszyny (starą i nową). Nie ma większej różnicy pomiędzy instalowaniem z portów a instalowaniem przez pkg.

3. DB jest niestripowane co widać po wcześniejszych screenach (nie byłoby nazwy funkcji która się wyjebała)

4. Na żadnej z tych maszyn kernel nie był rekompilowany

 

Jest różnica między instalacją z pkg a instalacją z portów.

Podczas każdej instalacji z portów, każdy nowy dodatek zostaje pobierany i instalowany a przez pkg tylko pobierasz takową wersję i tyle.

Poza tym jak ja instaluję to zawsze korzystam z portów bo pkg mnie zawodzi ;)

Brakuje Ci jeszcze subversion ale podałem też gcc48:

cd /usr/ports/devel/subversion && make install clean
cd /usr/ports/lang/gcc48 & make install clean

Co do gcc48 to proszę sprawdź jaką wersję Ci zainstalowało przez komendę pkg, komendą:

gcc -v 

Na gcc49 są problemy.

Ja jak zazwyczaj instaluję na wirtualnych maszynach(VPS) to używam tych komend:

cd /usr/ports/devel/gmake && make install clean
cd /usr/ports/devel/makedepend && make install clean
cd /usr/ports/devel/subversion && make install clean
cd /usr/ports/graphics/devil && make install clean
cd /usr/ports/graphics/boost-all && make install clean
cd /usr/ports/lang/gcc48 & make install clean

I śmiga.

Ponadto jakiego używałeś poradniku instalując FreeBSD w poprzednim roku? a jaki w tym roku ? 

Ponadto wszystkie liby z oficjalnej strony pobrałeś? albo przez sysinstall? jak nie, to wejdź tam proszę w dictionaries czy jak to się zwie i tam masz do wyboru liby itp.

Z tego co widzę to przypuszczam że wirtualną maszynę masz na kompie czy laptopie więc jest możliwość spakowania jej do winraru albo 7z albo jak tam chcesz i podesłanie mi jej? Bo wtedy bym bardziej przeanalizował problem i nie szukał w ciemno. Oczywiście bez source. 

 

Pozdrawiam.

Pomogłem ? klik up to Like ;D ( Lubię to ! ) xD

300 postów-> 10.10.2013 godz. 9:00
400 postów-> 19.10.2013 godz. 9:00

 

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...