text encoding fixed
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
#include "stdafx.h"
|
||||
#include "stdafx.h"
|
||||
#include "utils.h"
|
||||
#include "config.h"
|
||||
#include "char.h"
|
||||
@@ -295,7 +295,7 @@ LPITEM CItem::RemoveFromCharacter()
|
||||
|
||||
LPCHARACTER pOwner = m_pOwner;
|
||||
|
||||
if (m_bEquipped) // 장착되었는가?
|
||||
if (m_bEquipped) // 장착되었는가?
|
||||
{
|
||||
Unequip();
|
||||
//pOwner->UpdatePacket();
|
||||
@@ -319,7 +319,7 @@ LPITEM CItem::RemoveFromCharacter()
|
||||
{
|
||||
TItemPos cell(INVENTORY, m_wCell);
|
||||
|
||||
if (false == cell.IsDefaultInventoryPosition() && false == cell.IsBeltInventoryPosition()) // 아니면 소지품에?
|
||||
if (false == cell.IsDefaultInventoryPosition() && false == cell.IsBeltInventoryPosition()) // 아니면 소지품에?
|
||||
sys_err("CItem::RemoveFromCharacter: Invalid Item Position");
|
||||
else
|
||||
{
|
||||
@@ -471,16 +471,16 @@ bool CItem::CanUsedBy(LPCHARACTER ch)
|
||||
|
||||
int CItem::FindEquipCell(LPCHARACTER ch, int iCandidateCell)
|
||||
{
|
||||
// 코스츔 아이템(ITEM_COSTUME)은 WearFlag 없어도 됨. (sub type으로 착용위치 구분. 귀찮게 또 wear flag 줄 필요가 있나..)
|
||||
// 용혼석(ITEM_DS, ITEM_SPECIAL_DS)도 SUB_TYPE으로 구분. 신규 반지, 벨트는 ITEM_TYPE으로 구분 -_-
|
||||
// 코스츔 아이템(ITEM_COSTUME)은 WearFlag 없어도 됨. (sub type으로 착용위치 구분. 귀찮게 또 wear flag 줄 필요가 있나..)
|
||||
// 용혼석(ITEM_DS, ITEM_SPECIAL_DS)도 SUB_TYPE으로 구분. 신규 반지, 벨트는 ITEM_TYPE으로 구분 -_-
|
||||
if ((0 == GetWearFlag() || ITEM_TOTEM == GetType()) && ITEM_COSTUME != GetType() && ITEM_DS != GetType() && ITEM_SPECIAL_DS != GetType() && ITEM_RING != GetType() && ITEM_BELT != GetType())
|
||||
return -1;
|
||||
|
||||
// 용혼석 슬롯을 WEAR로 처리할 수가 없어서(WEAR는 최대 32개까지 가능한데 용혼석을 추가하면 32가 넘는다.)
|
||||
// 인벤토리의 특정 위치((INVENTORY_MAX_NUM + WEAR_MAX_NUM)부터 (INVENTORY_MAX_NUM + WEAR_MAX_NUM + DRAGON_SOUL_DECK_MAX_NUM * DS_SLOT_MAX - 1)까지)를
|
||||
// 용혼석 슬롯으로 정함.
|
||||
// return 할 때에, INVENTORY_MAX_NUM을 뺀 이유는,
|
||||
// 본래 WearCell이 INVENTORY_MAX_NUM를 빼고 return 하기 때문.
|
||||
// 용혼석 슬롯을 WEAR로 처리할 수가 없어서(WEAR는 최대 32개까지 가능한데 용혼석을 추가하면 32가 넘는다.)
|
||||
// 인벤토리의 특정 위치((INVENTORY_MAX_NUM + WEAR_MAX_NUM)부터 (INVENTORY_MAX_NUM + WEAR_MAX_NUM + DRAGON_SOUL_DECK_MAX_NUM * DS_SLOT_MAX - 1)까지)를
|
||||
// 용혼석 슬롯으로 정함.
|
||||
// return 할 때에, INVENTORY_MAX_NUM을 뺀 이유는,
|
||||
// 본래 WearCell이 INVENTORY_MAX_NUM를 빼고 return 하기 때문.
|
||||
if (GetType() == ITEM_DS || GetType() == ITEM_SPECIAL_DS)
|
||||
{
|
||||
if (iCandidateCell < 0)
|
||||
@@ -541,7 +541,7 @@ int CItem::FindEquipCell(LPCHARACTER ch, int iCandidateCell)
|
||||
return WEAR_UNIQUE1;
|
||||
}
|
||||
|
||||
// 수집 퀘스트를 위한 아이템이 박히는곳으로 한번 박히면 절대 뺼수 없다.
|
||||
// 수집 퀘스트를 위한 아이템이 박히는곳으로 한번 박히면 절대 뺼수 없다.
|
||||
else if (GetWearFlag() & WEARABLE_ABILITY)
|
||||
{
|
||||
if (!ch->GetWear(WEAR_ABILITY1))
|
||||
@@ -588,12 +588,12 @@ void CItem::ModifyPoints(bool bAdd)
|
||||
{
|
||||
int accessoryGrade;
|
||||
|
||||
// 무기와 갑옷만 소켓을 적용시킨다.
|
||||
// 무기와 갑옷만 소켓을 적용시킨다.
|
||||
if (false == IsAccessoryForSocket())
|
||||
{
|
||||
if (m_pProto->bType == ITEM_WEAPON || m_pProto->bType == ITEM_ARMOR)
|
||||
{
|
||||
// 소켓이 속성강화에 사용되는 경우 적용하지 않는다 (ARMOR_WRIST ARMOR_NECK ARMOR_EAR)
|
||||
// 소켓이 속성강화에 사용되는 경우 적용하지 않는다 (ARMOR_WRIST ARMOR_NECK ARMOR_EAR)
|
||||
for (int i = 0; i < ITEM_SOCKET_MAX_NUM; ++i)
|
||||
{
|
||||
DWORD dwVnum;
|
||||
@@ -652,12 +652,12 @@ void CItem::ModifyPoints(bool bAdd)
|
||||
m_pOwner->ApplyPoint(m_pProto->aApplies[i].bType, bAdd ? value : -value);
|
||||
}
|
||||
}
|
||||
// 초승달의 반지, 할로윈 사탕, 행복의 반지, 영원한 사랑의 펜던트의 경우
|
||||
// 기존의 하드 코딩으로 강제로 속성을 부여했지만,
|
||||
// 그 부분을 제거하고 special item group 테이블에서 속성을 부여하도록 변경하였다.
|
||||
// 하지만 하드 코딩되어있을 때 생성된 아이템이 남아있을 수도 있어서 특수처리 해놓는다.
|
||||
// 이 아이템들의 경우, 밑에 ITEM_UNIQUE일 때의 처리로 속성이 부여되기 때문에,
|
||||
// 아이템에 박혀있는 attribute는 적용하지 않고 넘어간다.
|
||||
// 초승달의 반지, 할로윈 사탕, 행복의 반지, 영원한 사랑의 펜던트의 경우
|
||||
// 기존의 하드 코딩으로 강제로 속성을 부여했지만,
|
||||
// 그 부분을 제거하고 special item group 테이블에서 속성을 부여하도록 변경하였다.
|
||||
// 하지만 하드 코딩되어있을 때 생성된 아이템이 남아있을 수도 있어서 특수처리 해놓는다.
|
||||
// 이 아이템들의 경우, 밑에 ITEM_UNIQUE일 때의 처리로 속성이 부여되기 때문에,
|
||||
// 아이템에 박혀있는 attribute는 적용하지 않고 넘어간다.
|
||||
if (true == CItemVnumHelper::IsRamadanMoonRing(GetVnum()) || true == CItemVnumHelper::IsHalloweenCandy(GetVnum())
|
||||
|| true == CItemVnumHelper::IsHappinessRing(GetVnum()) || true == CItemVnumHelper::IsLovePendant(GetVnum()))
|
||||
{
|
||||
@@ -714,7 +714,7 @@ void CItem::ModifyPoints(bool bAdd)
|
||||
|
||||
case ITEM_ARMOR:
|
||||
{
|
||||
// 코스츔 body를 입고있다면 armor는 벗던 입던 상관 없이 비주얼에 영향을 주면 안 됨.
|
||||
// 코스츔 body를 입고있다면 armor는 벗던 입던 상관 없이 비주얼에 영향을 주면 안 됨.
|
||||
if (0 != m_pOwner->GetWear(WEAR_COSTUME_BODY))
|
||||
break;
|
||||
|
||||
@@ -734,33 +734,33 @@ void CItem::ModifyPoints(bool bAdd)
|
||||
}
|
||||
break;
|
||||
|
||||
// 코스츔 아이템 입었을 때 캐릭터 parts 정보 세팅. 기존 스타일대로 추가함..
|
||||
// 코스츔 아이템 입었을 때 캐릭터 parts 정보 세팅. 기존 스타일대로 추가함..
|
||||
case ITEM_COSTUME:
|
||||
{
|
||||
DWORD toSetValue = this->GetVnum();
|
||||
EParts toSetPart = PART_MAX_NUM;
|
||||
|
||||
// 갑옷 코스츔
|
||||
// 갑옷 코스츔
|
||||
if (GetSubType() == COSTUME_BODY)
|
||||
{
|
||||
toSetPart = PART_MAIN;
|
||||
|
||||
if (false == bAdd)
|
||||
{
|
||||
// 코스츔 갑옷을 벗었을 때 원래 갑옷을 입고 있었다면 그 갑옷으로 look 세팅, 입지 않았다면 default look
|
||||
// 코스츔 갑옷을 벗었을 때 원래 갑옷을 입고 있었다면 그 갑옷으로 look 세팅, 입지 않았다면 default look
|
||||
const CItem* pArmor = m_pOwner->GetWear(WEAR_BODY);
|
||||
toSetValue = (NULL != pArmor) ? pArmor->GetVnum() : m_pOwner->GetOriginalPart(PART_MAIN);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// 헤어 코스츔
|
||||
// 헤어 코스츔
|
||||
else if (GetSubType() == COSTUME_HAIR)
|
||||
{
|
||||
toSetPart = PART_HAIR;
|
||||
|
||||
// 코스츔 헤어는 shape값을 item proto의 value3에 세팅하도록 함. 특별한 이유는 없고 기존 갑옷(ARMOR_BODY)의 shape값이 프로토의 value3에 있어서 헤어도 같이 value3으로 함.
|
||||
// [NOTE] 갑옷은 아이템 vnum을 보내고 헤어는 shape(value3)값을 보내는 이유는.. 기존 시스템이 그렇게 되어있음...
|
||||
// 코스츔 헤어는 shape값을 item proto의 value3에 세팅하도록 함. 특별한 이유는 없고 기존 갑옷(ARMOR_BODY)의 shape값이 프로토의 value3에 있어서 헤어도 같이 value3으로 함.
|
||||
// [NOTE] 갑옷은 아이템 vnum을 보내고 헤어는 shape(value3)값을 보내는 이유는.. 기존 시스템이 그렇게 되어있음...
|
||||
toSetValue = (true == bAdd) ? this->GetValue(3) : 0;
|
||||
}
|
||||
|
||||
@@ -821,7 +821,7 @@ bool CItem::EquipTo(LPCHARACTER ch, BYTE bWearCell)
|
||||
return false;
|
||||
}
|
||||
|
||||
// 용혼석 슬롯 index는 WEAR_MAX_NUM 보다 큼.
|
||||
// 용혼석 슬롯 index는 WEAR_MAX_NUM 보다 큼.
|
||||
if (IsDragonSoul())
|
||||
{
|
||||
if (bWearCell < WEAR_MAX_NUM || bWearCell >= WEAR_MAX_NUM + DRAGON_SOUL_DECK_MAX_NUM * DS_SLOT_MAX)
|
||||
@@ -848,7 +848,7 @@ bool CItem::EquipTo(LPCHARACTER ch, BYTE bWearCell)
|
||||
if (GetOwner())
|
||||
RemoveFromCharacter();
|
||||
|
||||
ch->SetWear(bWearCell, this); // 여기서 패킷 나감
|
||||
ch->SetWear(bWearCell, this); // 여기서 패킷 나감
|
||||
|
||||
m_pOwner = ch;
|
||||
m_bEquipped = true;
|
||||
@@ -932,7 +932,7 @@ bool CItem::Unequip()
|
||||
return false;
|
||||
}
|
||||
|
||||
//신규 말 아이템 제거시 처리
|
||||
//신규 말 아이템 제거시 처리
|
||||
if (IsRideItem())
|
||||
ClearMountAttributeAndAffect();
|
||||
|
||||
@@ -1262,7 +1262,7 @@ void CItem::AlterToMagicItem()
|
||||
}
|
||||
}
|
||||
|
||||
// 100% 확률로 좋은 속성 하나
|
||||
// 100% 확률로 좋은 속성 하나
|
||||
PutAttribute(aiItemMagicAttributePercentHigh);
|
||||
|
||||
if (number(1, 100) <= iSecondPct)
|
||||
@@ -1348,8 +1348,8 @@ EVENTFUNC(unique_expire_event)
|
||||
}
|
||||
else
|
||||
{
|
||||
// 게임 내에 시간제 아이템들이 빠릿빠릿하게 사라지지 않는 버그가 있어
|
||||
// 수정
|
||||
// 게임 내에 시간제 아이템들이 빠릿빠릿하게 사라지지 않는 버그가 있어
|
||||
// 수정
|
||||
// by rtsummit
|
||||
if (pkItem->GetSocket(ITEM_SOCKET_UNIQUE_REMAIN_TIME) - cur < 600)
|
||||
return PASSES_PER_SEC(pkItem->GetSocket(ITEM_SOCKET_UNIQUE_REMAIN_TIME) - cur);
|
||||
@@ -1359,9 +1359,9 @@ EVENTFUNC(unique_expire_event)
|
||||
}
|
||||
}
|
||||
|
||||
// 시간 후불제
|
||||
// timer를 시작할 때에 시간 차감하는 것이 아니라,
|
||||
// timer가 발화할 때에 timer가 동작한 시간 만큼 시간 차감을 한다.
|
||||
// 시간 후불제
|
||||
// timer를 시작할 때에 시간 차감하는 것이 아니라,
|
||||
// timer가 발화할 때에 timer가 동작한 시간 만큼 시간 차감을 한다.
|
||||
EVENTFUNC(timer_based_on_wear_expire_event)
|
||||
{
|
||||
item_event_info* info = dynamic_cast<item_event_info*>( event->info );
|
||||
@@ -1380,7 +1380,7 @@ EVENTFUNC(timer_based_on_wear_expire_event)
|
||||
pkItem->SetTimerBasedOnWearExpireEvent(NULL);
|
||||
pkItem->SetSocket(ITEM_SOCKET_REMAIN_SEC, 0);
|
||||
|
||||
// 일단 timer based on wear 용혼석은 시간 다 되었다고 없애지 않는다.
|
||||
// 일단 timer based on wear 용혼석은 시간 다 되었다고 없애지 않는다.
|
||||
if (pkItem->IsDragonSoul())
|
||||
{
|
||||
DSManager::instance().DeactivateDragonSoul(pkItem);
|
||||
@@ -1479,7 +1479,7 @@ void CItem::StartUniqueExpireEvent()
|
||||
if (m_pkUniqueExpireEvent)
|
||||
return;
|
||||
|
||||
//기간제 아이템일 경우 시간제 아이템은 동작하지 않는다
|
||||
//기간제 아이템일 경우 시간제 아이템은 동작하지 않는다
|
||||
if (IsRealTimeItem())
|
||||
return;
|
||||
|
||||
@@ -1502,14 +1502,14 @@ void CItem::StartUniqueExpireEvent()
|
||||
SetUniqueExpireEvent(event_create(unique_expire_event, info, PASSES_PER_SEC(iSec)));
|
||||
}
|
||||
|
||||
// 시간 후불제
|
||||
// timer_based_on_wear_expire_event 설명 참조
|
||||
// 시간 후불제
|
||||
// timer_based_on_wear_expire_event 설명 참조
|
||||
void CItem::StartTimerBasedOnWearExpireEvent()
|
||||
{
|
||||
if (m_pkTimerBasedOnWearExpireEvent)
|
||||
return;
|
||||
|
||||
//기간제 아이템일 경우 시간제 아이템은 동작하지 않는다
|
||||
//기간제 아이템일 경우 시간제 아이템은 동작하지 않는다
|
||||
if (IsRealTimeItem())
|
||||
return;
|
||||
|
||||
@@ -1518,7 +1518,7 @@ void CItem::StartTimerBasedOnWearExpireEvent()
|
||||
|
||||
int iSec = GetSocket(0);
|
||||
|
||||
// 남은 시간을 분단위로 끊기 위해...
|
||||
// 남은 시간을 분단위로 끊기 위해...
|
||||
if (0 != iSec)
|
||||
{
|
||||
iSec %= 60;
|
||||
@@ -1537,7 +1537,7 @@ void CItem::StopUniqueExpireEvent()
|
||||
if (!m_pkUniqueExpireEvent)
|
||||
return;
|
||||
|
||||
if (GetValue(2) != 0) // 게임시간제 이외의 아이템은 UniqueExpireEvent를 중단할 수 없다.
|
||||
if (GetValue(2) != 0) // 게임시간제 이외의 아이템은 UniqueExpireEvent를 중단할 수 없다.
|
||||
return;
|
||||
|
||||
// HARD CODING
|
||||
@@ -1574,12 +1574,12 @@ int CItem::GetSpecialGroup() const
|
||||
}
|
||||
|
||||
//
|
||||
// 악세서리 소켓 처리.
|
||||
// 악세서리 소켓 처리.
|
||||
//
|
||||
bool CItem::IsAccessoryForSocket()
|
||||
{
|
||||
return (m_pProto->bType == ITEM_ARMOR && (m_pProto->bSubType == ARMOR_WRIST || m_pProto->bSubType == ARMOR_NECK || m_pProto->bSubType == ARMOR_EAR)) ||
|
||||
(m_pProto->bType == ITEM_BELT); // 2013년 2월 새로 추가된 '벨트' 아이템의 경우 기획팀에서 악세서리 소켓 시스템을 그대로 이용하자고 함.
|
||||
(m_pProto->bType == ITEM_BELT); // 2013년 2월 새로 추가된 '벨트' 아이템의 경우 기획팀에서 악세서리 소켓 시스템을 그대로 이용하자고 함.
|
||||
}
|
||||
|
||||
void CItem::SetAccessorySocketGrade(int iGrade)
|
||||
@@ -1604,7 +1604,7 @@ void CItem::SetAccessorySocketDownGradeTime(DWORD time)
|
||||
SetSocket(2, time);
|
||||
|
||||
if (test_server && GetOwner())
|
||||
GetOwner()->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s에서 소켓 빠질때까지 남은 시간 %d"), GetName(), time);
|
||||
GetOwner()->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s에서 소켓 빠질때까지 남은 시간 %d"), GetName(), time);
|
||||
}
|
||||
|
||||
EVENTFUNC(accessory_socket_expire_event)
|
||||
@@ -1724,7 +1724,7 @@ void CItem::ClearMountAttributeAndAffect()
|
||||
}
|
||||
|
||||
// fixme
|
||||
// 이거 지금은 안쓴데... 근데 혹시나 싶어서 남겨둠.
|
||||
// 이거 지금은 안쓴데... 근데 혹시나 싶어서 남겨둠.
|
||||
// by rtsummit
|
||||
bool CItem::IsNewMountItem()
|
||||
{
|
||||
@@ -1752,7 +1752,7 @@ void CItem::AccessorySocketDegrade()
|
||||
|
||||
if (ch)
|
||||
{
|
||||
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s에 박혀있던 보석이 사라집니다."), GetName());
|
||||
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s에 박혀있던 보석이 사라집니다."), GetName());
|
||||
}
|
||||
|
||||
ModifyPoints(false);
|
||||
@@ -1771,7 +1771,7 @@ void CItem::AccessorySocketDegrade()
|
||||
}
|
||||
}
|
||||
|
||||
// ring에 item을 박을 수 있는지 여부를 체크해서 리턴
|
||||
// ring에 item을 박을 수 있는지 여부를 체크해서 리턴
|
||||
static const bool CanPutIntoRing(LPITEM ring, LPITEM item)
|
||||
{
|
||||
const DWORD vnum = item->GetVnum();
|
||||
@@ -1992,10 +1992,10 @@ int CItem::GetLevelLimit()
|
||||
|
||||
bool CItem::OnAfterCreatedItem()
|
||||
{
|
||||
// 아이템을 한 번이라도 사용했다면, 그 이후엔 사용 중이지 않아도 시간이 차감되는 방식
|
||||
// 아이템을 한 번이라도 사용했다면, 그 이후엔 사용 중이지 않아도 시간이 차감되는 방식
|
||||
if (-1 != this->GetProto()->cLimitRealTimeFirstUseIndex)
|
||||
{
|
||||
// Socket1에 아이템의 사용 횟수가 기록되어 있으니, 한 번이라도 사용한 아이템은 타이머를 시작한다.
|
||||
// Socket1에 아이템의 사용 횟수가 기록되어 있으니, 한 번이라도 사용한 아이템은 타이머를 시작한다.
|
||||
if (0 != GetSocket(1))
|
||||
{
|
||||
StartRealTimeExpireEvent();
|
||||
@@ -2008,8 +2008,8 @@ bool CItem::OnAfterCreatedItem()
|
||||
|
||||
#ifdef __AUCTION__
|
||||
|
||||
// 경매장
|
||||
// window를 경매장으로 한다.
|
||||
// 경매장
|
||||
// window를 경매장으로 한다.
|
||||
|
||||
bool CItem::MoveToAuction()
|
||||
{
|
||||
@@ -2076,7 +2076,7 @@ int CItem::GiveMoreTime_Per(float fPercent)
|
||||
return given_time;
|
||||
}
|
||||
}
|
||||
// 우선 용혼석에 관해서만 하도록 한다.
|
||||
// 우선 용혼석에 관해서만 하도록 한다.
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
@@ -2100,7 +2100,7 @@ int CItem::GiveMoreTime_Fix(DWORD dwTime)
|
||||
return dwTime;
|
||||
}
|
||||
}
|
||||
// 우선 용혼석에 관해서만 하도록 한다.
|
||||
// 우선 용혼석에 관해서만 하도록 한다.
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
@@ -2125,7 +2125,7 @@ int CItem::GetDuration()
|
||||
|
||||
bool CItem::IsSameSpecialGroup(const LPITEM item) const
|
||||
{
|
||||
// 서로 VNUM이 같다면 같은 그룹인 것으로 간주
|
||||
// 서로 VNUM이 같다면 같은 그룹인 것으로 간주
|
||||
if (this->GetVnum() == item->GetVnum())
|
||||
return true;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user