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:
mq1n
2025-08-23 09:25:53 +03:00
parent c987a9f2f1
commit bf6434a3d6
18 changed files with 1033 additions and 114 deletions

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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]);

View File

@@ -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];

View File

@@ -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;

View File

@@ -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)
{

View File

@@ -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)

View File

@@ -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);
}

View File

@@ -1,4 +1,4 @@
#include "stdafx.h"
<EFBFBD>#include "stdafx.h"
#include "utils.h"
#include "config.h"
#include "char.h"

View 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;
}

View File

@@ -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);

View File

@@ -1,4 +1,4 @@
#include "stdafx.h"
<EFBFBD>#include "stdafx.h"
#include <sstream>
#include "constants.h"
#include "char.h"

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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++)

View File

@@ -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)

View File

@@ -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,
};

View File

@@ -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;