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"
|
#include "Config.h"
|
||||||
|
|
||||||
CConfig::CConfig()
|
CConfig::CConfig()
|
||||||
@@ -67,7 +67,7 @@ bool CConfig::GetWord(FILE *fp, char *tar)
|
|||||||
|
|
||||||
if ((c == ' ' || c == '\t' || c == '\n'))
|
if ((c == ' ' || c == '\t' || c == '\n'))
|
||||||
{
|
{
|
||||||
// ÅÜ.
|
// ÅÜ.
|
||||||
tar[i] = '\0';
|
tar[i] = '\0';
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -144,7 +144,7 @@ bool CConfig::LoadFile(const char* filename)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// ÆÄÀÏ ´Ý´Â ºÎºÐ.
|
// ÆÄÀÏ ´Ý´Â ºÎºÐ.
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
#include "Marriage.h"
|
#include "Marriage.h"
|
||||||
#include "Main.h"
|
#include "Main.h"
|
||||||
#include "DBManager.h"
|
#include "DBManager.h"
|
||||||
@@ -253,7 +253,7 @@ namespace marriage
|
|||||||
|
|
||||||
void CManager::OnSetup(CPeer* peer)
|
void CManager::OnSetup(CPeer* peer)
|
||||||
{
|
{
|
||||||
// 결혼한 사람들 보내기
|
// 결혼한 사람들 보내기
|
||||||
for (itertype(m_Marriages) it = m_Marriages.begin(); it != m_Marriages.end(); ++it)
|
for (itertype(m_Marriages) it = m_Marriages.begin(); it != m_Marriages.end(); ++it)
|
||||||
{
|
{
|
||||||
TMarriage* pMarriage = *it;
|
TMarriage* pMarriage = *it;
|
||||||
@@ -280,7 +280,7 @@ namespace marriage
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 결혼식 보내기
|
// 결혼식 보내기
|
||||||
for (itertype(m_mapRunningWedding) it = m_mapRunningWedding.begin(); it != m_mapRunningWedding.end(); ++it)
|
for (itertype(m_mapRunningWedding) it = m_mapRunningWedding.begin(); it != m_mapRunningWedding.end(); ++it)
|
||||||
{
|
{
|
||||||
const TWedding& t = it->second;
|
const TWedding& t = it->second;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#include "Monarch.h"
|
#include "Monarch.h"
|
||||||
#include "common/utils.h"
|
#include "common/utils.h"
|
||||||
#include "Main.h"
|
#include "Main.h"
|
||||||
#include "ClientManager.h"
|
#include "ClientManager.h"
|
||||||
@@ -235,7 +235,7 @@ bool CMonarch::SetMonarch(const char * name)
|
|||||||
}
|
}
|
||||||
delete pMsg;
|
delete pMsg;
|
||||||
|
|
||||||
//db¿¡ ÀÔ·Â
|
//db¿¡ ÀÔ·Â
|
||||||
snprintf(szQuery, sizeof(szQuery),
|
snprintf(szQuery, sizeof(szQuery),
|
||||||
"REPLACE INTO monarch (empire, name, windate, money) VALUES(%d, %d, now(), %lld)", Empire, p->pid[Empire], p->money[Empire]);
|
"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__
|
#define __INC_METIN_II_GAME_CONSTANTS_H__
|
||||||
|
|
||||||
#include "common/tables.h"
|
#include "common/tables.h"
|
||||||
@@ -13,7 +13,7 @@ enum EMonsterChatState
|
|||||||
|
|
||||||
typedef struct SMobRankStat
|
typedef struct SMobRankStat
|
||||||
{
|
{
|
||||||
int iGoldPercent; // µ·ÀÌ ³ª¿Ã È®·ü
|
int iGoldPercent; // µ·ÀÌ ³ª¿Ã È®·ü
|
||||||
} TMobRankStat;
|
} TMobRankStat;
|
||||||
|
|
||||||
typedef struct SMobStat
|
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 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 aiItemMagicAttributePercentLow[ITEM_ATTRIBUTE_MAX_LEVEL];
|
||||||
|
|
||||||
extern const int aiItemAttributeAddPercent[ITEM_ATTRIBUTE_MAX_NUM];
|
extern const int aiItemAttributeAddPercent[ITEM_ATTRIBUTE_MAX_NUM];
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "desc_client.h"
|
#include "desc_client.h"
|
||||||
@@ -84,7 +84,7 @@ bool CLIENT_DESC::Connect(int iPhaseWhenSucceed)
|
|||||||
if (iPhaseWhenSucceed != 0)
|
if (iPhaseWhenSucceed != 0)
|
||||||
m_iPhaseWhenSucceed = iPhaseWhenSucceed;
|
m_iPhaseWhenSucceed = iPhaseWhenSucceed;
|
||||||
|
|
||||||
if (get_global_time() - m_LastTryToConnectTime < 3) // 3초
|
if (get_global_time() - m_LastTryToConnectTime < 3) // 3초
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
m_LastTryToConnectTime = get_global_time();
|
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());
|
sys_log(0, "DB_SETUP current user %d size %d", p.dwLoginCount, buf.size());
|
||||||
|
|
||||||
// 파티를 처리할 수 있게 됨.
|
// 파티를 처리할 수 있게 됨.
|
||||||
CPartyManager::instance().EnablePCParty();
|
CPartyManager::instance().EnablePCParty();
|
||||||
//CPartyManager::instance().SendPartyToDB();
|
//CPartyManager::instance().SendPartyToDB();
|
||||||
}
|
}
|
||||||
@@ -294,7 +294,7 @@ void CLIENT_DESC::Update(DWORD t)
|
|||||||
void CLIENT_DESC::UpdateChannelStatus(DWORD t, bool fForce)
|
void CLIENT_DESC::UpdateChannelStatus(DWORD t, bool fForce)
|
||||||
{
|
{
|
||||||
enum {
|
enum {
|
||||||
CHANNELSTATUS_UPDATE_PERIOD = 5*60*1000, // 5분마다
|
CHANNELSTATUS_UPDATE_PERIOD = 5*60*1000, // 5분마다
|
||||||
};
|
};
|
||||||
if (fForce || m_tLastChannelStatusUpdateTime+CHANNELSTATUS_UPDATE_PERIOD < t) {
|
if (fForce || m_tLastChannelStatusUpdateTime+CHANNELSTATUS_UPDATE_PERIOD < t) {
|
||||||
int iTotal;
|
int iTotal;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
#include "constants.h"
|
#include "constants.h"
|
||||||
#include "group_text_parse_tree.h"
|
#include "group_text_parse_tree.h"
|
||||||
#include "dragon_soul_table.h"
|
#include "dragon_soul_table.h"
|
||||||
@@ -172,7 +172,7 @@ bool DragonSoulTable::ReadBasicApplys()
|
|||||||
TVecApplys vecApplys;
|
TVecApplys vecApplys;
|
||||||
int n = pChild->GetRowCount();
|
int n = pChild->GetRowCount();
|
||||||
|
|
||||||
// BasicApply Group은 Key가 1부터 시작함.
|
// BasicApply Group은 Key가 1부터 시작함.
|
||||||
for (int j = 1; j <= n; j++)
|
for (int j = 1; j <= n; j++)
|
||||||
{
|
{
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
@@ -654,7 +654,7 @@ bool DragonSoulTable::GetWeight(BYTE ds_type, BYTE grade_idx, BYTE step_index, B
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// default group을 살펴봄.
|
// default group을 살펴봄.
|
||||||
pDragonSoulGroup = m_pWeightTableNode->GetChildNode("default");
|
pDragonSoulGroup = m_pWeightTableNode->GetChildNode("default");
|
||||||
if (NULL != pDragonSoulGroup)
|
if (NULL != pDragonSoulGroup)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
#include "dungeon.h"
|
#include "dungeon.h"
|
||||||
#include "char.h"
|
#include "char.h"
|
||||||
#include "char_manager.h"
|
#include "char_manager.h"
|
||||||
@@ -1130,7 +1130,7 @@ struct FExitDungeonToStartPosition
|
|||||||
{
|
{
|
||||||
PIXEL_POSITION posWarp;
|
PIXEL_POSITION posWarp;
|
||||||
|
|
||||||
// 현재 맵 인덱스를 넣는 것이 아니라 시작하는 맵 인덱스를 넣는다.
|
// 현재 맵 인덱스를 넣는 것이 아니라 시작하는 맵 인덱스를 넣는다.
|
||||||
if (SECTREE_MANAGER::instance().GetRecallPositionByEmpire(g_start_map[ch->GetEmpire()], ch->GetEmpire(), posWarp))
|
if (SECTREE_MANAGER::instance().GetRecallPositionByEmpire(g_start_map[ch->GetEmpire()], ch->GetEmpire(), posWarp))
|
||||||
ch->WarpSet(posWarp.x, posWarp.y);
|
ch->WarpSet(posWarp.x, posWarp.y);
|
||||||
else
|
else
|
||||||
@@ -1280,7 +1280,7 @@ void CDungeon::JumpToEliminateLocation()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// 일반 맵으로 워프
|
// 일반 맵으로 워프
|
||||||
LPSECTREE_MAP pMap = SECTREE_MANAGER::instance().GetMap(m_lMapIndex);
|
LPSECTREE_MAP pMap = SECTREE_MANAGER::instance().GetMap(m_lMapIndex);
|
||||||
|
|
||||||
if (!pMap)
|
if (!pMap)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "char.h"
|
#include "char.h"
|
||||||
@@ -81,7 +81,7 @@ bool ITEM_MANAGER::Initialize(TItemTable * table, int size)
|
|||||||
if (m_vec_prototype[i].dwRefinedVnum)
|
if (m_vec_prototype[i].dwRefinedVnum)
|
||||||
m_map_ItemRefineFrom.insert(std::make_pair(m_vec_prototype[i].dwRefinedVnum, m_vec_prototype[i].dwVnum));
|
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))
|
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);
|
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)
|
if (vnum == 50300 && bTryMagic)
|
||||||
{
|
{
|
||||||
// 수련서를 아이템 번호를 다르게 만들어 준다.
|
// 수련서를 아이템 번호를 다르게 만들어 준다.
|
||||||
DWORD dwSkillVnum;
|
DWORD dwSkillVnum;
|
||||||
|
|
||||||
do
|
do
|
||||||
@@ -185,7 +185,7 @@ LPITEM ITEM_MANAGER::CreateItem(DWORD vnum, DWORD count, DWORD id, bool bTryMagi
|
|||||||
|
|
||||||
LPITEM item = NULL;
|
LPITEM item = NULL;
|
||||||
|
|
||||||
//id로 검사해서 존재한다면 -- 리턴!
|
//id로 검사해서 존재한다면 -- 리턴!
|
||||||
if (m_map_pkItemByID.find(id) != m_map_pkItemByID.end())
|
if (m_map_pkItemByID.find(id) != m_map_pkItemByID.end())
|
||||||
{
|
{
|
||||||
item = m_map_pkItemByID[id];
|
item = m_map_pkItemByID[id];
|
||||||
@@ -194,7 +194,7 @@ LPITEM ITEM_MANAGER::CreateItem(DWORD vnum, DWORD count, DWORD id, bool bTryMagi
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
//아이템 하나 할당하고
|
//아이템 하나 할당하고
|
||||||
#ifdef M2_USE_POOL
|
#ifdef M2_USE_POOL
|
||||||
item = pool_.Construct();
|
item = pool_.Construct();
|
||||||
#else
|
#else
|
||||||
@@ -203,15 +203,15 @@ LPITEM ITEM_MANAGER::CreateItem(DWORD vnum, DWORD count, DWORD id, bool bTryMagi
|
|||||||
|
|
||||||
bool bIsNewItem = (0 == id);
|
bool bIsNewItem = (0 == id);
|
||||||
|
|
||||||
//초기화 하고. 테이블 셋하고
|
//초기화 하고. 테이블 셋하고
|
||||||
item->Initialize();
|
item->Initialize();
|
||||||
item->SetProto(table);
|
item->SetProto(table);
|
||||||
item->SetMaskVnum(dwMaskVnum);
|
item->SetMaskVnum(dwMaskVnum);
|
||||||
|
|
||||||
if (item->GetType() == ITEM_ELK) // 돈은 ID가 필요없고 저장도 필요없다.
|
if (item->GetType() == ITEM_ELK) // 돈은 ID가 필요없고 저장도 필요없다.
|
||||||
item->SetSkipSave(true);
|
item->SetSkipSave(true);
|
||||||
|
|
||||||
// Unique ID를 세팅하자
|
// Unique ID를 세팅하자
|
||||||
else if (!bIsNewItem)
|
else if (!bIsNewItem)
|
||||||
{
|
{
|
||||||
item->SetID(id);
|
item->SetID(id);
|
||||||
@@ -221,16 +221,16 @@ LPITEM ITEM_MANAGER::CreateItem(DWORD vnum, DWORD count, DWORD id, bool bTryMagi
|
|||||||
{
|
{
|
||||||
item->SetID(GetNewID());
|
item->SetID(GetNewID());
|
||||||
|
|
||||||
if (item->GetType() == ITEM_UNIQUE) // 유니크 아이템은 생성시에 소켓에 남은시간을 기록한다.
|
if (item->GetType() == ITEM_UNIQUE) // 유니크 아이템은 생성시에 소켓에 남은시간을 기록한다.
|
||||||
{
|
{
|
||||||
if (item->GetValue(2) == 0)
|
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
|
else
|
||||||
{
|
{
|
||||||
//int globalTime = get_global_time();
|
//int globalTime = get_global_time();
|
||||||
//int lastTime = item->GetValue(0);
|
//int lastTime = item->GetValue(0);
|
||||||
//int endTime = get_global_time() + 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;
|
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);
|
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++)
|
for (int i=0 ; i < ITEM_LIMIT_MAX_NUM ; i++)
|
||||||
{
|
{
|
||||||
// 아이템 생성 시점부터 사용하지 않아도 시간이 차감되는 방식
|
// 아이템 생성 시점부터 사용하지 않아도 시간이 차감되는 방식
|
||||||
if (LIMIT_REAL_TIME == item->GetLimitType(i))
|
if (LIMIT_REAL_TIME == item->GetLimitType(i))
|
||||||
{
|
{
|
||||||
if (item->GetLimitValue(i))
|
if (item->GetLimitValue(i))
|
||||||
@@ -304,11 +304,11 @@ LPITEM ITEM_MANAGER::CreateItem(DWORD vnum, DWORD count, DWORD id, bool bTryMagi
|
|||||||
item->StartRealTimeExpireEvent();
|
item->StartRealTimeExpireEvent();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 기존 유니크 아이템처럼 착용시에만 사용가능 시간이 차감되는 방식
|
// 기존 유니크 아이템처럼 착용시에만 사용가능 시간이 차감되는 방식
|
||||||
else if (LIMIT_TIMER_BASED_ON_WEAR == item->GetLimitType(i))
|
else if (LIMIT_TIMER_BASED_ON_WEAR == item->GetLimitType(i))
|
||||||
{
|
{
|
||||||
// 이미 착용중인 아이템이면 타이머를 시작하고, 새로 만드는 아이템은 사용 가능 시간을 세팅해준다. (
|
// 이미 착용중인 아이템이면 타이머를 시작하고, 새로 만드는 아이템은 사용 가능 시간을 세팅해준다. (
|
||||||
// 아이템몰로 지급하는 경우에는 이 로직에 들어오기 전에 Socket0 값이 세팅이 되어 있어야 한다.
|
// 아이템몰로 지급하는 경우에는 이 로직에 들어오기 전에 Socket0 값이 세팅이 되어 있어야 한다.
|
||||||
if (true == item->IsEquipped())
|
if (true == item->IsEquipped())
|
||||||
{
|
{
|
||||||
item->StartTimerBasedOnWearExpireEvent();
|
item->StartTimerBasedOnWearExpireEvent();
|
||||||
@@ -320,16 +320,16 @@ LPITEM ITEM_MANAGER::CreateItem(DWORD vnum, DWORD count, DWORD id, bool bTryMagi
|
|||||||
duration = item->GetLimitValue(i);
|
duration = item->GetLimitValue(i);
|
||||||
|
|
||||||
if (0 == duration)
|
if (0 == duration)
|
||||||
duration = 60 * 60 * 10; // 정보가 아무것도 없으면 디폴트로 10시간 세팅
|
duration = 60 * 60 * 10; // 정보가 아무것도 없으면 디폴트로 10시간 세팅
|
||||||
|
|
||||||
item->SetSocket(0, duration);
|
item->SetSocket(0, duration);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (id == 0) // 새로 만드는 아이템일 때만 처리
|
if (id == 0) // 새로 만드는 아이템일 때만 처리
|
||||||
{
|
{
|
||||||
// 새로추가되는 약초들일경우 성능을 다르게처리
|
// 새로추가되는 약초들일경우 성능을 다르게처리
|
||||||
if (ITEM_BLEND==item->GetType())
|
if (ITEM_BLEND==item->GetType())
|
||||||
{
|
{
|
||||||
if (Blend_Item_find(item->GetVnum()))
|
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)
|
if (table->bGainSocketPct)
|
||||||
item->AlterToSocketItem(table->bGainSocketPct);
|
item->AlterToSocketItem(table->bGainSocketPct);
|
||||||
|
|
||||||
// 50300 == 기술 수련서
|
// 50300 == 기술 수련서
|
||||||
if (vnum == 50300 || vnum == ITEM_SKILLFORGET_VNUM)
|
if (vnum == 50300 || vnum == ITEM_SKILLFORGET_VNUM)
|
||||||
{
|
{
|
||||||
DWORD dwSkillVnum;
|
DWORD dwSkillVnum;
|
||||||
@@ -408,7 +408,7 @@ LPITEM ITEM_MANAGER::CreateItem(DWORD vnum, DWORD count, DWORD id, bool bTryMagi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 새로 생성되는 용혼석 처리.
|
// 새로 생성되는 용혼석 처리.
|
||||||
if (item->IsDragonSoul() && 0 == id)
|
if (item->IsDragonSoul() && 0 == id)
|
||||||
{
|
{
|
||||||
DSManager::instance().DragonSoulItemInitialize(item);
|
DSManager::instance().DragonSoulItemInitialize(item);
|
||||||
@@ -477,7 +477,7 @@ void ITEM_MANAGER::Update()
|
|||||||
this_it = it++;
|
this_it = it++;
|
||||||
LPITEM item = *this_it;
|
LPITEM item = *this_it;
|
||||||
|
|
||||||
// SLOW_QUERY 플래그가 있는 것은 종료시에만 저장한다.
|
// SLOW_QUERY 플래그가 있는 것은 종료시에만 저장한다.
|
||||||
if (item->GetOwner() && IS_SET(item->GetFlag(), ITEM_FLAG_SLOW_QUERY))
|
if (item->GetOwner() && IS_SET(item->GetFlag(), ITEM_FLAG_SLOW_QUERY))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@@ -500,7 +500,7 @@ void ITEM_MANAGER::RemoveItem(LPITEM item, const char * c_pszReason)
|
|||||||
// SAFEBOX_TIME_LIMIT_ITEM_BUG_FIX
|
// SAFEBOX_TIME_LIMIT_ITEM_BUG_FIX
|
||||||
if (item->GetWindow() == MALL || item->GetWindow() == SAFEBOX)
|
if (item->GetWindow() == MALL || item->GetWindow() == SAFEBOX)
|
||||||
{
|
{
|
||||||
// 20050613.ipkn.시간제 아이템이 상점에 있을 경우 시간만료시 서버가 다운된다.
|
// 20050613.ipkn.시간제 아이템이 상점에 있을 경우 시간만료시 서버가 다운된다.
|
||||||
CSafebox* pSafebox = item->GetWindow() == MALL ? o->GetMall() : o->GetSafebox();
|
CSafebox* pSafebox = item->GetWindow() == MALL ? o->GetMall() : o->GetSafebox();
|
||||||
if (pSafebox)
|
if (pSafebox)
|
||||||
{
|
{
|
||||||
@@ -764,8 +764,8 @@ class CItemDropInfo
|
|||||||
extern std::vector<CItemDropInfo> g_vec_pkCommonDropItem[MOB_RANK_MAX_NUM];
|
extern std::vector<CItemDropInfo> g_vec_pkCommonDropItem[MOB_RANK_MAX_NUM];
|
||||||
|
|
||||||
// 20050503.ipkn.
|
// 20050503.ipkn.
|
||||||
// iMinimum 보다 작으면 iDefault 세팅 (단, iMinimum은 0보다 커야함)
|
// iMinimum 보다 작으면 iDefault 세팅 (단, iMinimum은 0보다 커야함)
|
||||||
// 1, 0 식으로 ON/OFF 되는 방식을 지원하기 위해 존재
|
// 1, 0 식으로 ON/OFF 되는 방식을 지원하기 위해 존재
|
||||||
int GetDropPerKillPct(int iMinimum, int iDefault, int iDeltaPercent, const char * c_pszFlag)
|
int GetDropPerKillPct(int iMinimum, int iDefault, int iDeltaPercent, const char * c_pszFlag)
|
||||||
{
|
{
|
||||||
int iVal = 0;
|
int iVal = 0;
|
||||||
@@ -785,8 +785,8 @@ int GetDropPerKillPct(int iMinimum, int iDefault, int iDeltaPercent, const char
|
|||||||
if (iVal == 0)
|
if (iVal == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
// 기본 세팅일때 (iDeltaPercent=100)
|
// 기본 세팅일때 (iDeltaPercent=100)
|
||||||
// 40000 iVal 마리당 하나 느낌을 주기 위한 상수임
|
// 40000 iVal 마리당 하나 느낌을 주기 위한 상수임
|
||||||
return (40000 * iDeltaPercent / iVal);
|
return (40000 * iDeltaPercent / iVal);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -932,7 +932,7 @@ bool ITEM_MANAGER::CreateDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller, std::
|
|||||||
CMobItemGroup* pGroup = it->second;
|
CMobItemGroup* pGroup = it->second;
|
||||||
|
|
||||||
// MOB_DROP_ITEM_BUG_FIX
|
// MOB_DROP_ITEM_BUG_FIX
|
||||||
// 20050805.myevan.MobDropItem 에 아이템이 없을 경우 CMobItemGroup::GetOne() 접근시 문제 발생 수정
|
// 20050805.myevan.MobDropItem 에 아이템이 없을 경우 CMobItemGroup::GetOne() 접근시 문제 발생 수정
|
||||||
if (pGroup && !pGroup->IsEmpty())
|
if (pGroup && !pGroup->IsEmpty())
|
||||||
{
|
{
|
||||||
int iPercent = 40000 * iDeltaPercent / pGroup->GetKillPerDrop();
|
int iPercent = 40000 * iDeltaPercent / pGroup->GetKillPerDrop();
|
||||||
@@ -995,7 +995,7 @@ bool ITEM_MANAGER::CreateDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller, std::
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 잡템
|
// 잡템
|
||||||
if (pkChr->GetMobDropItemVnum())
|
if (pkChr->GetMobDropItemVnum())
|
||||||
{
|
{
|
||||||
itertype(m_map_dwEtcItemDropProb) it = m_map_dwEtcItemDropProb.find(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[1] = 1;
|
||||||
pdw[2] = quest::CQuestManager::instance().GetEventFlag("lotto_round");
|
pdw[2] = quest::CQuestManager::instance().GetEventFlag("lotto_round");
|
||||||
|
|
||||||
// 행운의 서는 소켓을 설정한다
|
// 행운의 서는 소켓을 설정한다
|
||||||
DBManager::instance().ReturnQuery(QID_LOTTO, pkKiller->GetPlayerID(), pdw,
|
DBManager::instance().ReturnQuery(QID_LOTTO, pkKiller->GetPlayerID(), pdw,
|
||||||
"INSERT INTO lotto_list VALUES(0, 'server%s', %u, NOW())",
|
"INSERT INTO lotto_list VALUES(0, 'server%s', %u, NOW())",
|
||||||
get_table_postfix(), pkKiller->GetPlayerID());
|
get_table_postfix(), pkKiller->GetPlayerID());
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// 스페셜 드롭 아이템
|
// 스페셜 드롭 아이템
|
||||||
//
|
//
|
||||||
CreateQuestDropItem(pkChr, pkKiller, vec_item, iDeltaPercent, iRandRange);
|
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())
|
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())
|
if (LC_IsYMIR() || LC_IsKorea())
|
||||||
{
|
{
|
||||||
switch (pkKiller->GetMapIndex())
|
switch (pkKiller->GetMapIndex())
|
||||||
{
|
{
|
||||||
case 72: // 천의동굴 1층
|
case 72: // 천의동굴 1층
|
||||||
case 73: // 천의동굴 2층
|
case 73: // 천의동굴 2층
|
||||||
{
|
{
|
||||||
int vnum = 0;
|
int vnum = 0;
|
||||||
|
|
||||||
if (2403 == pkChr->GetRaceNum()) // 천의법사
|
if (2403 == pkChr->GetRaceNum()) // 천의법사
|
||||||
vnum = 69200; // 7스킬 입문서
|
vnum = 69200; // 7스킬 입문서
|
||||||
else if (2411 == pkChr->GetRaceNum()) // 진천의병사
|
else if (2411 == pkChr->GetRaceNum()) // 진천의병사
|
||||||
vnum = 69201; // 8스킬 입문서
|
vnum = 69201; // 8스킬 입문서
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -1249,11 +1249,11 @@ bool DropEvent_CharStone_SetValue(const std::string& name, int value)
|
|||||||
// END_OF_DROPEVENT_CHARSTONE
|
// END_OF_DROPEVENT_CHARSTONE
|
||||||
|
|
||||||
// fixme
|
// fixme
|
||||||
// 위의 것과 함께 quest로 뺄것 빼보자.
|
// 위의 것과 함께 quest로 뺄것 빼보자.
|
||||||
// 이거 너무 더럽잖아...
|
// 이거 너무 더럽잖아...
|
||||||
// <EFBFBD>?. 하드코딩 싫다 ㅜㅠ
|
// ?. 하드코딩 싫다 ㅜㅠ
|
||||||
// 계량 아이템 보상 시작.
|
// 계량 아이템 보상 시작.
|
||||||
// by rtsummit 고치자 진짜
|
// by rtsummit 고치자 진짜
|
||||||
static struct DropEvent_RefineBox
|
static struct DropEvent_RefineBox
|
||||||
{
|
{
|
||||||
int percent_low;
|
int percent_low;
|
||||||
@@ -1373,7 +1373,7 @@ bool DropEvent_RefineBox_SetValue(const std::string& name, int value)
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
// 개량 아이템 보상 끝.
|
// 개량 아이템 보상 끝.
|
||||||
|
|
||||||
|
|
||||||
void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller, std::vector<LPITEM> & vec_item, int iDeltaPercent, int iRandRange)
|
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
|
// END_OF_DROPEVENT_CHARSTONE
|
||||||
__DropEvent_RefineBox_DropItem(*pkKiller, *pkChr, *this, vec_item);
|
__DropEvent_RefineBox_DropItem(*pkKiller, *pkChr, *this, vec_item);
|
||||||
|
|
||||||
// 크리스마스 양말
|
// 크리스마스 양말
|
||||||
if (quest::CQuestManager::instance().GetEventFlag("xmas_sock"))
|
if (quest::CQuestManager::instance().GetEventFlag("xmas_sock"))
|
||||||
{
|
{
|
||||||
//const DWORD SOCK_ITEM_VNUM = 50010;
|
//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"))
|
if (quest::CQuestManager::instance().GetEventFlag("drop_moon"))
|
||||||
{
|
{
|
||||||
const DWORD ITEM_VNUM = 50011;
|
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))
|
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;
|
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))
|
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;
|
const static DWORD dwVnum = 50043;
|
||||||
|
|
||||||
@@ -1504,17 +1504,17 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller,
|
|||||||
vec_item.push_back(item);
|
vec_item.push_back(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 새해 폭죽 이벤트
|
// 새해 폭죽 이벤트
|
||||||
if (GetDropPerKillPct(/* minimum */ 100, /* default */ 1000, iDeltaPercent, "newyear_fire") >= number(1, iRandRange))
|
if (GetDropPerKillPct(/* minimum */ 100, /* default */ 1000, iDeltaPercent, "newyear_fire") >= number(1, iRandRange))
|
||||||
{
|
{
|
||||||
// 중국은 폭죽, 한국 팽이
|
// 중국은 폭죽, 한국 팽이
|
||||||
const DWORD ITEM_VNUM_FIRE = g_iUseLocale ? 50107 : 50108;
|
const DWORD ITEM_VNUM_FIRE = g_iUseLocale ? 50107 : 50108;
|
||||||
|
|
||||||
if ((item = CreateItem(ITEM_VNUM_FIRE, 1, 0, true)))
|
if ((item = CreateItem(ITEM_VNUM_FIRE, 1, 0, true)))
|
||||||
vec_item.push_back(item);
|
vec_item.push_back(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 새해 대보름 원소 이벤트
|
// 새해 대보름 원소 이벤트
|
||||||
if (GetDropPerKillPct(100, 500, iDeltaPercent, "newyear_moon") >= number(1, iRandRange))
|
if (GetDropPerKillPct(100, 500, iDeltaPercent, "newyear_moon") >= number(1, iRandRange))
|
||||||
{
|
{
|
||||||
sys_log(0, "EVENT NEWYEAR_MOON DROP");
|
sys_log(0, "EVENT NEWYEAR_MOON DROP");
|
||||||
@@ -1526,7 +1526,7 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller,
|
|||||||
vec_item.push_back(item);
|
vec_item.push_back(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 발렌타인 데이 이벤트. OGE의 요구에 따라 event 최소값을 1로 변경.(다른 이벤트는 일단 그대로 둠.)
|
// 발렌타인 데이 이벤트. OGE의 요구에 따라 event 최소값을 1로 변경.(다른 이벤트는 일단 그대로 둠.)
|
||||||
if (GetDropPerKillPct(1, g_iUseLocale ? 2000 : 800, iDeltaPercent, "valentine_drop") >= number(1, iRandRange))
|
if (GetDropPerKillPct(1, g_iUseLocale ? 2000 : 800, iDeltaPercent, "valentine_drop") >= number(1, iRandRange))
|
||||||
{
|
{
|
||||||
sys_log(0, "EVENT VALENTINE_DROP");
|
sys_log(0, "EVENT VALENTINE_DROP");
|
||||||
@@ -1538,7 +1538,7 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller,
|
|||||||
vec_item.push_back(item);
|
vec_item.push_back(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 아이스크림 이벤트
|
// 아이스크림 이벤트
|
||||||
if (GetDropPerKillPct(100, g_iUseLocale ? 2000 : 800, iDeltaPercent, "icecream_drop") >= number(1, iRandRange))
|
if (GetDropPerKillPct(100, g_iUseLocale ? 2000 : 800, iDeltaPercent, "icecream_drop") >= number(1, iRandRange))
|
||||||
{
|
{
|
||||||
const static DWORD icecream = 50123;
|
const static DWORD icecream = 50123;
|
||||||
@@ -1547,8 +1547,8 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller,
|
|||||||
vec_item.push_back(item);
|
vec_item.push_back(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
// new 크리스마스 이벤트
|
// new 크리스마스 이벤트
|
||||||
// 53002 : 아기 순록 소환권
|
// 53002 : 아기 순록 소환권
|
||||||
if ((pkKiller->CountSpecifyItem(53002) > 0) && (GetDropPerKillPct(50, 100, iDeltaPercent, "new_xmas_event") >= number(1, iRandRange)))
|
if ((pkKiller->CountSpecifyItem(53002) > 0) && (GetDropPerKillPct(50, 100, iDeltaPercent, "new_xmas_event") >= number(1, iRandRange)))
|
||||||
{
|
{
|
||||||
const static DWORD xmas_sock = 50010;
|
const static DWORD xmas_sock = 50010;
|
||||||
@@ -1592,7 +1592,7 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller,
|
|||||||
vec_item.push_back(item);
|
vec_item.push_back(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 월드컵 이벤트
|
// 월드컵 이벤트
|
||||||
if ( GetDropPerKillPct(100, g_iUseLocale ? 2000 : 800, iDeltaPercent, "football_drop") >= number(1, iRandRange) )
|
if ( GetDropPerKillPct(100, g_iUseLocale ? 2000 : 800, iDeltaPercent, "football_drop") >= number(1, iRandRange) )
|
||||||
{
|
{
|
||||||
const static DWORD football_item = 50096;
|
const static DWORD football_item = 50096;
|
||||||
@@ -1601,7 +1601,7 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller,
|
|||||||
vec_item.push_back(item);
|
vec_item.push_back(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 화이트 데이 이벤트
|
// 화이트 데이 이벤트
|
||||||
if (GetDropPerKillPct(100, g_iUseLocale ? 2000 : 800, iDeltaPercent, "whiteday_drop") >= number(1, iRandRange))
|
if (GetDropPerKillPct(100, g_iUseLocale ? 2000 : 800, iDeltaPercent, "whiteday_drop") >= number(1, iRandRange))
|
||||||
{
|
{
|
||||||
sys_log(0, "EVENT WHITEDAY_DROP");
|
sys_log(0, "EVENT WHITEDAY_DROP");
|
||||||
@@ -1612,7 +1612,7 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller,
|
|||||||
vec_item.push_back(item);
|
vec_item.push_back(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 어린이날 수수께끼 상자 이벤트
|
// 어린이날 수수께끼 상자 이벤트
|
||||||
if (pkKiller->GetLevel()>=50)
|
if (pkKiller->GetLevel()>=50)
|
||||||
{
|
{
|
||||||
if (GetDropPerKillPct(100, 1000, iDeltaPercent, "kids_day_drop_high") >= number(1, iRandRange))
|
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))
|
if (pkChr->GetLevel() >= 30 && GetDropPerKillPct(50, 100, iDeltaPercent, "medal_part_drop") >= number(1, iRandRange))
|
||||||
{
|
{
|
||||||
const static DWORD drop_items[] = { 30265, 30266, 30267, 30268, 30269 };
|
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
|
// 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))
|
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;
|
const DWORD ITEM_VNUM = 50513;
|
||||||
@@ -1656,7 +1656,7 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller,
|
|||||||
// END_OF_ADD_GRANDMASTER_SKILL
|
// END_OF_ADD_GRANDMASTER_SKILL
|
||||||
|
|
||||||
//
|
//
|
||||||
// 종자 아이템 drop
|
// 종자 아이템 drop
|
||||||
//
|
//
|
||||||
if (GetDropPerKillPct(100, 1000, iDeltaPercent, "dragon_boat_festival_drop") >= number(1, iRandRange))
|
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);
|
vec_item.push_back(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 무신의 축복서용 만년한철 drop
|
// 무신의 축복서용 만년한철 drop
|
||||||
if (pkKiller->GetLevel() >= 15 && quest::CQuestManager::instance().GetEventFlag("mars_drop"))
|
if (pkKiller->GetLevel() >= 15 && quest::CQuestManager::instance().GetEventFlag("mars_drop"))
|
||||||
{
|
{
|
||||||
const DWORD ITEM_HANIRON = 70035;
|
const DWORD ITEM_HANIRON = 70035;
|
||||||
@@ -1728,8 +1728,8 @@ DWORD ITEM_MANAGER::GetMaskVnum(DWORD dwVnum)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// pkNewItem으로 모든 속성과 소켓 값들을 목사하는 함수.
|
// pkNewItem으로 모든 속성과 소켓 값들을 목사하는 함수.
|
||||||
// 기존에 char_item.cpp 파일에 있던 로컬함수인 TransformRefineItem 그대로 복사함
|
// 기존에 char_item.cpp 파일에 있던 로컬함수인 TransformRefineItem 그대로 복사함
|
||||||
void ITEM_MANAGER::CopyAllAttrTo(LPITEM pkOldItem, LPITEM pkNewItem)
|
void ITEM_MANAGER::CopyAllAttrTo(LPITEM pkOldItem, LPITEM pkNewItem)
|
||||||
{
|
{
|
||||||
// ACCESSORY_REFINE
|
// ACCESSORY_REFINE
|
||||||
@@ -1744,7 +1744,7 @@ void ITEM_MANAGER::CopyAllAttrTo(LPITEM pkOldItem, LPITEM pkNewItem)
|
|||||||
// END_OF_ACCESSORY_REFINE
|
// END_OF_ACCESSORY_REFINE
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// 여기서 깨진석이 자동적으로 청소 됨
|
// 여기서 깨진석이 자동적으로 청소 됨
|
||||||
for (int i = 0; i < ITEM_SOCKET_MAX_NUM; ++i)
|
for (int i = 0; i < ITEM_SOCKET_MAX_NUM; ++i)
|
||||||
{
|
{
|
||||||
if (!pkOldItem->GetSocket(i))
|
if (!pkOldItem->GetSocket(i))
|
||||||
@@ -1753,19 +1753,19 @@ void ITEM_MANAGER::CopyAllAttrTo(LPITEM pkOldItem, LPITEM pkNewItem)
|
|||||||
pkNewItem->SetSocket(i, 1);
|
pkNewItem->SetSocket(i, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 소켓 설정
|
// 소켓 설정
|
||||||
int slot = 0;
|
int slot = 0;
|
||||||
|
|
||||||
for (int i = 0; i < ITEM_SOCKET_MAX_NUM; ++i)
|
for (int i = 0; i < ITEM_SOCKET_MAX_NUM; ++i)
|
||||||
{
|
{
|
||||||
long socket = pkOldItem->GetSocket(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)
|
if (socket > 2 && socket != ITEM_BROKEN_METIN_VNUM)
|
||||||
pkNewItem->SetSocket(slot++, socket);
|
pkNewItem->SetSocket(slot++, socket);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 매직 아이템 설정
|
// 매직 아이템 설정
|
||||||
pkOldItem->CopyAttributeTo(pkNewItem);
|
pkOldItem->CopyAttributeTo(pkNewItem);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#include "stdafx.h"
|
癤<EFBFBD>#include "stdafx.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "char.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 "common/stl.h"
|
||||||
#include "constants.h"
|
#include "constants.h"
|
||||||
#include "motion.h"
|
#include "motion.h"
|
||||||
@@ -476,7 +476,7 @@ bool CMotion::LoadMobSkillFromFile(const char * c_pszFileName, CMob* pMob, int i
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
case MOTION_EVENT_TYPE_SPECIAL_ATTACKING:
|
case MOTION_EVENT_TYPE_SPECIAL_ATTACKING:
|
||||||
// 구 데이터는 하나 라고 가정
|
// 구 데이터는 하나 라고 가정
|
||||||
if (!rkTextFileLoader.SetChildNode("spheredata", 0))
|
if (!rkTextFileLoader.SetChildNode("spheredata", 0))
|
||||||
{
|
{
|
||||||
sys_err("Motion: no sphere data %s", c_pszFileName);
|
sys_err("Motion: no sphere data %s", c_pszFileName);
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#include "stdafx.h"
|
癤<EFBFBD>#include "stdafx.h"
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include "constants.h"
|
#include "constants.h"
|
||||||
#include "char.h"
|
#include "char.h"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
#include "questmanager.h"
|
#include "questmanager.h"
|
||||||
#include "char.h"
|
#include "char.h"
|
||||||
#include "item.h"
|
#include "item.h"
|
||||||
@@ -444,7 +444,7 @@ namespace quest
|
|||||||
ITEM_MANAGER::instance().FlushDelayedSave(pkNewItem);
|
ITEM_MANAGER::instance().FlushDelayedSave(pkNewItem);
|
||||||
pkNewItem->AttrLog();
|
pkNewItem->AttrLog();
|
||||||
|
|
||||||
// ¼º°ø!
|
// ¼º°ø!
|
||||||
lua_pushboolean(L, 1);
|
lua_pushboolean(L, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
#include "char.h"
|
#include "char.h"
|
||||||
#include "char_manager.h"
|
#include "char_manager.h"
|
||||||
#include "wedding.h"
|
#include "wedding.h"
|
||||||
@@ -169,7 +169,7 @@ namespace quest
|
|||||||
}
|
}
|
||||||
if (pMarriage->pWeddingInfo)
|
if (pMarriage->pWeddingInfo)
|
||||||
{
|
{
|
||||||
// °áÈ¥½Ä ³¡³»±â ¿äû
|
// 결혼식 끝내기 요청
|
||||||
pMarriage->RequestEndWedding();
|
pMarriage->RequestEndWedding();
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
#include "libgame/grid.h"
|
#include "libgame/grid.h"
|
||||||
#include "constants.h"
|
#include "constants.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
@@ -69,7 +69,7 @@ bool CShopEx::AddGuest(LPCHARACTER ch,DWORD owner_vid, bool bOtherEmpire)
|
|||||||
|
|
||||||
pack2.owner_vid = owner_vid;
|
pack2.owner_vid = owner_vid;
|
||||||
pack2.shop_tab_count = m_vec_shopTabs.size();
|
pack2.shop_tab_count = m_vec_shopTabs.size();
|
||||||
char temp[8096]; // ÃÖ´ë 1728 * 3
|
char temp[8096]; // ÃÖ´ë 1728 * 3
|
||||||
char* buf = &temp[0];
|
char* buf = &temp[0];
|
||||||
size_t size = 0;
|
size_t size = 0;
|
||||||
for (itertype(m_vec_shopTabs) it = m_vec_shopTabs.begin(); it != m_vec_shopTabs.end(); it++)
|
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;
|
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;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
// \0 자리 확보
|
// \0 자리 확보
|
||||||
--dest_size;
|
--dest_size;
|
||||||
|
|
||||||
while (*src && len < dest_size)
|
while (*src && len < dest_size)
|
||||||
{
|
{
|
||||||
*dest = LOWER(*src); // LOWER 매크로에서 ++나 --하면 안됨!!
|
*dest = LOWER(*src); // LOWER 매크로에서 ++나 --하면 안됨!!
|
||||||
|
|
||||||
++src;
|
++src;
|
||||||
++dest;
|
++dest;
|
||||||
@@ -80,7 +80,7 @@ const char *one_argument(const char *argument, char *first_arg, size_t first_siz
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// \0 자리 확보
|
// \0 자리 확보
|
||||||
--first_size;
|
--first_size;
|
||||||
|
|
||||||
skip_spaces(&argument);
|
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;
|
size_t cur_len = 0;
|
||||||
skip_spaces(&argument);
|
skip_spaces(&argument);
|
||||||
|
|
||||||
// \0 자리 확보
|
// \0 자리 확보
|
||||||
first_arg_size -= 1;
|
first_arg_size -= 1;
|
||||||
|
|
||||||
while (*argument && !isnhspace(*argument) && cur_len < first_arg_size)
|
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
|
#define __INC_XMAS_EVENT_H
|
||||||
|
|
||||||
namespace xmas
|
namespace xmas
|
||||||
{
|
{
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
MOB_SANTA_VNUM = 20031, //»êŸ
|
MOB_SANTA_VNUM = 20031, //»êŸ
|
||||||
// MOB_SANTA_VNUM = 20095, //³ëÇØ
|
// MOB_SANTA_VNUM = 20095, //³ëÇØ
|
||||||
MOB_XMAS_TREE_VNUM = 20032,
|
MOB_XMAS_TREE_VNUM = 20032,
|
||||||
MOB_XMAS_FIRWORK_SELLER_VNUM = 9004,
|
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__
|
#define __INC_METIN_II_ASYNCSQL_H__
|
||||||
|
|
||||||
#include "libthecore/stdafx.h"
|
#include "libthecore/stdafx.h"
|
||||||
@@ -99,8 +99,8 @@ typedef struct _SQLMsg
|
|||||||
int iID;
|
int iID;
|
||||||
std::string stQuery;
|
std::string stQuery;
|
||||||
|
|
||||||
std::vector<SQLResult *> vec_pkResult; // result º¤ÅÍ
|
std::vector<SQLResult *> vec_pkResult; // result 벡터
|
||||||
unsigned int uiResultPos; // ÇöÀç result À§Ä¡
|
unsigned int uiResultPos; // 현재 result 위치
|
||||||
|
|
||||||
void * pvUserData;
|
void * pvUserData;
|
||||||
bool bReturn;
|
bool bReturn;
|
||||||
|
|||||||
Reference in New Issue
Block a user