Fix encoding warnings
warning C4828: The file contains a character starting at offse t 0x132 that is illegal in the current source character set (codepage 65001)
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
#include "stdafx.h"
|
||||
#include "stdafx.h"
|
||||
#include "Config.h"
|
||||
|
||||
CConfig::CConfig()
|
||||
@@ -67,7 +67,7 @@ bool CConfig::GetWord(FILE *fp, char *tar)
|
||||
|
||||
if ((c == ' ' || c == '\t' || c == '\n'))
|
||||
{
|
||||
// ÅÜ.
|
||||
// ÅÜ.
|
||||
tar[i] = '\0';
|
||||
return true;
|
||||
}
|
||||
@@ -144,7 +144,7 @@ bool CConfig::LoadFile(const char* filename)
|
||||
}
|
||||
|
||||
|
||||
// ÆÄÀÏ ´Ý´Â ºÎºÐ.
|
||||
// ÆÄÀÏ ´Ý´Â ºÎºÐ.
|
||||
fclose(fp);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#include "stdafx.h"
|
||||
#include "stdafx.h"
|
||||
#include "Marriage.h"
|
||||
#include "Main.h"
|
||||
#include "DBManager.h"
|
||||
@@ -253,7 +253,7 @@ namespace marriage
|
||||
|
||||
void CManager::OnSetup(CPeer* peer)
|
||||
{
|
||||
// 결혼한 사람들 보내기
|
||||
// 결혼한 사람들 보내기
|
||||
for (itertype(m_Marriages) it = m_Marriages.begin(); it != m_Marriages.end(); ++it)
|
||||
{
|
||||
TMarriage* pMarriage = *it;
|
||||
@@ -280,7 +280,7 @@ namespace marriage
|
||||
}
|
||||
}
|
||||
|
||||
// 결혼식 보내기
|
||||
// 결혼식 보내기
|
||||
for (itertype(m_mapRunningWedding) it = m_mapRunningWedding.begin(); it != m_mapRunningWedding.end(); ++it)
|
||||
{
|
||||
const TWedding& t = it->second;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#include "Monarch.h"
|
||||
#include "Monarch.h"
|
||||
#include "common/utils.h"
|
||||
#include "Main.h"
|
||||
#include "ClientManager.h"
|
||||
@@ -235,7 +235,7 @@ bool CMonarch::SetMonarch(const char * name)
|
||||
}
|
||||
delete pMsg;
|
||||
|
||||
//db¿¡ ÀÔ·Â
|
||||
//db¿¡ ÀÔ·Â
|
||||
snprintf(szQuery, sizeof(szQuery),
|
||||
"REPLACE INTO monarch (empire, name, windate, money) VALUES(%d, %d, now(), %lld)", Empire, p->pid[Empire], p->money[Empire]);
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#ifndef __INC_METIN_II_GAME_CONSTANTS_H__
|
||||
#ifndef __INC_METIN_II_GAME_CONSTANTS_H__
|
||||
#define __INC_METIN_II_GAME_CONSTANTS_H__
|
||||
|
||||
#include "common/tables.h"
|
||||
@@ -13,7 +13,7 @@ enum EMonsterChatState
|
||||
|
||||
typedef struct SMobRankStat
|
||||
{
|
||||
int iGoldPercent; // µ·ÀÌ ³ª¿Ã È®·ü
|
||||
int iGoldPercent; // µ·ÀÌ ³ª¿Ã È®·ü
|
||||
} TMobRankStat;
|
||||
|
||||
typedef struct SMobStat
|
||||
@@ -124,7 +124,7 @@ extern const int aiMobResistsApplyIdx[MOB_RESISTS_MAX_NUM];
|
||||
|
||||
extern const int aSkillAttackAffectProbByRank[MOB_RANK_MAX_NUM];
|
||||
|
||||
extern const int aiItemMagicAttributePercentHigh[ITEM_ATTRIBUTE_MAX_LEVEL]; // 1°³±îÁö
|
||||
extern const int aiItemMagicAttributePercentHigh[ITEM_ATTRIBUTE_MAX_LEVEL]; // 1°³±îÁö
|
||||
extern const int aiItemMagicAttributePercentLow[ITEM_ATTRIBUTE_MAX_LEVEL];
|
||||
|
||||
extern const int aiItemAttributeAddPercent[ITEM_ATTRIBUTE_MAX_NUM];
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#include "stdafx.h"
|
||||
#include "stdafx.h"
|
||||
#include "config.h"
|
||||
#include "utils.h"
|
||||
#include "desc_client.h"
|
||||
@@ -84,7 +84,7 @@ bool CLIENT_DESC::Connect(int iPhaseWhenSucceed)
|
||||
if (iPhaseWhenSucceed != 0)
|
||||
m_iPhaseWhenSucceed = iPhaseWhenSucceed;
|
||||
|
||||
if (get_global_time() - m_LastTryToConnectTime < 3) // 3초
|
||||
if (get_global_time() - m_LastTryToConnectTime < 3) // 3초
|
||||
return false;
|
||||
|
||||
m_LastTryToConnectTime = get_global_time();
|
||||
@@ -207,7 +207,7 @@ void CLIENT_DESC::SetPhase(int iPhase)
|
||||
|
||||
sys_log(0, "DB_SETUP current user %d size %d", p.dwLoginCount, buf.size());
|
||||
|
||||
// 파티를 처리할 수 있게 됨.
|
||||
// 파티를 처리할 수 있게 됨.
|
||||
CPartyManager::instance().EnablePCParty();
|
||||
//CPartyManager::instance().SendPartyToDB();
|
||||
}
|
||||
@@ -294,7 +294,7 @@ void CLIENT_DESC::Update(DWORD t)
|
||||
void CLIENT_DESC::UpdateChannelStatus(DWORD t, bool fForce)
|
||||
{
|
||||
enum {
|
||||
CHANNELSTATUS_UPDATE_PERIOD = 5*60*1000, // 5분마다
|
||||
CHANNELSTATUS_UPDATE_PERIOD = 5*60*1000, // 5분마다
|
||||
};
|
||||
if (fForce || m_tLastChannelStatusUpdateTime+CHANNELSTATUS_UPDATE_PERIOD < t) {
|
||||
int iTotal;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#include "stdafx.h"
|
||||
#include "stdafx.h"
|
||||
#include "constants.h"
|
||||
#include "group_text_parse_tree.h"
|
||||
#include "dragon_soul_table.h"
|
||||
@@ -172,7 +172,7 @@ bool DragonSoulTable::ReadBasicApplys()
|
||||
TVecApplys vecApplys;
|
||||
int n = pChild->GetRowCount();
|
||||
|
||||
// BasicApply Group은 Key가 1부터 시작함.
|
||||
// BasicApply Group은 Key가 1부터 시작함.
|
||||
for (int j = 1; j <= n; j++)
|
||||
{
|
||||
std::stringstream ss;
|
||||
@@ -654,7 +654,7 @@ bool DragonSoulTable::GetWeight(BYTE ds_type, BYTE grade_idx, BYTE step_index, B
|
||||
return true;
|
||||
}
|
||||
}
|
||||
// default group을 살펴봄.
|
||||
// default group을 살펴봄.
|
||||
pDragonSoulGroup = m_pWeightTableNode->GetChildNode("default");
|
||||
if (NULL != pDragonSoulGroup)
|
||||
{
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#include "stdafx.h"
|
||||
#include "stdafx.h"
|
||||
#include "dungeon.h"
|
||||
#include "char.h"
|
||||
#include "char_manager.h"
|
||||
@@ -1130,7 +1130,7 @@ struct FExitDungeonToStartPosition
|
||||
{
|
||||
PIXEL_POSITION posWarp;
|
||||
|
||||
// 현재 맵 인덱스를 넣는 것이 아니라 시작하는 맵 인덱스를 넣는다.
|
||||
// 현재 맵 인덱스를 넣는 것이 아니라 시작하는 맵 인덱스를 넣는다.
|
||||
if (SECTREE_MANAGER::instance().GetRecallPositionByEmpire(g_start_map[ch->GetEmpire()], ch->GetEmpire(), posWarp))
|
||||
ch->WarpSet(posWarp.x, posWarp.y);
|
||||
else
|
||||
@@ -1280,7 +1280,7 @@ void CDungeon::JumpToEliminateLocation()
|
||||
}
|
||||
else
|
||||
{
|
||||
// 일반 맵으로 워프
|
||||
// 일반 맵으로 워프
|
||||
LPSECTREE_MAP pMap = SECTREE_MANAGER::instance().GetMap(m_lMapIndex);
|
||||
|
||||
if (!pMap)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#include "stdafx.h"
|
||||
#include "stdafx.h"
|
||||
#include "utils.h"
|
||||
#include "config.h"
|
||||
#include "char.h"
|
||||
@@ -81,7 +81,7 @@ bool ITEM_MANAGER::Initialize(TItemTable * table, int size)
|
||||
if (m_vec_prototype[i].dwRefinedVnum)
|
||||
m_map_ItemRefineFrom.insert(std::make_pair(m_vec_prototype[i].dwRefinedVnum, m_vec_prototype[i].dwVnum));
|
||||
|
||||
// NOTE : QUEST_GIVE 플래그는 npc 이벤트로 발생.
|
||||
// NOTE : QUEST_GIVE 플래그는 npc 이벤트로 발생.
|
||||
if (m_vec_prototype[i].bType == ITEM_QUEST || IS_SET(m_vec_prototype[i].dwFlags, ITEM_FLAG_QUEST_USE | ITEM_FLAG_QUEST_USE_MULTIPLE))
|
||||
quest::CQuestManager::instance().RegisterNPCVnum(m_vec_prototype[i].dwVnum);
|
||||
|
||||
@@ -159,7 +159,7 @@ LPITEM ITEM_MANAGER::CreateItem(DWORD vnum, DWORD count, DWORD id, bool bTryMagi
|
||||
{
|
||||
if (vnum == 50300 && bTryMagic)
|
||||
{
|
||||
// 수련서를 아이템 번호를 다르게 만들어 준다.
|
||||
// 수련서를 아이템 번호를 다르게 만들어 준다.
|
||||
DWORD dwSkillVnum;
|
||||
|
||||
do
|
||||
@@ -185,7 +185,7 @@ LPITEM ITEM_MANAGER::CreateItem(DWORD vnum, DWORD count, DWORD id, bool bTryMagi
|
||||
|
||||
LPITEM item = NULL;
|
||||
|
||||
//id로 검사해서 존재한다면 -- 리턴!
|
||||
//id로 검사해서 존재한다면 -- 리턴!
|
||||
if (m_map_pkItemByID.find(id) != m_map_pkItemByID.end())
|
||||
{
|
||||
item = m_map_pkItemByID[id];
|
||||
@@ -194,7 +194,7 @@ LPITEM ITEM_MANAGER::CreateItem(DWORD vnum, DWORD count, DWORD id, bool bTryMagi
|
||||
return NULL;
|
||||
}
|
||||
|
||||
//아이템 하나 할당하고
|
||||
//아이템 하나 할당하고
|
||||
#ifdef M2_USE_POOL
|
||||
item = pool_.Construct();
|
||||
#else
|
||||
@@ -203,15 +203,15 @@ LPITEM ITEM_MANAGER::CreateItem(DWORD vnum, DWORD count, DWORD id, bool bTryMagi
|
||||
|
||||
bool bIsNewItem = (0 == id);
|
||||
|
||||
//초기화 하고. 테이블 셋하고
|
||||
//초기화 하고. 테이블 셋하고
|
||||
item->Initialize();
|
||||
item->SetProto(table);
|
||||
item->SetMaskVnum(dwMaskVnum);
|
||||
|
||||
if (item->GetType() == ITEM_ELK) // 돈은 ID가 필요없고 저장도 필요없다.
|
||||
if (item->GetType() == ITEM_ELK) // 돈은 ID가 필요없고 저장도 필요없다.
|
||||
item->SetSkipSave(true);
|
||||
|
||||
// Unique ID를 세팅하자
|
||||
// Unique ID를 세팅하자
|
||||
else if (!bIsNewItem)
|
||||
{
|
||||
item->SetID(id);
|
||||
@@ -221,16 +221,16 @@ LPITEM ITEM_MANAGER::CreateItem(DWORD vnum, DWORD count, DWORD id, bool bTryMagi
|
||||
{
|
||||
item->SetID(GetNewID());
|
||||
|
||||
if (item->GetType() == ITEM_UNIQUE) // 유니크 아이템은 생성시에 소켓에 남은시간을 기록한다.
|
||||
if (item->GetType() == ITEM_UNIQUE) // 유니크 아이템은 생성시에 소켓에 남은시간을 기록한다.
|
||||
{
|
||||
if (item->GetValue(2) == 0)
|
||||
item->SetSocket(ITEM_SOCKET_UNIQUE_REMAIN_TIME, item->GetValue(0)); // 게임 시간 유니크
|
||||
item->SetSocket(ITEM_SOCKET_UNIQUE_REMAIN_TIME, item->GetValue(0)); // 게임 시간 유니크
|
||||
else
|
||||
{
|
||||
//int globalTime = get_global_time();
|
||||
//int lastTime = item->GetValue(0);
|
||||
//int endTime = get_global_time() + item->GetValue(0);
|
||||
item->SetSocket(ITEM_SOCKET_UNIQUE_REMAIN_TIME, get_global_time() + item->GetValue(0)); // 실시간 유니크
|
||||
item->SetSocket(ITEM_SOCKET_UNIQUE_REMAIN_TIME, get_global_time() + item->GetValue(0)); // 실시간 유니크
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -259,9 +259,9 @@ LPITEM ITEM_MANAGER::CreateItem(DWORD vnum, DWORD count, DWORD id, bool bTryMagi
|
||||
break;
|
||||
}
|
||||
|
||||
if (item->GetType() == ITEM_ELK) // 돈은 아무 처리가 필요하지 않음
|
||||
if (item->GetType() == ITEM_ELK) // 돈은 아무 처리가 필요하지 않음
|
||||
;
|
||||
else if (item->IsStackable()) // 합칠 수 있는 아이템의 경우
|
||||
else if (item->IsStackable()) // 합칠 수 있는 아이템의 경우
|
||||
{
|
||||
count = MINMAX(1, count, ITEM_MAX_COUNT);
|
||||
|
||||
@@ -289,7 +289,7 @@ LPITEM ITEM_MANAGER::CreateItem(DWORD vnum, DWORD count, DWORD id, bool bTryMagi
|
||||
|
||||
for (int i=0 ; i < ITEM_LIMIT_MAX_NUM ; i++)
|
||||
{
|
||||
// 아이템 생성 시점부터 사용하지 않아도 시간이 차감되는 방식
|
||||
// 아이템 생성 시점부터 사용하지 않아도 시간이 차감되는 방식
|
||||
if (LIMIT_REAL_TIME == item->GetLimitType(i))
|
||||
{
|
||||
if (item->GetLimitValue(i))
|
||||
@@ -304,11 +304,11 @@ LPITEM ITEM_MANAGER::CreateItem(DWORD vnum, DWORD count, DWORD id, bool bTryMagi
|
||||
item->StartRealTimeExpireEvent();
|
||||
}
|
||||
|
||||
// 기존 유니크 아이템처럼 착용시에만 사용가능 시간이 차감되는 방식
|
||||
// 기존 유니크 아이템처럼 착용시에만 사용가능 시간이 차감되는 방식
|
||||
else if (LIMIT_TIMER_BASED_ON_WEAR == item->GetLimitType(i))
|
||||
{
|
||||
// 이미 착용중인 아이템이면 타이머를 시작하고, 새로 만드는 아이템은 사용 가능 시간을 세팅해준다. (
|
||||
// 아이템몰로 지급하는 경우에는 이 로직에 들어오기 전에 Socket0 값이 세팅이 되어 있어야 한다.
|
||||
// 이미 착용중인 아이템이면 타이머를 시작하고, 새로 만드는 아이템은 사용 가능 시간을 세팅해준다. (
|
||||
// 아이템몰로 지급하는 경우에는 이 로직에 들어오기 전에 Socket0 값이 세팅이 되어 있어야 한다.
|
||||
if (true == item->IsEquipped())
|
||||
{
|
||||
item->StartTimerBasedOnWearExpireEvent();
|
||||
@@ -320,16 +320,16 @@ LPITEM ITEM_MANAGER::CreateItem(DWORD vnum, DWORD count, DWORD id, bool bTryMagi
|
||||
duration = item->GetLimitValue(i);
|
||||
|
||||
if (0 == duration)
|
||||
duration = 60 * 60 * 10; // 정보가 아무것도 없으면 디폴트로 10시간 세팅
|
||||
duration = 60 * 60 * 10; // 정보가 아무것도 없으면 디폴트로 10시간 세팅
|
||||
|
||||
item->SetSocket(0, duration);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (id == 0) // 새로 만드는 아이템일 때만 처리
|
||||
if (id == 0) // 새로 만드는 아이템일 때만 처리
|
||||
{
|
||||
// 새로추가되는 약초들일경우 성능을 다르게처리
|
||||
// 새로추가되는 약초들일경우 성능을 다르게처리
|
||||
if (ITEM_BLEND==item->GetType())
|
||||
{
|
||||
if (Blend_Item_find(item->GetVnum()))
|
||||
@@ -356,7 +356,7 @@ LPITEM ITEM_MANAGER::CreateItem(DWORD vnum, DWORD count, DWORD id, bool bTryMagi
|
||||
if (table->bGainSocketPct)
|
||||
item->AlterToSocketItem(table->bGainSocketPct);
|
||||
|
||||
// 50300 == 기술 수련서
|
||||
// 50300 == 기술 수련서
|
||||
if (vnum == 50300 || vnum == ITEM_SKILLFORGET_VNUM)
|
||||
{
|
||||
DWORD dwSkillVnum;
|
||||
@@ -408,7 +408,7 @@ LPITEM ITEM_MANAGER::CreateItem(DWORD vnum, DWORD count, DWORD id, bool bTryMagi
|
||||
}
|
||||
}
|
||||
|
||||
// 새로 생성되는 용혼석 처리.
|
||||
// 새로 생성되는 용혼석 처리.
|
||||
if (item->IsDragonSoul() && 0 == id)
|
||||
{
|
||||
DSManager::instance().DragonSoulItemInitialize(item);
|
||||
@@ -477,7 +477,7 @@ void ITEM_MANAGER::Update()
|
||||
this_it = it++;
|
||||
LPITEM item = *this_it;
|
||||
|
||||
// SLOW_QUERY 플래그가 있는 것은 종료시에만 저장한다.
|
||||
// SLOW_QUERY 플래그가 있는 것은 종료시에만 저장한다.
|
||||
if (item->GetOwner() && IS_SET(item->GetFlag(), ITEM_FLAG_SLOW_QUERY))
|
||||
continue;
|
||||
|
||||
@@ -500,7 +500,7 @@ void ITEM_MANAGER::RemoveItem(LPITEM item, const char * c_pszReason)
|
||||
// SAFEBOX_TIME_LIMIT_ITEM_BUG_FIX
|
||||
if (item->GetWindow() == MALL || item->GetWindow() == SAFEBOX)
|
||||
{
|
||||
// 20050613.ipkn.시간제 아이템이 상점에 있을 경우 시간만료시 서버가 다운된다.
|
||||
// 20050613.ipkn.시간제 아이템이 상점에 있을 경우 시간만료시 서버가 다운된다.
|
||||
CSafebox* pSafebox = item->GetWindow() == MALL ? o->GetMall() : o->GetSafebox();
|
||||
if (pSafebox)
|
||||
{
|
||||
@@ -764,8 +764,8 @@ class CItemDropInfo
|
||||
extern std::vector<CItemDropInfo> g_vec_pkCommonDropItem[MOB_RANK_MAX_NUM];
|
||||
|
||||
// 20050503.ipkn.
|
||||
// iMinimum 보다 작으면 iDefault 세팅 (단, iMinimum은 0보다 커야함)
|
||||
// 1, 0 식으로 ON/OFF 되는 방식을 지원하기 위해 존재
|
||||
// iMinimum 보다 작으면 iDefault 세팅 (단, iMinimum은 0보다 커야함)
|
||||
// 1, 0 식으로 ON/OFF 되는 방식을 지원하기 위해 존재
|
||||
int GetDropPerKillPct(int iMinimum, int iDefault, int iDeltaPercent, const char * c_pszFlag)
|
||||
{
|
||||
int iVal = 0;
|
||||
@@ -785,8 +785,8 @@ int GetDropPerKillPct(int iMinimum, int iDefault, int iDeltaPercent, const char
|
||||
if (iVal == 0)
|
||||
return 0;
|
||||
|
||||
// 기본 세팅일때 (iDeltaPercent=100)
|
||||
// 40000 iVal 마리당 하나 느낌을 주기 위한 상수임
|
||||
// 기본 세팅일때 (iDeltaPercent=100)
|
||||
// 40000 iVal 마리당 하나 느낌을 주기 위한 상수임
|
||||
return (40000 * iDeltaPercent / iVal);
|
||||
}
|
||||
|
||||
@@ -932,7 +932,7 @@ bool ITEM_MANAGER::CreateDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller, std::
|
||||
CMobItemGroup* pGroup = it->second;
|
||||
|
||||
// MOB_DROP_ITEM_BUG_FIX
|
||||
// 20050805.myevan.MobDropItem 에 아이템이 없을 경우 CMobItemGroup::GetOne() 접근시 문제 발생 수정
|
||||
// 20050805.myevan.MobDropItem 에 아이템이 없을 경우 CMobItemGroup::GetOne() 접근시 문제 발생 수정
|
||||
if (pGroup && !pGroup->IsEmpty())
|
||||
{
|
||||
int iPercent = 40000 * iDeltaPercent / pGroup->GetKillPerDrop();
|
||||
@@ -995,7 +995,7 @@ bool ITEM_MANAGER::CreateDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller, std::
|
||||
}
|
||||
}
|
||||
|
||||
// 잡템
|
||||
// 잡템
|
||||
if (pkChr->GetMobDropItemVnum())
|
||||
{
|
||||
itertype(m_map_dwEtcItemDropProb) it = m_map_dwEtcItemDropProb.find(pkChr->GetMobDropItemVnum());
|
||||
@@ -1044,14 +1044,14 @@ bool ITEM_MANAGER::CreateDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller, std::
|
||||
pdw[1] = 1;
|
||||
pdw[2] = quest::CQuestManager::instance().GetEventFlag("lotto_round");
|
||||
|
||||
// 행운의 서는 소켓을 설정한다
|
||||
// 행운의 서는 소켓을 설정한다
|
||||
DBManager::instance().ReturnQuery(QID_LOTTO, pkKiller->GetPlayerID(), pdw,
|
||||
"INSERT INTO lotto_list VALUES(0, 'server%s', %u, NOW())",
|
||||
get_table_postfix(), pkKiller->GetPlayerID());
|
||||
}
|
||||
|
||||
//
|
||||
// 스페셜 드롭 아이템
|
||||
// 스페셜 드롭 아이템
|
||||
//
|
||||
CreateQuestDropItem(pkChr, pkKiller, vec_item, iDeltaPercent, iRandRange);
|
||||
|
||||
@@ -1062,7 +1062,7 @@ bool ITEM_MANAGER::CreateDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller, std::
|
||||
}
|
||||
|
||||
//
|
||||
// 승룡곡 천의동굴 2층에서만 수룡방 입장권
|
||||
// 승룡곡 천의동굴 2층에서만 수룡방 입장권
|
||||
//
|
||||
if (LC_IsYMIR() || LC_IsKorea())
|
||||
{
|
||||
@@ -1079,21 +1079,21 @@ bool ITEM_MANAGER::CreateDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller, std::
|
||||
}
|
||||
|
||||
//
|
||||
// 승룡곡 1층, 2층에서만 7,8 스킬입문서 드롭
|
||||
// 승룡곡 1층, 2층에서만 7,8 스킬입문서 드롭
|
||||
//
|
||||
if (LC_IsYMIR() || LC_IsKorea())
|
||||
{
|
||||
switch (pkKiller->GetMapIndex())
|
||||
{
|
||||
case 72: // 천의동굴 1층
|
||||
case 73: // 천의동굴 2층
|
||||
case 72: // 천의동굴 1층
|
||||
case 73: // 천의동굴 2층
|
||||
{
|
||||
int vnum = 0;
|
||||
|
||||
if (2403 == pkChr->GetRaceNum()) // 천의법사
|
||||
vnum = 69200; // 7스킬 입문서
|
||||
else if (2411 == pkChr->GetRaceNum()) // 진천의병사
|
||||
vnum = 69201; // 8스킬 입문서
|
||||
if (2403 == pkChr->GetRaceNum()) // 천의법사
|
||||
vnum = 69200; // 7스킬 입문서
|
||||
else if (2411 == pkChr->GetRaceNum()) // 진천의병사
|
||||
vnum = 69201; // 8스킬 입문서
|
||||
else
|
||||
break;
|
||||
|
||||
@@ -1249,11 +1249,11 @@ bool DropEvent_CharStone_SetValue(const std::string& name, int value)
|
||||
// END_OF_DROPEVENT_CHARSTONE
|
||||
|
||||
// fixme
|
||||
// 위의 것과 함께 quest로 뺄것 빼보자.
|
||||
// 이거 너무 더럽잖아...
|
||||
// <EFBFBD>?. 하드코딩 싫다 ㅜㅠ
|
||||
// 계량 아이템 보상 시작.
|
||||
// by rtsummit 고치자 진짜
|
||||
// 위의 것과 함께 quest로 뺄것 빼보자.
|
||||
// 이거 너무 더럽잖아...
|
||||
// ?. 하드코딩 싫다 ㅜㅠ
|
||||
// 계량 아이템 보상 시작.
|
||||
// by rtsummit 고치자 진짜
|
||||
static struct DropEvent_RefineBox
|
||||
{
|
||||
int percent_low;
|
||||
@@ -1373,7 +1373,7 @@ bool DropEvent_RefineBox_SetValue(const std::string& name, int value)
|
||||
|
||||
return true;
|
||||
}
|
||||
// 개량 아이템 보상 끝.
|
||||
// 개량 아이템 보상 끝.
|
||||
|
||||
|
||||
void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller, std::vector<LPITEM> & vec_item, int iDeltaPercent, int iRandRange)
|
||||
@@ -1393,7 +1393,7 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller,
|
||||
// END_OF_DROPEVENT_CHARSTONE
|
||||
__DropEvent_RefineBox_DropItem(*pkKiller, *pkChr, *this, vec_item);
|
||||
|
||||
// 크리스마스 양말
|
||||
// 크리스마스 양말
|
||||
if (quest::CQuestManager::instance().GetEventFlag("xmas_sock"))
|
||||
{
|
||||
//const DWORD SOCK_ITEM_VNUM = 50010;
|
||||
@@ -1435,7 +1435,7 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller,
|
||||
}
|
||||
}
|
||||
|
||||
// 월광 보합
|
||||
// 월광 보합
|
||||
if (quest::CQuestManager::instance().GetEventFlag("drop_moon"))
|
||||
{
|
||||
const DWORD ITEM_VNUM = 50011;
|
||||
@@ -1481,10 +1481,10 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller,
|
||||
}
|
||||
}
|
||||
|
||||
//육각보합
|
||||
//육각보합
|
||||
if (GetDropPerKillPct(100, g_iUseLocale ? 2000 : 800, iDeltaPercent, "2006_drop") >= number(1, iRandRange))
|
||||
{
|
||||
sys_log(0, "육각보합 DROP EVENT ");
|
||||
sys_log(0, "육각보합 DROP EVENT ");
|
||||
|
||||
const static DWORD dwVnum = 50037;
|
||||
|
||||
@@ -1493,10 +1493,10 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller,
|
||||
|
||||
}
|
||||
|
||||
//육각보합+
|
||||
//육각보합+
|
||||
if (GetDropPerKillPct(100, g_iUseLocale ? 2000 : 800, iDeltaPercent, "2007_drop") >= number(1, iRandRange))
|
||||
{
|
||||
sys_log(0, "육각보합 DROP EVENT ");
|
||||
sys_log(0, "육각보합 DROP EVENT ");
|
||||
|
||||
const static DWORD dwVnum = 50043;
|
||||
|
||||
@@ -1504,17 +1504,17 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller,
|
||||
vec_item.push_back(item);
|
||||
}
|
||||
|
||||
// 새해 폭죽 이벤트
|
||||
// 새해 폭죽 이벤트
|
||||
if (GetDropPerKillPct(/* minimum */ 100, /* default */ 1000, iDeltaPercent, "newyear_fire") >= number(1, iRandRange))
|
||||
{
|
||||
// 중국은 폭죽, 한국 팽이
|
||||
// 중국은 폭죽, 한국 팽이
|
||||
const DWORD ITEM_VNUM_FIRE = g_iUseLocale ? 50107 : 50108;
|
||||
|
||||
if ((item = CreateItem(ITEM_VNUM_FIRE, 1, 0, true)))
|
||||
vec_item.push_back(item);
|
||||
}
|
||||
|
||||
// 새해 대보름 원소 이벤트
|
||||
// 새해 대보름 원소 이벤트
|
||||
if (GetDropPerKillPct(100, 500, iDeltaPercent, "newyear_moon") >= number(1, iRandRange))
|
||||
{
|
||||
sys_log(0, "EVENT NEWYEAR_MOON DROP");
|
||||
@@ -1526,7 +1526,7 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller,
|
||||
vec_item.push_back(item);
|
||||
}
|
||||
|
||||
// 발렌타인 데이 이벤트. OGE의 요구에 따라 event 최소값을 1로 변경.(다른 이벤트는 일단 그대로 둠.)
|
||||
// 발렌타인 데이 이벤트. OGE의 요구에 따라 event 최소값을 1로 변경.(다른 이벤트는 일단 그대로 둠.)
|
||||
if (GetDropPerKillPct(1, g_iUseLocale ? 2000 : 800, iDeltaPercent, "valentine_drop") >= number(1, iRandRange))
|
||||
{
|
||||
sys_log(0, "EVENT VALENTINE_DROP");
|
||||
@@ -1538,7 +1538,7 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller,
|
||||
vec_item.push_back(item);
|
||||
}
|
||||
|
||||
// 아이스크림 이벤트
|
||||
// 아이스크림 이벤트
|
||||
if (GetDropPerKillPct(100, g_iUseLocale ? 2000 : 800, iDeltaPercent, "icecream_drop") >= number(1, iRandRange))
|
||||
{
|
||||
const static DWORD icecream = 50123;
|
||||
@@ -1547,8 +1547,8 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller,
|
||||
vec_item.push_back(item);
|
||||
}
|
||||
|
||||
// new 크리스마스 이벤트
|
||||
// 53002 : 아기 순록 소환권
|
||||
// new 크리스마스 이벤트
|
||||
// 53002 : 아기 순록 소환권
|
||||
if ((pkKiller->CountSpecifyItem(53002) > 0) && (GetDropPerKillPct(50, 100, iDeltaPercent, "new_xmas_event") >= number(1, iRandRange)))
|
||||
{
|
||||
const static DWORD xmas_sock = 50010;
|
||||
@@ -1592,7 +1592,7 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller,
|
||||
vec_item.push_back(item);
|
||||
}
|
||||
|
||||
// 월드컵 이벤트
|
||||
// 월드컵 이벤트
|
||||
if ( GetDropPerKillPct(100, g_iUseLocale ? 2000 : 800, iDeltaPercent, "football_drop") >= number(1, iRandRange) )
|
||||
{
|
||||
const static DWORD football_item = 50096;
|
||||
@@ -1601,7 +1601,7 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller,
|
||||
vec_item.push_back(item);
|
||||
}
|
||||
|
||||
// 화이트 데이 이벤트
|
||||
// 화이트 데이 이벤트
|
||||
if (GetDropPerKillPct(100, g_iUseLocale ? 2000 : 800, iDeltaPercent, "whiteday_drop") >= number(1, iRandRange))
|
||||
{
|
||||
sys_log(0, "EVENT WHITEDAY_DROP");
|
||||
@@ -1612,7 +1612,7 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller,
|
||||
vec_item.push_back(item);
|
||||
}
|
||||
|
||||
// 어린이날 수수께끼 상자 이벤트
|
||||
// 어린이날 수수께끼 상자 이벤트
|
||||
if (pkKiller->GetLevel()>=50)
|
||||
{
|
||||
if (GetDropPerKillPct(100, 1000, iDeltaPercent, "kids_day_drop_high") >= number(1, iRandRange))
|
||||
@@ -1634,7 +1634,7 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller,
|
||||
}
|
||||
}
|
||||
|
||||
// 올림픽 드롭 이벤트
|
||||
// 올림픽 드롭 이벤트
|
||||
if (pkChr->GetLevel() >= 30 && GetDropPerKillPct(50, 100, iDeltaPercent, "medal_part_drop") >= number(1, iRandRange))
|
||||
{
|
||||
const static DWORD drop_items[] = { 30265, 30266, 30267, 30268, 30269 };
|
||||
@@ -1645,7 +1645,7 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller,
|
||||
}
|
||||
|
||||
// ADD_GRANDMASTER_SKILL
|
||||
// 혼석 아이템 드롭
|
||||
// 혼석 아이템 드롭
|
||||
if (pkChr->GetLevel() >= 40 && pkChr->GetMobRank() >= MOB_RANK_BOSS && GetDropPerKillPct(/* minimum */ 1, /* default */ 1000, iDeltaPercent, "three_skill_item") / GetThreeSkillLevelAdjust(pkChr->GetLevel()) >= number(1, iRandRange))
|
||||
{
|
||||
const DWORD ITEM_VNUM = 50513;
|
||||
@@ -1656,7 +1656,7 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller,
|
||||
// END_OF_ADD_GRANDMASTER_SKILL
|
||||
|
||||
//
|
||||
// 종자 아이템 drop
|
||||
// 종자 아이템 drop
|
||||
//
|
||||
if (GetDropPerKillPct(100, 1000, iDeltaPercent, "dragon_boat_festival_drop") >= number(1, iRandRange))
|
||||
{
|
||||
@@ -1666,7 +1666,7 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller,
|
||||
vec_item.push_back(item);
|
||||
}
|
||||
|
||||
// 무신의 축복서용 만년한철 drop
|
||||
// 무신의 축복서용 만년한철 drop
|
||||
if (pkKiller->GetLevel() >= 15 && quest::CQuestManager::instance().GetEventFlag("mars_drop"))
|
||||
{
|
||||
const DWORD ITEM_HANIRON = 70035;
|
||||
@@ -1728,8 +1728,8 @@ DWORD ITEM_MANAGER::GetMaskVnum(DWORD dwVnum)
|
||||
return 0;
|
||||
}
|
||||
|
||||
// pkNewItem으로 모든 속성과 소켓 값들을 목사하는 함수.
|
||||
// 기존에 char_item.cpp 파일에 있던 로컬함수인 TransformRefineItem 그대로 복사함
|
||||
// pkNewItem으로 모든 속성과 소켓 값들을 목사하는 함수.
|
||||
// 기존에 char_item.cpp 파일에 있던 로컬함수인 TransformRefineItem 그대로 복사함
|
||||
void ITEM_MANAGER::CopyAllAttrTo(LPITEM pkOldItem, LPITEM pkNewItem)
|
||||
{
|
||||
// ACCESSORY_REFINE
|
||||
@@ -1744,7 +1744,7 @@ void ITEM_MANAGER::CopyAllAttrTo(LPITEM pkOldItem, LPITEM pkNewItem)
|
||||
// END_OF_ACCESSORY_REFINE
|
||||
else
|
||||
{
|
||||
// 여기서 깨진석이 자동적으로 청소 됨
|
||||
// 여기서 깨진석이 자동적으로 청소 됨
|
||||
for (int i = 0; i < ITEM_SOCKET_MAX_NUM; ++i)
|
||||
{
|
||||
if (!pkOldItem->GetSocket(i))
|
||||
@@ -1753,19 +1753,19 @@ void ITEM_MANAGER::CopyAllAttrTo(LPITEM pkOldItem, LPITEM pkNewItem)
|
||||
pkNewItem->SetSocket(i, 1);
|
||||
}
|
||||
|
||||
// 소켓 설정
|
||||
// 소켓 설정
|
||||
int slot = 0;
|
||||
|
||||
for (int i = 0; i < ITEM_SOCKET_MAX_NUM; ++i)
|
||||
{
|
||||
long socket = pkOldItem->GetSocket(i);
|
||||
const int ITEM_BROKEN_METIN_VNUM = 28960; // 이건 뭐 똑같은 상수가 3군데나 있냐... 하나로 해놓지ㅠㅠㅠ 나는 패스 홍이 할꺼임
|
||||
const int ITEM_BROKEN_METIN_VNUM = 28960; // 이건 뭐 똑같은 상수가 3군데나 있냐... 하나로 해놓지ㅠㅠㅠ 나는 패스 홍이 할꺼임
|
||||
if (socket > 2 && socket != ITEM_BROKEN_METIN_VNUM)
|
||||
pkNewItem->SetSocket(slot++, socket);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// 매직 아이템 설정
|
||||
// 매직 아이템 설정
|
||||
pkOldItem->CopyAttributeTo(pkNewItem);
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#include "stdafx.h"
|
||||
癤<EFBFBD>#include "stdafx.h"
|
||||
#include "utils.h"
|
||||
#include "config.h"
|
||||
#include "char.h"
|
||||
|
||||
919
src/game/item_manager_read_tables.cpp.bak
Normal file
919
src/game/item_manager_read_tables.cpp.bak
Normal file
@@ -0,0 +1,919 @@
|
||||
#include "stdafx.h"
|
||||
#include "utils.h"
|
||||
#include "config.h"
|
||||
#include "char.h"
|
||||
#include "char_manager.h"
|
||||
#include "desc_client.h"
|
||||
#include "db.h"
|
||||
#include "log.h"
|
||||
#include "skill.h"
|
||||
#include "text_file_loader.h"
|
||||
#include "priv_manager.h"
|
||||
#include "questmanager.h"
|
||||
#include "unique_item.h"
|
||||
#include "safebox.h"
|
||||
#include "blend_item.h"
|
||||
#include "dev_log.h"
|
||||
#include "locale_service.h"
|
||||
#include "item.h"
|
||||
#include "item_manager.h"
|
||||
#include "item_manager_private_types.h"
|
||||
#include "group_text_parse_tree.h"
|
||||
|
||||
std::vector<CItemDropInfo> g_vec_pkCommonDropItem[MOB_RANK_MAX_NUM];
|
||||
|
||||
bool ITEM_MANAGER::ReadCommonDropItemFile(const char * c_pszFileName)
|
||||
{
|
||||
FILE * fp = fopen(c_pszFileName, "r");
|
||||
|
||||
if (!fp)
|
||||
{
|
||||
sys_err("Cannot open %s", c_pszFileName);
|
||||
return false;
|
||||
}
|
||||
|
||||
char buf[1024];
|
||||
|
||||
int lines = 0;
|
||||
|
||||
while (fgets(buf, 1024, fp))
|
||||
{
|
||||
++lines;
|
||||
|
||||
if (!*buf || *buf == '\n')
|
||||
continue;
|
||||
|
||||
TDropItem d[MOB_RANK_MAX_NUM];
|
||||
char szTemp[64];
|
||||
|
||||
memset(&d, 0, sizeof(d));
|
||||
|
||||
char * p = buf;
|
||||
char * p2;
|
||||
|
||||
for (int i = 0; i <= MOB_RANK_S_KNIGHT; ++i)
|
||||
{
|
||||
for (int j = 0; j < 6; ++j)
|
||||
{
|
||||
p2 = strchr(p, '\t');
|
||||
|
||||
if (!p2)
|
||||
break;
|
||||
|
||||
strlcpy(szTemp, p, MIN(sizeof(szTemp), (p2 - p) + 1));
|
||||
p = p2 + 1;
|
||||
|
||||
switch (j)
|
||||
{
|
||||
case 0: break;
|
||||
case 1: str_to_number(d[i].iLvStart, szTemp); break;
|
||||
case 2: str_to_number(d[i].iLvEnd, szTemp); break;
|
||||
case 3: d[i].fPercent = atof(szTemp); break;
|
||||
case 4: strlcpy(d[i].szItemName, szTemp, sizeof(d[i].szItemName)); break;
|
||||
case 5: str_to_number(d[i].iCount, szTemp); break;
|
||||
}
|
||||
}
|
||||
|
||||
DWORD dwPct = (DWORD) (d[i].fPercent * 10000.0f);
|
||||
DWORD dwItemVnum = 0;
|
||||
|
||||
if (!ITEM_MANAGER::instance().GetVnumByOriginalName(d[i].szItemName, dwItemVnum))
|
||||
{
|
||||
// 이름으로 못찾으면 번호로 검색
|
||||
str_to_number(dwItemVnum, d[i].szItemName);
|
||||
if (!ITEM_MANAGER::instance().GetTable(dwItemVnum))
|
||||
{
|
||||
sys_err("No such an item (name: %s)", d[i].szItemName);
|
||||
fclose(fp);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (d[i].iLvStart == 0)
|
||||
continue;
|
||||
|
||||
g_vec_pkCommonDropItem[i].push_back(CItemDropInfo(d[i].iLvStart, d[i].iLvEnd, dwPct, dwItemVnum));
|
||||
}
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
|
||||
for (int i = 0; i < MOB_RANK_MAX_NUM; ++i)
|
||||
{
|
||||
std::vector<CItemDropInfo> & v = g_vec_pkCommonDropItem[i];
|
||||
std::sort(v.begin(), v.end());
|
||||
|
||||
std::vector<CItemDropInfo>::iterator it = v.begin();
|
||||
|
||||
sys_log(1, "CommonItemDrop rank %d", i);
|
||||
|
||||
while (it != v.end())
|
||||
{
|
||||
const CItemDropInfo & c = *(it++);
|
||||
sys_log(1, "CommonItemDrop %d %d %d %u", c.m_iLevelStart, c.m_iLevelEnd, c.m_iPercent, c.m_dwVnum);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ITEM_MANAGER::ReadSpecialDropItemFile(const char * c_pszFileName)
|
||||
{
|
||||
CTextFileLoader loader;
|
||||
|
||||
if (!loader.Load(c_pszFileName))
|
||||
return false;
|
||||
|
||||
std::string stName;
|
||||
|
||||
for (DWORD i = 0; i < loader.GetChildNodeCount(); ++i)
|
||||
{
|
||||
loader.SetChildNode(i);
|
||||
|
||||
loader.GetCurrentNodeName(&stName);
|
||||
|
||||
int iVnum;
|
||||
|
||||
if (!loader.GetTokenInteger("vnum", &iVnum))
|
||||
{
|
||||
sys_err("ReadSpecialDropItemFile : Syntax error %s : no vnum, node %s", c_pszFileName, stName.c_str());
|
||||
loader.SetParentNode();
|
||||
return false;
|
||||
}
|
||||
|
||||
sys_log(0,"DROP_ITEM_GROUP %s %d", stName.c_str(), iVnum);
|
||||
|
||||
TTokenVector * pTok;
|
||||
|
||||
//
|
||||
std::string stType;
|
||||
int type = CSpecialItemGroup::NORMAL;
|
||||
if (loader.GetTokenString("type", &stType))
|
||||
{
|
||||
stl_lowers(stType);
|
||||
if (stType == "pct")
|
||||
{
|
||||
type = CSpecialItemGroup::PCT;
|
||||
}
|
||||
else if (stType == "quest")
|
||||
{
|
||||
type = CSpecialItemGroup::QUEST;
|
||||
quest::CQuestManager::instance().RegisterNPCVnum(iVnum);
|
||||
}
|
||||
else if (stType == "special")
|
||||
{
|
||||
type = CSpecialItemGroup::SPECIAL;
|
||||
}
|
||||
}
|
||||
|
||||
if ("attr" == stType)
|
||||
{
|
||||
CSpecialAttrGroup * pkGroup = M2_NEW CSpecialAttrGroup(iVnum);
|
||||
for (int k = 1; k < 256; ++k)
|
||||
{
|
||||
char buf[4];
|
||||
snprintf(buf, sizeof(buf), "%d", k);
|
||||
|
||||
if (loader.GetTokenVector(buf, &pTok))
|
||||
{
|
||||
DWORD apply_type = 0;
|
||||
int apply_value = 0;
|
||||
str_to_number(apply_type, pTok->at(0).c_str());
|
||||
if (0 == apply_type)
|
||||
{
|
||||
apply_type = FN_get_apply_type(pTok->at(0).c_str());
|
||||
if (0 == apply_type)
|
||||
{
|
||||
sys_err ("Invalid APPLY_TYPE %s in Special Item Group Vnum %d", pTok->at(0).c_str(), iVnum);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
str_to_number(apply_value, pTok->at(1).c_str());
|
||||
if (apply_type > MAX_APPLY_NUM)
|
||||
{
|
||||
sys_err ("Invalid APPLY_TYPE %u in Special Item Group Vnum %d", apply_type, iVnum);
|
||||
M2_DELETE(pkGroup);
|
||||
return false;
|
||||
}
|
||||
pkGroup->m_vecAttrs.push_back(CSpecialAttrGroup::CSpecialAttrInfo(apply_type, apply_value));
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (loader.GetTokenVector("effect", &pTok))
|
||||
{
|
||||
pkGroup->m_stEffectFileName = pTok->at(0);
|
||||
}
|
||||
loader.SetParentNode();
|
||||
m_map_pkSpecialAttrGroup.insert(std::make_pair(iVnum, pkGroup));
|
||||
}
|
||||
else
|
||||
{
|
||||
CSpecialItemGroup * pkGroup = M2_NEW CSpecialItemGroup(iVnum, type);
|
||||
for (int k = 1; k < 256; ++k)
|
||||
{
|
||||
char buf[4];
|
||||
snprintf(buf, sizeof(buf), "%d", k);
|
||||
|
||||
if (loader.GetTokenVector(buf, &pTok))
|
||||
{
|
||||
const std::string& name = pTok->at(0);
|
||||
DWORD dwVnum = 0;
|
||||
|
||||
if (!GetVnumByOriginalName(name.c_str(), dwVnum))
|
||||
{
|
||||
if (name == "경험치" || name == "exp")
|
||||
{
|
||||
dwVnum = CSpecialItemGroup::EXP;
|
||||
}
|
||||
else if (name == "mob")
|
||||
{
|
||||
dwVnum = CSpecialItemGroup::MOB;
|
||||
}
|
||||
else if (name == "slow")
|
||||
{
|
||||
dwVnum = CSpecialItemGroup::SLOW;
|
||||
}
|
||||
else if (name == "drain_hp")
|
||||
{
|
||||
dwVnum = CSpecialItemGroup::DRAIN_HP;
|
||||
}
|
||||
else if (name == "poison")
|
||||
{
|
||||
dwVnum = CSpecialItemGroup::POISON;
|
||||
}
|
||||
else if (name == "group")
|
||||
{
|
||||
dwVnum = CSpecialItemGroup::MOB_GROUP;
|
||||
}
|
||||
else
|
||||
{
|
||||
str_to_number(dwVnum, name.c_str());
|
||||
if (!ITEM_MANAGER::instance().GetTable(dwVnum))
|
||||
{
|
||||
sys_err("ReadSpecialDropItemFile : there is no item %s : node %s", name.c_str(), stName.c_str());
|
||||
M2_DELETE(pkGroup);
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int iCount = 0;
|
||||
str_to_number(iCount, pTok->at(1).c_str());
|
||||
int iProb = 0;
|
||||
str_to_number(iProb, pTok->at(2).c_str());
|
||||
|
||||
int iRarePct = 0;
|
||||
if (pTok->size() > 3)
|
||||
{
|
||||
str_to_number(iRarePct, pTok->at(3).c_str());
|
||||
}
|
||||
|
||||
sys_log(0," name %s count %d prob %d rare %d", name.c_str(), iCount, iProb, iRarePct);
|
||||
pkGroup->AddItem(dwVnum, iCount, iProb, iRarePct);
|
||||
|
||||
// CHECK_UNIQUE_GROUP
|
||||
if (iVnum < 30000)
|
||||
{
|
||||
m_ItemToSpecialGroup[dwVnum] = iVnum;
|
||||
}
|
||||
// END_OF_CHECK_UNIQUE_GROUP
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
loader.SetParentNode();
|
||||
if (CSpecialItemGroup::QUEST == type)
|
||||
{
|
||||
m_map_pkQuestItemGroup.insert(std::make_pair(iVnum, pkGroup));
|
||||
}
|
||||
else
|
||||
{
|
||||
m_map_pkSpecialItemGroup.insert(std::make_pair(iVnum, pkGroup));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool ITEM_MANAGER::ConvSpecialDropItemFile()
|
||||
{
|
||||
char szSpecialItemGroupFileName[256];
|
||||
snprintf(szSpecialItemGroupFileName, sizeof(szSpecialItemGroupFileName),
|
||||
"%s/special_item_group.txt", LocaleService_GetBasePath().c_str());
|
||||
|
||||
FILE *fp = fopen("special_item_group_vnum.txt", "w");
|
||||
if (!fp)
|
||||
{
|
||||
sys_err("could not open file (%s)", "special_item_group_vnum.txt");
|
||||
return false;
|
||||
}
|
||||
|
||||
CTextFileLoader loader;
|
||||
|
||||
if (!loader.Load(szSpecialItemGroupFileName))
|
||||
{
|
||||
fclose(fp);
|
||||
return false;
|
||||
}
|
||||
|
||||
std::string stName;
|
||||
|
||||
for (DWORD i = 0; i < loader.GetChildNodeCount(); ++i)
|
||||
{
|
||||
loader.SetChildNode(i);
|
||||
|
||||
loader.GetCurrentNodeName(&stName);
|
||||
|
||||
int iVnum;
|
||||
|
||||
if (!loader.GetTokenInteger("vnum", &iVnum))
|
||||
{
|
||||
sys_err("ConvSpecialDropItemFile : Syntax error %s : no vnum, node %s", szSpecialItemGroupFileName, stName.c_str());
|
||||
loader.SetParentNode();
|
||||
fclose(fp);
|
||||
return false;
|
||||
}
|
||||
|
||||
std::string str;
|
||||
int type = 0;
|
||||
if (loader.GetTokenString("type", &str))
|
||||
{
|
||||
stl_lowers(str);
|
||||
if (str == "pct")
|
||||
{
|
||||
type = 1;
|
||||
}
|
||||
}
|
||||
|
||||
TTokenVector * pTok;
|
||||
|
||||
fprintf(fp, "Group %s\n", stName.c_str());
|
||||
fprintf(fp, "{\n");
|
||||
fprintf(fp, " Vnum %i\n", iVnum);
|
||||
if (type)
|
||||
fprintf(fp, " Type Pct");
|
||||
|
||||
for (int k = 1; k < 256; ++k)
|
||||
{
|
||||
char buf[4];
|
||||
snprintf(buf, sizeof(buf), "%d", k);
|
||||
|
||||
if (loader.GetTokenVector(buf, &pTok))
|
||||
{
|
||||
const std::string& name = pTok->at(0);
|
||||
DWORD dwVnum = 0;
|
||||
|
||||
if (!GetVnumByOriginalName(name.c_str(), dwVnum))
|
||||
{
|
||||
if ( name == "경험치" ||
|
||||
name == "mob" ||
|
||||
name == "slow" ||
|
||||
name == "drain_hp" ||
|
||||
name == "poison" ||
|
||||
name == "group")
|
||||
{
|
||||
dwVnum = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
str_to_number(dwVnum, name.c_str());
|
||||
if (!ITEM_MANAGER::instance().GetTable(dwVnum))
|
||||
{
|
||||
sys_err("ReadSpecialDropItemFile : there is no item %s : node %s", name.c_str(), stName.c_str());
|
||||
fclose(fp);
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int iCount = 0;
|
||||
str_to_number(iCount, pTok->at(1).c_str());
|
||||
int iProb = 0;
|
||||
str_to_number(iProb, pTok->at(2).c_str());
|
||||
|
||||
int iRarePct = 0;
|
||||
if (pTok->size() > 3)
|
||||
{
|
||||
str_to_number(iRarePct, pTok->at(3).c_str());
|
||||
}
|
||||
|
||||
// 1 "기술 수련서" 1 100
|
||||
if (0 == dwVnum)
|
||||
fprintf(fp, " %d %s %d %d\n", k, name.c_str(), iCount, iProb);
|
||||
else
|
||||
fprintf(fp, " %d %u %d %d\n", k, dwVnum, iCount, iProb);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
fprintf(fp, "}\n");
|
||||
fprintf(fp, "\n");
|
||||
|
||||
loader.SetParentNode();
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ITEM_MANAGER::ReadEtcDropItemFile(const char * c_pszFileName)
|
||||
{
|
||||
FILE * fp = fopen(c_pszFileName, "r");
|
||||
|
||||
if (!fp)
|
||||
{
|
||||
sys_err("Cannot open %s", c_pszFileName);
|
||||
return false;
|
||||
}
|
||||
|
||||
char buf[512];
|
||||
|
||||
int lines = 0;
|
||||
|
||||
while (fgets(buf, 512, fp))
|
||||
{
|
||||
++lines;
|
||||
|
||||
if (!*buf || *buf == '\n')
|
||||
continue;
|
||||
|
||||
char szItemName[256];
|
||||
float fProb = 0.0f;
|
||||
|
||||
strlcpy(szItemName, buf, sizeof(szItemName));
|
||||
char * cpTab = strrchr(szItemName, '\t');
|
||||
|
||||
if (!cpTab)
|
||||
continue;
|
||||
|
||||
*cpTab = '\0';
|
||||
fProb = atof(cpTab + 1);
|
||||
|
||||
if (!*szItemName || fProb == 0.0f)
|
||||
continue;
|
||||
|
||||
DWORD dwItemVnum;
|
||||
|
||||
if (!ITEM_MANAGER::instance().GetVnumByOriginalName(szItemName, dwItemVnum))
|
||||
{
|
||||
sys_err("No such an item (name: %s)", szItemName);
|
||||
fclose(fp);
|
||||
return false;
|
||||
}
|
||||
|
||||
m_map_dwEtcItemDropProb[dwItemVnum] = (DWORD) (fProb * 10000.0f);
|
||||
sys_log(0, "ETC_DROP_ITEM: %s prob %f", szItemName, fProb);
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ITEM_MANAGER::ReadMonsterDropItemGroup(const char * c_pszFileName)
|
||||
{
|
||||
CTextFileLoader loader;
|
||||
|
||||
if (!loader.Load(c_pszFileName))
|
||||
return false;
|
||||
|
||||
for (DWORD i = 0; i < loader.GetChildNodeCount(); ++i)
|
||||
{
|
||||
std::string stName("");
|
||||
|
||||
loader.GetCurrentNodeName(&stName);
|
||||
|
||||
if (strncmp (stName.c_str(), "kr_", 3) == 0)
|
||||
{
|
||||
if (LC_IsYMIR())
|
||||
{
|
||||
stName.assign(stName, 3, stName.size() - 3);
|
||||
}
|
||||
else
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
loader.SetChildNode(i);
|
||||
|
||||
int iMobVnum = 0;
|
||||
int iKillDrop = 0;
|
||||
int iLevelLimit = 0;
|
||||
|
||||
std::string strType("");
|
||||
|
||||
if (!loader.GetTokenString("type", &strType))
|
||||
{
|
||||
sys_err("ReadMonsterDropItemGroup : Syntax error %s : no type (kill|drop), node %s", c_pszFileName, stName.c_str());
|
||||
loader.SetParentNode();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!loader.GetTokenInteger("mob", &iMobVnum))
|
||||
{
|
||||
sys_err("ReadMonsterDropItemGroup : Syntax error %s : no mob vnum, node %s", c_pszFileName, stName.c_str());
|
||||
loader.SetParentNode();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (strType == "kill")
|
||||
{
|
||||
if (!loader.GetTokenInteger("kill_drop", &iKillDrop))
|
||||
{
|
||||
sys_err("ReadMonsterDropItemGroup : Syntax error %s : no kill drop count, node %s", c_pszFileName, stName.c_str());
|
||||
loader.SetParentNode();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
iKillDrop = 1;
|
||||
}
|
||||
|
||||
if ( strType == "limit" )
|
||||
{
|
||||
if ( !loader.GetTokenInteger("level_limit", &iLevelLimit) )
|
||||
{
|
||||
sys_err("ReadmonsterDropItemGroup : Syntax error %s : no level_limit, node %s", c_pszFileName, stName.c_str());
|
||||
loader.SetParentNode();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
iLevelLimit = 0;
|
||||
}
|
||||
|
||||
sys_log(0,"MOB_ITEM_GROUP %s [%s] %d %d", stName.c_str(), strType.c_str(), iMobVnum, iKillDrop);
|
||||
|
||||
if (iKillDrop == 0)
|
||||
{
|
||||
loader.SetParentNode();
|
||||
continue;
|
||||
}
|
||||
|
||||
TTokenVector* pTok = NULL;
|
||||
|
||||
if (strType == "kill")
|
||||
{
|
||||
CMobItemGroup * pkGroup = M2_NEW CMobItemGroup(iMobVnum, iKillDrop, stName);
|
||||
|
||||
for (int k = 1; k < 256; ++k)
|
||||
{
|
||||
char buf[4];
|
||||
snprintf(buf, sizeof(buf), "%d", k);
|
||||
|
||||
if (loader.GetTokenVector(buf, &pTok))
|
||||
{
|
||||
//sys_log(1, " %s %s", pTok->at(0).c_str(), pTok->at(1).c_str());
|
||||
std::string& name = pTok->at(0);
|
||||
DWORD dwVnum = 0;
|
||||
|
||||
if (!GetVnumByOriginalName(name.c_str(), dwVnum))
|
||||
{
|
||||
str_to_number(dwVnum, name.c_str());
|
||||
if (!ITEM_MANAGER::instance().GetTable(dwVnum))
|
||||
{
|
||||
sys_err("ReadMonsterDropItemGroup : there is no item %s : node %s : vnum %d", name.c_str(), stName.c_str(), dwVnum);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
int iCount = 0;
|
||||
str_to_number(iCount, pTok->at(1).c_str());
|
||||
|
||||
if (iCount<1)
|
||||
{
|
||||
sys_err("ReadMonsterDropItemGroup : there is no count for item %s : node %s : vnum %d, count %d", name.c_str(), stName.c_str(), dwVnum, iCount);
|
||||
return false;
|
||||
}
|
||||
|
||||
int iPartPct = 0;
|
||||
str_to_number(iPartPct, pTok->at(2).c_str());
|
||||
|
||||
if (iPartPct == 0)
|
||||
{
|
||||
sys_err("ReadMonsterDropItemGroup : there is no drop percent for item %s : node %s : vnum %d, count %d, pct %d", name.c_str(), stName.c_str(), iPartPct);
|
||||
return false;
|
||||
}
|
||||
|
||||
int iRarePct = 0;
|
||||
str_to_number(iRarePct, pTok->at(3).c_str());
|
||||
iRarePct = MINMAX(0, iRarePct, 100);
|
||||
|
||||
sys_log(0," %s count %d rare %d", name.c_str(), iCount, iRarePct);
|
||||
pkGroup->AddItem(dwVnum, iCount, iPartPct, iRarePct);
|
||||
continue;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
m_map_pkMobItemGroup.insert(std::map<DWORD, CMobItemGroup*>::value_type(iMobVnum, pkGroup));
|
||||
|
||||
}
|
||||
else if (strType == "drop")
|
||||
{
|
||||
CDropItemGroup* pkGroup;
|
||||
bool bNew = true;
|
||||
itertype(m_map_pkDropItemGroup) it = m_map_pkDropItemGroup.find (iMobVnum);
|
||||
if (it == m_map_pkDropItemGroup.end())
|
||||
{
|
||||
pkGroup = M2_NEW CDropItemGroup(0, iMobVnum, stName);
|
||||
}
|
||||
else
|
||||
{
|
||||
bNew = false;
|
||||
pkGroup = it->second;
|
||||
}
|
||||
|
||||
for (int k = 1; k < 256; ++k)
|
||||
{
|
||||
char buf[4];
|
||||
snprintf(buf, sizeof(buf), "%d", k);
|
||||
|
||||
if (loader.GetTokenVector(buf, &pTok))
|
||||
{
|
||||
std::string& name = pTok->at(0);
|
||||
DWORD dwVnum = 0;
|
||||
|
||||
if (!GetVnumByOriginalName(name.c_str(), dwVnum))
|
||||
{
|
||||
str_to_number(dwVnum, name.c_str());
|
||||
if (!ITEM_MANAGER::instance().GetTable(dwVnum))
|
||||
{
|
||||
sys_err("ReadDropItemGroup : there is no item %s : node %s", name.c_str(), stName.c_str());
|
||||
M2_DELETE(pkGroup);
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
int iCount = 0;
|
||||
str_to_number(iCount, pTok->at(1).c_str());
|
||||
|
||||
if (iCount < 1)
|
||||
{
|
||||
sys_err("ReadMonsterDropItemGroup : there is no count for item %s : node %s", name.c_str(), stName.c_str());
|
||||
M2_DELETE(pkGroup);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
float fPercent = atof(pTok->at(2).c_str());
|
||||
|
||||
DWORD dwPct = (DWORD)(10000.0f * fPercent);
|
||||
|
||||
sys_log(0," name %s pct %d count %d", name.c_str(), dwPct, iCount);
|
||||
pkGroup->AddItem(dwVnum, dwPct, iCount);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
if (bNew)
|
||||
m_map_pkDropItemGroup.insert(std::map<DWORD, CDropItemGroup*>::value_type(iMobVnum, pkGroup));
|
||||
|
||||
}
|
||||
else if ( strType == "limit" )
|
||||
{
|
||||
CLevelItemGroup* pkLevelItemGroup = M2_NEW CLevelItemGroup(iLevelLimit);
|
||||
|
||||
for ( int k=1; k < 256; k++ )
|
||||
{
|
||||
char buf[4];
|
||||
snprintf(buf, sizeof(buf), "%d", k);
|
||||
|
||||
if ( loader.GetTokenVector(buf, &pTok) )
|
||||
{
|
||||
std::string& name = pTok->at(0);
|
||||
DWORD dwItemVnum = 0;
|
||||
|
||||
if (false == GetVnumByOriginalName(name.c_str(), dwItemVnum))
|
||||
{
|
||||
str_to_number(dwItemVnum, name.c_str());
|
||||
if ( !ITEM_MANAGER::instance().GetTable(dwItemVnum) )
|
||||
{
|
||||
M2_DELETE(pkLevelItemGroup);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
int iCount = 0;
|
||||
str_to_number(iCount, pTok->at(1).c_str());
|
||||
|
||||
if (iCount < 1)
|
||||
{
|
||||
M2_DELETE(pkLevelItemGroup);
|
||||
return false;
|
||||
}
|
||||
|
||||
float fPct = atof(pTok->at(2).c_str());
|
||||
DWORD dwPct = (DWORD)(10000.0f * fPct);
|
||||
|
||||
pkLevelItemGroup->AddItem(dwItemVnum, dwPct, iCount);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
m_map_pkLevelItemGroup.insert(std::map<DWORD, CLevelItemGroup*>::value_type(iMobVnum, pkLevelItemGroup));
|
||||
}
|
||||
else if (strType == "thiefgloves")
|
||||
{
|
||||
CBuyerThiefGlovesItemGroup* pkGroup = M2_NEW CBuyerThiefGlovesItemGroup(0, iMobVnum, stName);
|
||||
|
||||
for (int k = 1; k < 256; ++k)
|
||||
{
|
||||
char buf[4];
|
||||
snprintf(buf, sizeof(buf), "%d", k);
|
||||
|
||||
if (loader.GetTokenVector(buf, &pTok))
|
||||
{
|
||||
std::string& name = pTok->at(0);
|
||||
DWORD dwVnum = 0;
|
||||
|
||||
if (!GetVnumByOriginalName(name.c_str(), dwVnum))
|
||||
{
|
||||
str_to_number(dwVnum, name.c_str());
|
||||
if (!ITEM_MANAGER::instance().GetTable(dwVnum))
|
||||
{
|
||||
sys_err("ReadDropItemGroup : there is no item %s : node %s", name.c_str(), stName.c_str());
|
||||
M2_DELETE(pkGroup);
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
int iCount = 0;
|
||||
str_to_number(iCount, pTok->at(1).c_str());
|
||||
|
||||
if (iCount < 1)
|
||||
{
|
||||
sys_err("ReadMonsterDropItemGroup : there is no count for item %s : node %s", name.c_str(), stName.c_str());
|
||||
M2_DELETE(pkGroup);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
float fPercent = atof(pTok->at(2).c_str());
|
||||
|
||||
DWORD dwPct = (DWORD)(10000.0f * fPercent);
|
||||
|
||||
sys_log(0," name %s pct %d count %d", name.c_str(), dwPct, iCount);
|
||||
pkGroup->AddItem(dwVnum, dwPct, iCount);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
m_map_pkGloveItemGroup.insert(std::map<DWORD, CBuyerThiefGlovesItemGroup*>::value_type(iMobVnum, pkGroup));
|
||||
}
|
||||
else
|
||||
{
|
||||
sys_err("ReadMonsterDropItemGroup : Syntax error %s : invalid type %s (kill|drop), node %s", c_pszFileName, strType.c_str(), stName.c_str());
|
||||
loader.SetParentNode();
|
||||
return false;
|
||||
}
|
||||
|
||||
loader.SetParentNode();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ITEM_MANAGER::ReadDropItemGroup(const char * c_pszFileName)
|
||||
{
|
||||
CTextFileLoader loader;
|
||||
|
||||
if (!loader.Load(c_pszFileName))
|
||||
return false;
|
||||
|
||||
std::string stName;
|
||||
|
||||
for (DWORD i = 0; i < loader.GetChildNodeCount(); ++i)
|
||||
{
|
||||
loader.SetChildNode(i);
|
||||
|
||||
loader.GetCurrentNodeName(&stName);
|
||||
|
||||
int iVnum;
|
||||
int iMobVnum;
|
||||
|
||||
if (!loader.GetTokenInteger("vnum", &iVnum))
|
||||
{
|
||||
sys_err("ReadDropItemGroup : Syntax error %s : no vnum, node %s", c_pszFileName, stName.c_str());
|
||||
loader.SetParentNode();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!loader.GetTokenInteger("mob", &iMobVnum))
|
||||
{
|
||||
sys_err("ReadDropItemGroup : Syntax error %s : no mob vnum, node %s", c_pszFileName, stName.c_str());
|
||||
loader.SetParentNode();
|
||||
return false;
|
||||
}
|
||||
|
||||
sys_log(0,"DROP_ITEM_GROUP %s %d", stName.c_str(), iMobVnum);
|
||||
|
||||
TTokenVector * pTok;
|
||||
|
||||
itertype(m_map_pkDropItemGroup) it = m_map_pkDropItemGroup.find(iMobVnum);
|
||||
|
||||
CDropItemGroup* pkGroup;
|
||||
|
||||
if (it == m_map_pkDropItemGroup.end())
|
||||
pkGroup = M2_NEW CDropItemGroup(iVnum, iMobVnum, stName);
|
||||
else
|
||||
pkGroup = it->second;
|
||||
|
||||
for (int k = 1; k < 256; ++k)
|
||||
{
|
||||
char buf[4];
|
||||
snprintf(buf, sizeof(buf), "%d", k);
|
||||
|
||||
if (loader.GetTokenVector(buf, &pTok))
|
||||
{
|
||||
std::string& name = pTok->at(0);
|
||||
DWORD dwVnum = 0;
|
||||
|
||||
if (!GetVnumByOriginalName(name.c_str(), dwVnum))
|
||||
{
|
||||
str_to_number(dwVnum, name.c_str());
|
||||
if (!ITEM_MANAGER::instance().GetTable(dwVnum))
|
||||
{
|
||||
sys_err("ReadDropItemGroup : there is no item %s : node %s", name.c_str(), stName.c_str());
|
||||
|
||||
if (it == m_map_pkDropItemGroup.end())
|
||||
M2_DELETE(pkGroup);
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
float fPercent = atof(pTok->at(1).c_str());
|
||||
|
||||
DWORD dwPct = (DWORD)(10000.0f * fPercent);
|
||||
|
||||
int iCount = 1;
|
||||
if (pTok->size() > 2)
|
||||
str_to_number(iCount, pTok->at(2).c_str());
|
||||
|
||||
if (iCount < 1)
|
||||
{
|
||||
sys_err("ReadDropItemGroup : there is no count for item %s : node %s", name.c_str(), stName.c_str());
|
||||
|
||||
if (it == m_map_pkDropItemGroup.end())
|
||||
M2_DELETE(pkGroup);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
sys_log(0," %s %d %d", name.c_str(), dwPct, iCount);
|
||||
pkGroup->AddItem(dwVnum, dwPct, iCount);
|
||||
continue;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if (it == m_map_pkDropItemGroup.end())
|
||||
m_map_pkDropItemGroup.insert(std::map<DWORD, CDropItemGroup*>::value_type(iMobVnum, pkGroup));
|
||||
|
||||
loader.SetParentNode();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ITEM_MANAGER::ReadItemVnumMaskTable(const char * c_pszFileName)
|
||||
{
|
||||
FILE *fp = fopen(c_pszFileName, "r");
|
||||
if (!fp)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
int ori_vnum, new_vnum;
|
||||
while (fscanf(fp, "%u %u", &ori_vnum, &new_vnum) != EOF)
|
||||
{
|
||||
m_map_new_to_ori.insert (TMapDW2DW::value_type (new_vnum, ori_vnum));
|
||||
}
|
||||
fclose(fp);
|
||||
return true;
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
#include "stdafx.h"
|
||||
#include "stdafx.h"
|
||||
#include "common/stl.h"
|
||||
#include "constants.h"
|
||||
#include "motion.h"
|
||||
@@ -476,7 +476,7 @@ bool CMotion::LoadMobSkillFromFile(const char * c_pszFileName, CMob* pMob, int i
|
||||
continue;
|
||||
|
||||
case MOTION_EVENT_TYPE_SPECIAL_ATTACKING:
|
||||
// 구 데이터는 하나 라고 가정
|
||||
// 구 데이터는 하나 라고 가정
|
||||
if (!rkTextFileLoader.SetChildNode("spheredata", 0))
|
||||
{
|
||||
sys_err("Motion: no sphere data %s", c_pszFileName);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#include "stdafx.h"
|
||||
癤<EFBFBD>#include "stdafx.h"
|
||||
#include <sstream>
|
||||
#include "constants.h"
|
||||
#include "char.h"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#include "stdafx.h"
|
||||
#include "stdafx.h"
|
||||
#include "questmanager.h"
|
||||
#include "char.h"
|
||||
#include "item.h"
|
||||
@@ -444,7 +444,7 @@ namespace quest
|
||||
ITEM_MANAGER::instance().FlushDelayedSave(pkNewItem);
|
||||
pkNewItem->AttrLog();
|
||||
|
||||
// ¼º°ø!
|
||||
// ¼º°ø!
|
||||
lua_pushboolean(L, 1);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#include "stdafx.h"
|
||||
#include "stdafx.h"
|
||||
#include "char.h"
|
||||
#include "char_manager.h"
|
||||
#include "wedding.h"
|
||||
@@ -169,7 +169,7 @@ namespace quest
|
||||
}
|
||||
if (pMarriage->pWeddingInfo)
|
||||
{
|
||||
// °áÈ¥½Ä ³¡³»±â ¿äû
|
||||
// 결혼식 끝내기 요청
|
||||
pMarriage->RequestEndWedding();
|
||||
}
|
||||
return 0;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#include "stdafx.h"
|
||||
#include "stdafx.h"
|
||||
#include "libgame/grid.h"
|
||||
#include "constants.h"
|
||||
#include "utils.h"
|
||||
@@ -69,7 +69,7 @@ bool CShopEx::AddGuest(LPCHARACTER ch,DWORD owner_vid, bool bOtherEmpire)
|
||||
|
||||
pack2.owner_vid = owner_vid;
|
||||
pack2.shop_tab_count = m_vec_shopTabs.size();
|
||||
char temp[8096]; // ÃÖ´ë 1728 * 3
|
||||
char temp[8096]; // ÃÖ´ë 1728 * 3
|
||||
char* buf = &temp[0];
|
||||
size_t size = 0;
|
||||
for (itertype(m_vec_shopTabs) it = m_vec_shopTabs.begin(); it != m_vec_shopTabs.end(); it++)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#include "stdafx.h"
|
||||
#include "stdafx.h"
|
||||
|
||||
static int global_time_gap = 0;
|
||||
|
||||
@@ -47,12 +47,12 @@ size_t str_lower(const char * src, char * dest, size_t dest_size)
|
||||
return len;
|
||||
}
|
||||
|
||||
// \0 자리 확보
|
||||
// \0 자리 확보
|
||||
--dest_size;
|
||||
|
||||
while (*src && len < dest_size)
|
||||
{
|
||||
*dest = LOWER(*src); // LOWER 매크로에서 ++나 --하면 안됨!!
|
||||
*dest = LOWER(*src); // LOWER 매크로에서 ++나 --하면 안됨!!
|
||||
|
||||
++src;
|
||||
++dest;
|
||||
@@ -80,7 +80,7 @@ const char *one_argument(const char *argument, char *first_arg, size_t first_siz
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// \0 자리 확보
|
||||
// \0 자리 확보
|
||||
--first_size;
|
||||
|
||||
skip_spaces(&argument);
|
||||
@@ -118,7 +118,7 @@ const char *first_cmd(const char *argument, char *first_arg, size_t first_arg_si
|
||||
size_t cur_len = 0;
|
||||
skip_spaces(&argument);
|
||||
|
||||
// \0 자리 확보
|
||||
// \0 자리 확보
|
||||
first_arg_size -= 1;
|
||||
|
||||
while (*argument && !isnhspace(*argument) && cur_len < first_arg_size)
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
#ifndef __INC_XMAS_EVENT_H
|
||||
#ifndef __INC_XMAS_EVENT_H
|
||||
#define __INC_XMAS_EVENT_H
|
||||
|
||||
namespace xmas
|
||||
{
|
||||
enum
|
||||
{
|
||||
MOB_SANTA_VNUM = 20031, //»êŸ
|
||||
// MOB_SANTA_VNUM = 20095, //³ëÇØ
|
||||
MOB_SANTA_VNUM = 20031, //»êŸ
|
||||
// MOB_SANTA_VNUM = 20095, //³ëÇØ
|
||||
MOB_XMAS_TREE_VNUM = 20032,
|
||||
MOB_XMAS_FIRWORK_SELLER_VNUM = 9004,
|
||||
};
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#ifndef __INC_METIN_II_ASYNCSQL_H__
|
||||
#ifndef __INC_METIN_II_ASYNCSQL_H__
|
||||
#define __INC_METIN_II_ASYNCSQL_H__
|
||||
|
||||
#include "libthecore/stdafx.h"
|
||||
@@ -99,8 +99,8 @@ typedef struct _SQLMsg
|
||||
int iID;
|
||||
std::string stQuery;
|
||||
|
||||
std::vector<SQLResult *> vec_pkResult; // result º¤ÅÍ
|
||||
unsigned int uiResultPos; // ÇöÀç result À§Ä¡
|
||||
std::vector<SQLResult *> vec_pkResult; // result 벡터
|
||||
unsigned int uiResultPos; // 현재 result 위치
|
||||
|
||||
void * pvUserData;
|
||||
bool bReturn;
|
||||
|
||||
Reference in New Issue
Block a user