Drachenseelensystem entfernen (2/3): DS-Code aus gemeinsam genutzten Dateien entfernen
Zweiter Schritt der vollstaendigen Entfernung des Drachenseelensystems (Kernsystem + Alchemie/Refine, per Nutzerentscheidung komplett raus, Drachenseelen sollen ueberhaupt nicht mehr aktivierbar sein). Entfernt alle DragonSoul_*/DSManager-Aufrufe, ITEM_DS/ITEM_SPECIAL_DS/ ITEM_EXTRACT-Handling, das Drachenseelen-Inventar (pDSItems/wDSItemGrid), Deck-Aktivierung, den Refine-Netzwerkpfad (HEADER_CG_DRAGON_SOUL_REFINE), den GM-Befehl /dragon_soul sowie alle Aufrufstellen in char_item.cpp, item.cpp, exchange.cpp, shop(Ex).cpp, input_db.cpp, input_main.cpp, cmd(_gm).cpp. Sicherheitsprinzip beachtet: numerische Enum-Werte, von denen andere, bleibende Slot-Bereiche relativ abhaengen (v.a. BELT_INVENTORY_SLOT_START via DRAGON_SOUL_EQUIP_SLOT_*, sowie EItemTypes' ITEM_DS/ITEM_SPECIAL_DS/ ITEM_EXTRACT vor ITEM_SECONDARY_COIN/RING/BELT), wurden bewusst NICHT entfernt oder neu nummeriert, um Item-Positionen/-Typen bestehender Spieler-Datenbankeintraege nicht stillschweigend zu verschieben - nur der Code, der sie fuer Drachenseelen benutzt hat, wurde entfernt.
This commit is contained in:
@@ -22,15 +22,9 @@ enum EItemMisc
|
||||
const BYTE ITEM_SOCKET_REMAIN_SEC = 0;
|
||||
enum EItemValueIdice
|
||||
{
|
||||
ITEM_VALUE_DRAGON_SOUL_POLL_OUT_BONUS_IDX = 0,
|
||||
ITEM_VALUE_CHARGING_AMOUNT_IDX = 0,
|
||||
ITEM_VALUE_SECONDARY_COIN_UNIT_IDX = 0,
|
||||
};
|
||||
enum EItemDragonSoulSockets
|
||||
{
|
||||
ITEM_SOCKET_DRAGON_SOUL_ACTIVE_IDX = 2,
|
||||
ITEM_SOCKET_CHARGING_AMOUNT_IDX = 2,
|
||||
};
|
||||
// 헐 이거 미친거 아니야?
|
||||
// 나중에 소켓 확장하면 어쩌려고 이지랄 -_-;;;
|
||||
enum EItemUniqueSockets
|
||||
@@ -127,33 +121,6 @@ enum EDragonSoulSubType
|
||||
DS_SLOT_MAX,
|
||||
};
|
||||
|
||||
enum EDragonSoulGradeTypes
|
||||
{
|
||||
DRAGON_SOUL_GRADE_NORMAL,
|
||||
DRAGON_SOUL_GRADE_BRILLIANT,
|
||||
DRAGON_SOUL_GRADE_RARE,
|
||||
DRAGON_SOUL_GRADE_ANCIENT,
|
||||
DRAGON_SOUL_GRADE_LEGENDARY,
|
||||
DRAGON_SOUL_GRADE_MAX,
|
||||
|
||||
};
|
||||
|
||||
enum EDragonSoulStepTypes
|
||||
{
|
||||
DRAGON_SOUL_STEP_LOWEST,
|
||||
DRAGON_SOUL_STEP_LOW,
|
||||
DRAGON_SOUL_STEP_MID,
|
||||
DRAGON_SOUL_STEP_HIGH,
|
||||
DRAGON_SOUL_STEP_HIGHEST,
|
||||
DRAGON_SOUL_STEP_MAX,
|
||||
};
|
||||
#define DRAGON_SOUL_STRENGTH_MAX 7
|
||||
|
||||
enum EDSInventoryMaxNum
|
||||
{
|
||||
DRAGON_SOUL_INVENTORY_MAX_NUM = DS_SLOT_MAX * DRAGON_SOUL_GRADE_MAX * DRAGON_SOUL_BOX_SIZE,
|
||||
};
|
||||
|
||||
enum EFishSubTypes
|
||||
{
|
||||
FISH_ALIVE,
|
||||
@@ -219,12 +186,6 @@ enum EUseSubTypes
|
||||
USE_PUT_INTO_RING_SOCKET, // 30 반지 소켓에 사용할 수 있는 아이템 (유니크 반지 말고, 새로 추가된 반지 슬롯)
|
||||
};
|
||||
|
||||
enum EExtractSubTypes
|
||||
{
|
||||
EXTRACT_DRAGON_SOUL,
|
||||
EXTRACT_DRAGON_HEART,
|
||||
};
|
||||
|
||||
enum EAutoUseSubTypes
|
||||
{
|
||||
AUTOUSE_POTION,
|
||||
|
||||
@@ -56,10 +56,6 @@ enum EMisc
|
||||
MOB_SKILL_MAX_NUM = 5,
|
||||
|
||||
POINT_MAX_NUM = 255,
|
||||
DRAGON_SOUL_BOX_SIZE = 32,
|
||||
DRAGON_SOUL_BOX_COLUMN_NUM = 8,
|
||||
DRAGON_SOUL_BOX_ROW_NUM = DRAGON_SOUL_BOX_SIZE / DRAGON_SOUL_BOX_COLUMN_NUM,
|
||||
DRAGON_SOUL_REFINE_GRID_SIZE = 15,
|
||||
MAX_AMOUNT_OF_MALL_BONUS = 20,
|
||||
|
||||
WEAR_MAX_NUM = 32,
|
||||
@@ -141,8 +137,6 @@ enum EWearPositions
|
||||
|
||||
enum EDragonSoulDeckType
|
||||
{
|
||||
DRAGON_SOUL_DECK_0,
|
||||
DRAGON_SOUL_DECK_1,
|
||||
DRAGON_SOUL_DECK_MAX_NUM = 2,
|
||||
|
||||
DRAGON_SOUL_DECK_RESERVED_MAX_NUM = 3, // NOTE: 중요! 아직 사용중이진 않지만, 3페이지 분량을 예약 해 둠. DS DECK을 늘릴 경우 반드시 그 수만큼 RESERVED에서 차감해야 함!
|
||||
@@ -732,8 +726,6 @@ typedef struct SItemPos
|
||||
case EQUIPMENT:
|
||||
case BELT_INVENTORY:
|
||||
return cell < INVENTORY_AND_EQUIP_SLOT_MAX;
|
||||
case DRAGON_SOUL_INVENTORY:
|
||||
return cell < (DRAGON_SOUL_INVENTORY_MAX_NUM);
|
||||
// 동적으로 크기가 정해지는 window는 valid 체크를 할 수가 없다.
|
||||
case SAFEBOX:
|
||||
case MALL:
|
||||
|
||||
@@ -95,9 +95,9 @@ enum EAffectTypes
|
||||
AFFECT_AUTO_HP_RECOVERY = 534,
|
||||
AFFECT_AUTO_SP_RECOVERY = 535,
|
||||
|
||||
AFFECT_DRAGON_SOUL_QUALIFIED = 540,
|
||||
AFFECT_DRAGON_SOUL_DECK_0 = 541,
|
||||
AFFECT_DRAGON_SOUL_DECK_1 = 542,
|
||||
// AFFECT_DRAGON_SOUL_QUALIFIED = 540, // reserviert, Drachenseelensystem entfernt, Werte nicht wiederverwenden (alte DB-Zeilen)
|
||||
// AFFECT_DRAGON_SOUL_DECK_0 = 541,
|
||||
// AFFECT_DRAGON_SOUL_DECK_1 = 542,
|
||||
|
||||
|
||||
AFFECT_RAMADAN_ABILITY = 300,
|
||||
|
||||
@@ -60,7 +60,6 @@
|
||||
#ifdef __PET_SYSTEM__
|
||||
#include "PetSystem.h"
|
||||
#endif
|
||||
#include "DragonSoul.h"
|
||||
|
||||
extern const BYTE g_aBuffOnAttrPoints;
|
||||
extern bool RaceToJob(unsigned race, unsigned *ret_job);
|
||||
@@ -382,8 +381,6 @@ void CHARACTER::Initialize()
|
||||
m_fAttMul = 1.0f;
|
||||
m_fDamMul = 1.0f;
|
||||
|
||||
m_pointsInstant.iDragonSoulActiveDeck = -1;
|
||||
|
||||
memset(&m_tvLastSyncTime, 0, sizeof(m_tvLastSyncTime));
|
||||
m_iSyncHackCount = 0;
|
||||
}
|
||||
@@ -469,7 +466,6 @@ void CHARACTER::Destroy()
|
||||
|
||||
if (NULL == m_pkMobData)
|
||||
{
|
||||
DragonSoul_CleanUp();
|
||||
ClearItem();
|
||||
}
|
||||
|
||||
@@ -2384,24 +2380,6 @@ void CHARACTER::ComputePoints()
|
||||
}
|
||||
}
|
||||
|
||||
// 용혼석 시스템
|
||||
// ComputePoints에서는 케릭터의 모든 속성값을 초기화하고,
|
||||
// 아이템, 버프 등에 관련된 모든 속성값을 재계산하기 때문에,
|
||||
// 용혼석 시스템도 ActiveDeck에 있는 모든 용혼석의 속성값을 다시 적용시켜야 한다.
|
||||
if (DragonSoul_IsDeckActivated())
|
||||
{
|
||||
for (int i = WEAR_MAX_NUM + DS_SLOT_MAX * DragonSoul_GetActiveDeck();
|
||||
i < WEAR_MAX_NUM + DS_SLOT_MAX * (DragonSoul_GetActiveDeck() + 1); i++)
|
||||
{
|
||||
LPITEM pItem = GetWear(i);
|
||||
if (pItem)
|
||||
{
|
||||
if (DSManager::instance().IsTimeLeftDragonSoul(pItem))
|
||||
pItem->ModifyPoints(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (GetHP() > GetMaxHP())
|
||||
PointChange(POINT_HP, GetMaxHP() - GetHP());
|
||||
|
||||
|
||||
@@ -397,10 +397,6 @@ typedef struct character_point_instant
|
||||
LPITEM pItems[INVENTORY_AND_EQUIP_SLOT_MAX];
|
||||
BYTE bItemGrid[INVENTORY_AND_EQUIP_SLOT_MAX];
|
||||
|
||||
// 용혼석 인벤토리.
|
||||
LPITEM pDSItems[DRAGON_SOUL_INVENTORY_MAX_NUM];
|
||||
WORD wDSItemGrid[DRAGON_SOUL_INVENTORY_MAX_NUM];
|
||||
|
||||
// by mhh
|
||||
LPITEM pCubeItems[CUBE_MAX_NUM];
|
||||
LPCHARACTER pCubeNpc;
|
||||
@@ -415,8 +411,6 @@ typedef struct character_point_instant
|
||||
|
||||
BYTE bBlockMode;
|
||||
|
||||
int iDragonSoulActiveDeck;
|
||||
LPENTITY m_pDragonSoulRefineWindowOpener;
|
||||
} CHARACTER_POINT_INSTANT;
|
||||
|
||||
#define TRIGGERPARAM LPCHARACTER ch, LPCHARACTER causer
|
||||
@@ -1129,8 +1123,6 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
|
||||
void AutoGiveItem(LPITEM item, bool longOwnerShip = false);
|
||||
|
||||
int GetEmptyInventory(BYTE size) const;
|
||||
int GetEmptyDragonSoulInventory(LPITEM pItem) const;
|
||||
void CopyDragonSoulItemGrid(std::vector<WORD>& vDragonSoulItemGrid) const;
|
||||
|
||||
int CountEmptyInventory() const;
|
||||
|
||||
@@ -2009,38 +2001,6 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
|
||||
void SetItemAward_cmd(char* cmd) { strcpy(itemAward_cmd,cmd); }
|
||||
//void SetItemAward_flag(bool flag) { itemAward_flag = flag; }
|
||||
|
||||
public:
|
||||
//용혼석
|
||||
|
||||
// 캐릭터의 affect, quest가 load 되기 전에 DragonSoul_Initialize를 호출하면 안된다.
|
||||
// affect가 가장 마지막에 로드되어 LoadAffect에서 호출함.
|
||||
void DragonSoul_Initialize();
|
||||
|
||||
bool DragonSoul_IsQualified() const;
|
||||
void DragonSoul_GiveQualification();
|
||||
|
||||
int DragonSoul_GetActiveDeck() const;
|
||||
bool DragonSoul_IsDeckActivated() const;
|
||||
bool DragonSoul_ActivateDeck(int deck_idx);
|
||||
|
||||
void DragonSoul_DeactivateAll();
|
||||
// 반드시 ClearItem 전에 불러야 한다.
|
||||
// 왜냐하면....
|
||||
// 용혼석 하나 하나를 deactivate할 때마다 덱에 active인 용혼석이 있는지 확인하고,
|
||||
// active인 용혼석이 하나도 없다면, 캐릭터의 용혼석 affect와, 활성 상태를 제거한다.
|
||||
//
|
||||
// 하지만 ClearItem 시, 캐릭터가 착용하고 있는 모든 아이템을 unequip하는 바람에,
|
||||
// 용혼석 Affect가 제거되고, 결국 로그인 시, 용혼석이 활성화되지 않는다.
|
||||
// (Unequip할 때에는 로그아웃 상태인지, 아닌지 알 수 없다.)
|
||||
// 용혼석만 deactivate시키고 캐릭터의 용혼석 덱 활성 상태는 건드리지 않는다.
|
||||
void DragonSoul_CleanUp();
|
||||
// 용혼석 강화창
|
||||
public:
|
||||
bool DragonSoul_RefineWindow_Open(LPENTITY pEntity);
|
||||
bool DragonSoul_RefineWindow_Close();
|
||||
LPENTITY DragonSoul_RefineWindow_GetOpener() { return m_pointsInstant.m_pDragonSoulRefineWindowOpener; }
|
||||
bool DragonSoul_RefineWindow_CanRefine();
|
||||
|
||||
private:
|
||||
// SyncPosition을 악용하여 타유저를 이상한 곳으로 보내는 핵 방어하기 위하여,
|
||||
// SyncPosition이 일어날 때를 기록.
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
#include "arena.h"
|
||||
#include "horsename_manager.h"
|
||||
#include "item.h"
|
||||
#include "DragonSoul.h"
|
||||
|
||||
#define IS_NO_SAVE_AFFECT(type) ((type) == AFFECT_WAR_FLAG || (type) == AFFECT_REVIVE_INVISIBLE || ((type) >= AFFECT_PREMIUM_START && (type) <= AFFECT_PREMIUM_END))
|
||||
#define IS_NO_CLEAR_ON_DEATH_AFFECT(type) ((type) == AFFECT_BLOCK_CHAT || ((type) >= 500 && (type) < 600))
|
||||
@@ -529,8 +528,6 @@ void CHARACTER::LoadAffect(DWORD dwCount, TPacketAffectElement * pElements)
|
||||
|
||||
m_bIsLoadedAffect = true;
|
||||
|
||||
// 용혼석 셋팅 로드 및 초기화
|
||||
DragonSoul_Initialize();
|
||||
}
|
||||
|
||||
bool CHARACTER::AddAffect(DWORD dwType, BYTE bApplyOn, long lApplyValue, DWORD dwFlag, long lDuration, long lSPCost, bool bOverride, bool IsCube )
|
||||
|
||||
@@ -42,7 +42,6 @@
|
||||
#include "shop.h"
|
||||
|
||||
#include "../../common/VnumHelper.h"
|
||||
#include "DragonSoul.h"
|
||||
#include "buff_on_attributes.h"
|
||||
#include "belt_inventory_helper.h"
|
||||
|
||||
@@ -221,7 +220,7 @@ bool CHARACTER::CanHandleItem(bool bSkipCheckRefine, bool bSkipObserver)
|
||||
if (m_bUnderRefine)
|
||||
return false;
|
||||
|
||||
if (IsCubeOpen() || NULL != DragonSoul_RefineWindow_GetOpener())
|
||||
if (IsCubeOpen())
|
||||
return false;
|
||||
|
||||
if (IsWarping())
|
||||
@@ -250,13 +249,6 @@ LPITEM CHARACTER::GetItem(TItemPos Cell) const
|
||||
return NULL;
|
||||
}
|
||||
return m_pointsInstant.pItems[wCell];
|
||||
case DRAGON_SOUL_INVENTORY:
|
||||
if (wCell >= DRAGON_SOUL_INVENTORY_MAX_NUM)
|
||||
{
|
||||
sys_err("CHARACTER::GetInventoryItem: invalid DS item cell %d", wCell);
|
||||
return NULL;
|
||||
}
|
||||
return m_pointsInstant.pDSItems[wCell];
|
||||
|
||||
default:
|
||||
return NULL;
|
||||
@@ -338,61 +330,6 @@ void CHARACTER::SetItem(TItemPos Cell, LPITEM pItem)
|
||||
m_pointsInstant.pItems[wCell] = pItem;
|
||||
}
|
||||
break;
|
||||
// 용혼석 인벤토리
|
||||
case DRAGON_SOUL_INVENTORY:
|
||||
{
|
||||
LPITEM pOld = m_pointsInstant.pDSItems[wCell];
|
||||
|
||||
if (pOld)
|
||||
{
|
||||
if (wCell < DRAGON_SOUL_INVENTORY_MAX_NUM)
|
||||
{
|
||||
for (int i = 0; i < pOld->GetSize(); ++i)
|
||||
{
|
||||
int p = wCell + (i * DRAGON_SOUL_BOX_COLUMN_NUM);
|
||||
|
||||
if (p >= DRAGON_SOUL_INVENTORY_MAX_NUM)
|
||||
continue;
|
||||
|
||||
if (m_pointsInstant.pDSItems[p] && m_pointsInstant.pDSItems[p] != pOld)
|
||||
continue;
|
||||
|
||||
m_pointsInstant.wDSItemGrid[p] = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
m_pointsInstant.wDSItemGrid[wCell] = 0;
|
||||
}
|
||||
|
||||
if (pItem)
|
||||
{
|
||||
if (wCell >= DRAGON_SOUL_INVENTORY_MAX_NUM)
|
||||
{
|
||||
sys_err("CHARACTER::SetItem: invalid DS item cell %d", wCell);
|
||||
return;
|
||||
}
|
||||
|
||||
if (wCell < DRAGON_SOUL_INVENTORY_MAX_NUM)
|
||||
{
|
||||
for (int i = 0; i < pItem->GetSize(); ++i)
|
||||
{
|
||||
int p = wCell + (i * DRAGON_SOUL_BOX_COLUMN_NUM);
|
||||
|
||||
if (p >= DRAGON_SOUL_INVENTORY_MAX_NUM)
|
||||
continue;
|
||||
|
||||
// wCell + 1 로 하는 것은 빈곳을 체크할 때 같은
|
||||
// 아이템은 예외처리하기 위함
|
||||
m_pointsInstant.wDSItemGrid[p] = wCell + 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
m_pointsInstant.wDSItemGrid[wCell] = wCell + 1;
|
||||
}
|
||||
|
||||
m_pointsInstant.pDSItems[wCell] = pItem;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
sys_err ("Invalid Inventory type %d", window_type);
|
||||
return;
|
||||
@@ -411,7 +348,7 @@ void CHARACTER::SetItem(TItemPos Cell, LPITEM pItem)
|
||||
pack.vnum = pItem->GetVnum();
|
||||
pack.flags = pItem->GetFlag();
|
||||
pack.anti_flags = pItem->GetAntiFlag();
|
||||
pack.highlight = (Cell.window_type == DRAGON_SOUL_INVENTORY);
|
||||
pack.highlight = false;
|
||||
|
||||
|
||||
thecore_memcpy(pack.alSockets, pItem->GetSockets(), sizeof(pack.alSockets));
|
||||
@@ -445,9 +382,6 @@ void CHARACTER::SetItem(TItemPos Cell, LPITEM pItem)
|
||||
else
|
||||
pItem->SetWindow(EQUIPMENT);
|
||||
break;
|
||||
case DRAGON_SOUL_INVENTORY:
|
||||
pItem->SetWindow(DRAGON_SOUL_INVENTORY);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -455,7 +389,7 @@ void CHARACTER::SetItem(TItemPos Cell, LPITEM pItem)
|
||||
LPITEM CHARACTER::GetWear(BYTE bCell) const
|
||||
{
|
||||
// > WEAR_MAX_NUM : 용혼석 슬롯들.
|
||||
if (bCell >= WEAR_MAX_NUM + DRAGON_SOUL_DECK_MAX_NUM * DS_SLOT_MAX)
|
||||
if (bCell >= WEAR_MAX_NUM)
|
||||
{
|
||||
sys_err("CHARACTER::GetWear: invalid wear cell %d", bCell);
|
||||
return NULL;
|
||||
@@ -467,7 +401,7 @@ LPITEM CHARACTER::GetWear(BYTE bCell) const
|
||||
void CHARACTER::SetWear(BYTE bCell, LPITEM item)
|
||||
{
|
||||
// > WEAR_MAX_NUM : 용혼석 슬롯들.
|
||||
if (bCell >= WEAR_MAX_NUM + DRAGON_SOUL_DECK_MAX_NUM * DS_SLOT_MAX)
|
||||
if (bCell >= WEAR_MAX_NUM)
|
||||
{
|
||||
sys_err("CHARACTER::SetItem: invalid item cell %d", bCell);
|
||||
return;
|
||||
@@ -504,17 +438,6 @@ void CHARACTER::ClearItem()
|
||||
SyncQuickslot(QUICKSLOT_TYPE_ITEM, i, 255);
|
||||
}
|
||||
}
|
||||
for (i = 0; i < DRAGON_SOUL_INVENTORY_MAX_NUM; ++i)
|
||||
{
|
||||
if ((item = GetItem(TItemPos(DRAGON_SOUL_INVENTORY, i))))
|
||||
{
|
||||
item->SetSkipSave(true);
|
||||
ITEM_MANAGER::instance().FlushDelayedSave(item);
|
||||
|
||||
item->RemoveFromCharacter();
|
||||
M2_DESTROY_ITEM(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool CHARACTER::IsEmptyItemGrid(TItemPos Cell, BYTE bSize, int iExceptionCell) const
|
||||
@@ -614,67 +537,6 @@ bool CHARACTER::IsEmptyItemGrid(TItemPos Cell, BYTE bSize, int iExceptionCell) c
|
||||
}
|
||||
}
|
||||
break;
|
||||
case DRAGON_SOUL_INVENTORY:
|
||||
{
|
||||
WORD wCell = Cell.cell;
|
||||
if (wCell >= DRAGON_SOUL_INVENTORY_MAX_NUM)
|
||||
return false;
|
||||
|
||||
// bItemCell은 0이 false임을 나타내기 위해 + 1 해서 처리한다.
|
||||
// 따라서 iExceptionCell에 1을 더해 비교한다.
|
||||
iExceptionCell++;
|
||||
|
||||
if (m_pointsInstant.wDSItemGrid[wCell])
|
||||
{
|
||||
if (m_pointsInstant.wDSItemGrid[wCell] == iExceptionCell)
|
||||
{
|
||||
if (bSize == 1)
|
||||
return true;
|
||||
|
||||
int j = 1;
|
||||
|
||||
do
|
||||
{
|
||||
BYTE p = wCell + (DRAGON_SOUL_BOX_COLUMN_NUM * j);
|
||||
|
||||
if (p >= DRAGON_SOUL_INVENTORY_MAX_NUM)
|
||||
return false;
|
||||
|
||||
if (m_pointsInstant.wDSItemGrid[p])
|
||||
if (m_pointsInstant.wDSItemGrid[p] != iExceptionCell)
|
||||
return false;
|
||||
}
|
||||
while (++j < bSize);
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
// 크기가 1이면 한칸을 차지하는 것이므로 그냥 리턴
|
||||
if (1 == bSize)
|
||||
return true;
|
||||
else
|
||||
{
|
||||
int j = 1;
|
||||
|
||||
do
|
||||
{
|
||||
BYTE p = wCell + (DRAGON_SOUL_BOX_COLUMN_NUM * j);
|
||||
|
||||
if (p >= DRAGON_SOUL_INVENTORY_MAX_NUM)
|
||||
return false;
|
||||
|
||||
if (m_pointsInstant.bItemGrid[p])
|
||||
if (m_pointsInstant.wDSItemGrid[p] != iExceptionCell)
|
||||
return false;
|
||||
}
|
||||
while (++j < bSize);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -688,34 +550,6 @@ int CHARACTER::GetEmptyInventory(BYTE size) const
|
||||
return -1;
|
||||
}
|
||||
|
||||
int CHARACTER::GetEmptyDragonSoulInventory(LPITEM pItem) const
|
||||
{
|
||||
if (NULL == pItem || !pItem->IsDragonSoul())
|
||||
return -1;
|
||||
if (!DragonSoul_IsQualified())
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
BYTE bSize = pItem->GetSize();
|
||||
WORD wBaseCell = DSManager::instance().GetBasePosition(pItem);
|
||||
|
||||
if (WORD_MAX == wBaseCell)
|
||||
return -1;
|
||||
|
||||
for (int i = 0; i < DRAGON_SOUL_BOX_SIZE; ++i)
|
||||
if (IsEmptyItemGrid(TItemPos(DRAGON_SOUL_INVENTORY, i + wBaseCell), bSize))
|
||||
return i + wBaseCell;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
void CHARACTER::CopyDragonSoulItemGrid(std::vector<WORD>& vDragonSoulItemGrid) const
|
||||
{
|
||||
vDragonSoulItemGrid.resize(DRAGON_SOUL_INVENTORY_MAX_NUM);
|
||||
|
||||
std::copy(m_pointsInstant.wDSItemGrid, m_pointsInstant.wDSItemGrid + DRAGON_SOUL_INVENTORY_MAX_NUM, vDragonSoulItemGrid.begin());
|
||||
}
|
||||
|
||||
int CHARACTER::CountEmptyInventory() const
|
||||
{
|
||||
int count = 0;
|
||||
@@ -1962,23 +1796,6 @@ bool CHARACTER::UseItemEx(LPITEM item, TItemPos DestCell)
|
||||
else
|
||||
UnequipItem(item);
|
||||
break;
|
||||
// 착용하지 않은 용혼석은 사용할 수 없다.
|
||||
// 정상적인 클라라면, 용혼석에 관하여 item use 패킷을 보낼 수 없다.
|
||||
// 용혼석 착용은 item move 패킷으로 한다.
|
||||
// 착용한 용혼석은 추출한다.
|
||||
case ITEM_DS:
|
||||
{
|
||||
if (!item->IsEquipped())
|
||||
return false;
|
||||
return DSManager::instance().PullOut(this, NPOS, item);
|
||||
break;
|
||||
}
|
||||
case ITEM_SPECIAL_DS:
|
||||
if (!item->IsEquipped())
|
||||
EquipItem(item);
|
||||
else
|
||||
UnequipItem(item);
|
||||
break;
|
||||
|
||||
case ITEM_FISH:
|
||||
{
|
||||
@@ -2098,14 +1915,6 @@ bool CHARACTER::UseItemEx(LPITEM item, TItemPos DestCell)
|
||||
}
|
||||
}
|
||||
|
||||
if( (dwBoxVnum > 51500 && dwBoxVnum < 52000) || (dwBoxVnum >= 50255 && dwBoxVnum <= 50260) ) // 용혼원석들
|
||||
{
|
||||
if( !(this->DragonSoul_IsQualified()) )
|
||||
{
|
||||
ChatPacket(CHAT_TYPE_INFO,LC_TEXT("먼저 용혼석 퀘스트를 완료하셔야 합니다."));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (GiveItemFromSpecialItemGroup(dwBoxVnum, dwVnums, dwCounts, item_gets, count))
|
||||
{
|
||||
@@ -2435,94 +2244,6 @@ bool CHARACTER::UseItemEx(LPITEM item, TItemPos DestCell)
|
||||
|
||||
switch (item->GetSubType())
|
||||
{
|
||||
case USE_TIME_CHARGE_PER:
|
||||
{
|
||||
LPITEM pDestItem = GetItem(DestCell);
|
||||
if (NULL == pDestItem)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
// 우선 용혼석에 관해서만 하도록 한다.
|
||||
if (pDestItem->IsDragonSoul())
|
||||
{
|
||||
int ret;
|
||||
char buf[128];
|
||||
if (item->GetVnum() == DRAGON_HEART_VNUM)
|
||||
{
|
||||
ret = pDestItem->GiveMoreTime_Per((float)item->GetSocket(ITEM_SOCKET_CHARGING_AMOUNT_IDX));
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = pDestItem->GiveMoreTime_Per((float)item->GetValue(ITEM_VALUE_CHARGING_AMOUNT_IDX));
|
||||
}
|
||||
if (ret > 0)
|
||||
{
|
||||
if (item->GetVnum() == DRAGON_HEART_VNUM)
|
||||
{
|
||||
sprintf(buf, "Inc %ds by item{VN:%d SOC%d:%d}", ret, item->GetVnum(), ITEM_SOCKET_CHARGING_AMOUNT_IDX, item->GetSocket(ITEM_SOCKET_CHARGING_AMOUNT_IDX));
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf(buf, "Inc %ds by item{VN:%d VAL%d:%d}", ret, item->GetVnum(), ITEM_VALUE_CHARGING_AMOUNT_IDX, item->GetValue(ITEM_VALUE_CHARGING_AMOUNT_IDX));
|
||||
}
|
||||
|
||||
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%d초 만큼 충전되었습니다."), ret);
|
||||
item->SetCount(item->GetCount() - 1);
|
||||
LogManager::instance().ItemLog(this, item, "DS_CHARGING_SUCCESS", buf);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (item->GetVnum() == DRAGON_HEART_VNUM)
|
||||
{
|
||||
sprintf(buf, "No change by item{VN:%d SOC%d:%d}", item->GetVnum(), ITEM_SOCKET_CHARGING_AMOUNT_IDX, item->GetSocket(ITEM_SOCKET_CHARGING_AMOUNT_IDX));
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf(buf, "No change by item{VN:%d VAL%d:%d}", item->GetVnum(), ITEM_VALUE_CHARGING_AMOUNT_IDX, item->GetValue(ITEM_VALUE_CHARGING_AMOUNT_IDX));
|
||||
}
|
||||
|
||||
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("충전할 수 없습니다."));
|
||||
LogManager::instance().ItemLog(this, item, "DS_CHARGING_FAILED", buf);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case USE_TIME_CHARGE_FIX:
|
||||
{
|
||||
LPITEM pDestItem = GetItem(DestCell);
|
||||
if (NULL == pDestItem)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
// 우선 용혼석에 관해서만 하도록 한다.
|
||||
if (pDestItem->IsDragonSoul())
|
||||
{
|
||||
int ret = pDestItem->GiveMoreTime_Fix(item->GetValue(ITEM_VALUE_CHARGING_AMOUNT_IDX));
|
||||
char buf[128];
|
||||
if (ret)
|
||||
{
|
||||
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%d초 만큼 충전되었습니다."), ret);
|
||||
sprintf(buf, "Increase %ds by item{VN:%d VAL%d:%d}", ret, item->GetVnum(), ITEM_VALUE_CHARGING_AMOUNT_IDX, item->GetValue(ITEM_VALUE_CHARGING_AMOUNT_IDX));
|
||||
LogManager::instance().ItemLog(this, item, "DS_CHARGING_SUCCESS", buf);
|
||||
item->SetCount(item->GetCount() - 1);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("충전할 수 없습니다."));
|
||||
sprintf(buf, "No change by item{VN:%d VAL%d:%d}", item->GetVnum(), ITEM_VALUE_CHARGING_AMOUNT_IDX, item->GetValue(ITEM_VALUE_CHARGING_AMOUNT_IDX));
|
||||
LogManager::instance().ItemLog(this, item, "DS_CHARGING_FAILED", buf);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case USE_SPECIAL:
|
||||
|
||||
switch (item->GetVnum())
|
||||
@@ -5207,33 +4928,6 @@ bool CHARACTER::UseItemEx(LPITEM item, TItemPos DestCell)
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ITEM_EXTRACT:
|
||||
{
|
||||
LPITEM pDestItem = GetItem(DestCell);
|
||||
if (NULL == pDestItem)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
switch (item->GetSubType())
|
||||
{
|
||||
case EXTRACT_DRAGON_SOUL:
|
||||
if (pDestItem->IsDragonSoul())
|
||||
{
|
||||
return DSManager::instance().PullOut(this, NPOS, pDestItem, item);
|
||||
}
|
||||
return false;
|
||||
case EXTRACT_DRAGON_HEART:
|
||||
if (pDestItem->IsDragonSoul())
|
||||
{
|
||||
return DSManager::instance().ExtractDragonHeart(this, pDestItem, item);
|
||||
}
|
||||
return false;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case ITEM_NONE:
|
||||
sys_err("Item type NONE %s", item->GetName());
|
||||
break;
|
||||
@@ -5444,8 +5138,6 @@ bool CHARACTER::DropItem(TItemPos Cell, BYTE bCount)
|
||||
|
||||
if (!CanHandleItem())
|
||||
{
|
||||
if (NULL != DragonSoul_RefineWindow_GetOpener())
|
||||
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("강화창을 연 상태에서는 아이템을 옮길 수 없습니다."));
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -5648,8 +5340,6 @@ bool CHARACTER::MoveItem(TItemPos Cell, TItemPos DestCell, BYTE count)
|
||||
|
||||
if (!CanHandleItem())
|
||||
{
|
||||
if (NULL != DragonSoul_RefineWindow_GetOpener())
|
||||
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("강화창을 연 상태에서는 아이템을 옮길 수 없습니다."));
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -5677,27 +5367,6 @@ bool CHARACTER::MoveItem(TItemPos Cell, TItemPos DestCell, BYTE count)
|
||||
}
|
||||
else
|
||||
{
|
||||
if (item->IsDragonSoul())
|
||||
{
|
||||
if (item->IsEquipped())
|
||||
{
|
||||
return DSManager::instance().PullOut(this, DestCell, item);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (DestCell.window_type != DRAGON_SOUL_INVENTORY)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!DSManager::instance().IsValidCellForThisItem(item, DestCell))
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// 용혼석이 아닌 아이템은 용혼석 인벤에 들어갈 수 없다.
|
||||
else if (DRAGON_SOUL_INVENTORY == DestCell.window_type)
|
||||
return false;
|
||||
|
||||
LPITEM item2;
|
||||
|
||||
if ((item2 = GetItem(DestCell)) && item != item2 && item2->IsStackable() &&
|
||||
@@ -5952,30 +5621,15 @@ bool CHARACTER::PickupItem(DWORD dwVID)
|
||||
}
|
||||
|
||||
int iEmptyCell;
|
||||
if (item->IsDragonSoul())
|
||||
{
|
||||
if ((iEmptyCell = GetEmptyDragonSoulInventory(item)) == -1)
|
||||
{
|
||||
sys_log(0, "No empty ds inventory pid %u size %ud itemid %u", GetPlayerID(), item->GetSize(), item->GetID());
|
||||
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("소지하고 있는 아이템이 너무 많습니다."));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((iEmptyCell = GetEmptyInventory(item->GetSize())) == -1)
|
||||
{
|
||||
sys_log(0, "No empty inventory pid %u size %ud itemid %u", GetPlayerID(), item->GetSize(), item->GetID());
|
||||
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("소지하고 있는 아이템이 너무 많습니다."));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
item->RemoveFromGround();
|
||||
|
||||
if (item->IsDragonSoul())
|
||||
item->AddToCharacter(this, TItemPos(DRAGON_SOUL_INVENTORY, iEmptyCell));
|
||||
else
|
||||
item->AddToCharacter(this, TItemPos(INVENTORY, iEmptyCell));
|
||||
|
||||
char szHint[32+1];
|
||||
@@ -6001,21 +5655,6 @@ bool CHARACTER::PickupItem(DWORD dwVID)
|
||||
|
||||
int iEmptyCell;
|
||||
|
||||
if (item->IsDragonSoul())
|
||||
{
|
||||
if (!(owner && (iEmptyCell = owner->GetEmptyDragonSoulInventory(item)) != -1))
|
||||
{
|
||||
owner = this;
|
||||
|
||||
if ((iEmptyCell = GetEmptyDragonSoulInventory(item)) == -1)
|
||||
{
|
||||
owner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("소지하고 있는 아이템이 너무 많습니다."));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!(owner && (iEmptyCell = owner->GetEmptyInventory(item->GetSize())) != -1))
|
||||
{
|
||||
owner = this;
|
||||
@@ -6026,13 +5665,9 @@ bool CHARACTER::PickupItem(DWORD dwVID)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
item->RemoveFromGround();
|
||||
|
||||
if (item->IsDragonSoul())
|
||||
item->AddToCharacter(owner, TItemPos(DRAGON_SOUL_INVENTORY, iEmptyCell));
|
||||
else
|
||||
item->AddToCharacter(owner, TItemPos(INVENTORY, iEmptyCell));
|
||||
|
||||
char szHint[32+1];
|
||||
@@ -6147,9 +5782,6 @@ bool CHARACTER::UnequipItem(LPITEM item)
|
||||
if (false == CanUnequipNow(item))
|
||||
return false;
|
||||
|
||||
if (item->IsDragonSoul())
|
||||
pos = GetEmptyDragonSoulInventory(item);
|
||||
else
|
||||
pos = GetEmptyInventory(item->GetSize());
|
||||
|
||||
// HARD CODING
|
||||
@@ -6157,11 +5789,6 @@ bool CHARACTER::UnequipItem(LPITEM item)
|
||||
ShowAlignment(true);
|
||||
|
||||
item->RemoveFromCharacter();
|
||||
if (item->IsDragonSoul())
|
||||
{
|
||||
item->AddToCharacter(this, TItemPos(DRAGON_SOUL_INVENTORY, pos));
|
||||
}
|
||||
else
|
||||
item->AddToCharacter(this, TItemPos(INVENTORY, pos));
|
||||
|
||||
CheckMaximumPoints();
|
||||
@@ -6286,25 +5913,6 @@ bool CHARACTER::EquipItem(LPITEM item, int iCandidateCell)
|
||||
LogManager::instance().ItemLog(this, item, "ITEM_SPLIT", szSplitBuf);
|
||||
}
|
||||
|
||||
// 용혼석 특수 처리
|
||||
if (item->IsDragonSoul())
|
||||
{
|
||||
// 같은 타입의 용혼석이 이미 들어가 있다면 착용할 수 없다.
|
||||
// 용혼석은 swap을 지원하면 안됨.
|
||||
if(GetInventoryItem(INVENTORY_MAX_NUM + iWearCell))
|
||||
{
|
||||
ChatPacket(CHAT_TYPE_INFO, "이미 같은 종류의 용혼석을 착용하고 있습니다.");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!item->EquipTo(this, iWearCell))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// 용혼석이 아님.
|
||||
else
|
||||
{
|
||||
// 착용할 곳에 아이템이 있다면,
|
||||
if (GetWear(iWearCell) && !IS_SET(GetWear(iWearCell)->GetFlag(), ITEM_FLAG_IRREMOVABLE))
|
||||
{
|
||||
@@ -6326,7 +5934,6 @@ bool CHARACTER::EquipItem(LPITEM item, int iCandidateCell)
|
||||
SyncQuickslot(QUICKSLOT_TYPE_ITEM, bOldCell, iWearCell);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (true == item->IsEquipped())
|
||||
{
|
||||
@@ -6650,20 +6257,10 @@ void CHARACTER::AutoGiveItem(LPITEM item, bool longOwnerShip)
|
||||
}
|
||||
|
||||
int cell;
|
||||
if (item->IsDragonSoul())
|
||||
{
|
||||
cell = GetEmptyDragonSoulInventory(item);
|
||||
}
|
||||
else
|
||||
{
|
||||
cell = GetEmptyInventory (item->GetSize());
|
||||
}
|
||||
|
||||
if (cell != -1)
|
||||
{
|
||||
if (item->IsDragonSoul())
|
||||
item->AddToCharacter(this, TItemPos(DRAGON_SOUL_INVENTORY, cell));
|
||||
else
|
||||
item->AddToCharacter(this, TItemPos(INVENTORY, cell));
|
||||
|
||||
LogManager::instance().ItemLog(this, item, "SYSTEM", item->GetName());
|
||||
@@ -6770,11 +6367,6 @@ LPITEM CHARACTER::AutoGiveItem(DWORD dwItemVnum, BYTE bCount, int iRarePct, bool
|
||||
}
|
||||
|
||||
int iEmptyCell;
|
||||
if (item->IsDragonSoul())
|
||||
{
|
||||
iEmptyCell = GetEmptyDragonSoulInventory(item);
|
||||
}
|
||||
else
|
||||
iEmptyCell = GetEmptyInventory(item->GetSize());
|
||||
|
||||
if (iEmptyCell != -1)
|
||||
@@ -6782,9 +6374,6 @@ LPITEM CHARACTER::AutoGiveItem(DWORD dwItemVnum, BYTE bCount, int iRarePct, bool
|
||||
if (bMsg)
|
||||
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("아이템 획득: %s"), item->GetName());
|
||||
|
||||
if (item->IsDragonSoul())
|
||||
item->AddToCharacter(this, TItemPos(DRAGON_SOUL_INVENTORY, iEmptyCell));
|
||||
else
|
||||
item->AddToCharacter(this, TItemPos(INVENTORY, iEmptyCell));
|
||||
LogManager::instance().ItemLog(this, item, "SYSTEM", item->GetName());
|
||||
|
||||
@@ -7584,9 +7173,6 @@ bool CHARACTER::IsValidItemPosition(TItemPos Pos) const
|
||||
case EQUIPMENT:
|
||||
return cell < (INVENTORY_AND_EQUIP_SLOT_MAX);
|
||||
|
||||
case DRAGON_SOUL_INVENTORY:
|
||||
return cell < (DRAGON_SOUL_INVENTORY_MAX_NUM);
|
||||
|
||||
case SAFEBOX:
|
||||
if (NULL != m_pkSafebox)
|
||||
return m_pkSafebox->IsValidPosition(cell);
|
||||
@@ -7725,9 +7311,6 @@ bool CHARACTER::CanUnequipNow(const LPITEM item, const TItemPos& srcCell, const
|
||||
{
|
||||
int pos = -1;
|
||||
|
||||
if (item->IsDragonSoul())
|
||||
pos = GetEmptyDragonSoulInventory(item);
|
||||
else
|
||||
pos = GetEmptyInventory(item->GetSize());
|
||||
|
||||
VERIFY_MSG( -1 == pos, "소지품에 빈 공간이 없습니다." );
|
||||
|
||||
@@ -137,8 +137,6 @@ bool CHARACTER::SwapQuickslot(BYTE a, BYTE b)
|
||||
|
||||
void CHARACTER::ChainQuickslotItem(LPITEM pItem, BYTE bType, BYTE bOldPos)
|
||||
{
|
||||
if (pItem->IsDragonSoul())
|
||||
return;
|
||||
for ( int i=0; i < QUICKSLOT_MAX_NUM; ++i )
|
||||
{
|
||||
if ( m_quickslot[i].type == bType && m_quickslot[i].pos == bOldPos )
|
||||
|
||||
@@ -272,8 +272,6 @@ ACMD (do_attr_full_set);
|
||||
ACMD (do_all_skill_master);
|
||||
// 아이템 착용. icon이 없어 클라에서 확인 할 수 없는 아이템 착용을 위해 만듦.
|
||||
ACMD (do_use_item);
|
||||
ACMD (do_dragon_soul);
|
||||
ACMD (do_ds_list);
|
||||
ACMD (do_clear_affect);
|
||||
|
||||
struct command_info cmd_info[] =
|
||||
@@ -584,8 +582,6 @@ struct command_info cmd_info[] =
|
||||
{ "all_skill_master", do_all_skill_master, 0, POS_DEAD, GM_LOW_WIZARD},
|
||||
{ "use_item", do_use_item, 0, POS_DEAD, GM_LOW_WIZARD},
|
||||
|
||||
{ "dragon_soul", do_dragon_soul, 0, POS_DEAD, GM_PLAYER },
|
||||
{ "ds_list", do_ds_list, 0, POS_DEAD, GM_PLAYER },
|
||||
{ "do_clear_affect", do_clear_affect, 0, POS_DEAD, GM_LOW_WIZARD},
|
||||
|
||||
{ "\n", NULL, 0, POS_DEAD, GM_IMPLEMENTOR } /* 반드시 이 것이 마지막이어야 한다. */
|
||||
|
||||
@@ -35,7 +35,6 @@
|
||||
#include "pcbang.h"
|
||||
#include "threeway_war.h"
|
||||
#include "unique_item.h"
|
||||
#include "DragonSoul.h"
|
||||
|
||||
extern bool DropEvent_RefineBox_SetValue(const std::string& name, int value);
|
||||
|
||||
@@ -533,28 +532,6 @@ ACMD(do_item)
|
||||
|
||||
if (item)
|
||||
{
|
||||
if (item->IsDragonSoul())
|
||||
{
|
||||
int iEmptyPos = ch->GetEmptyDragonSoulInventory(item);
|
||||
|
||||
if (iEmptyPos != -1)
|
||||
{
|
||||
item->AddToCharacter(ch, TItemPos(DRAGON_SOUL_INVENTORY, iEmptyPos));
|
||||
LogManager::instance().ItemLog(ch, item, "GM", item->GetName());
|
||||
}
|
||||
else
|
||||
{
|
||||
M2_DESTROY_ITEM(item);
|
||||
if (!ch->DragonSoul_IsQualified())
|
||||
{
|
||||
ch->ChatPacket(CHAT_TYPE_INFO, "Àκ¥ÀÌ È°¼ºÈ µÇÁö ¾ÊÀ½.");
|
||||
}
|
||||
else
|
||||
ch->ChatPacket(CHAT_TYPE_INFO, "Not enough inventory space.");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int iEmptyPos = ch->GetEmptyInventory(item->GetSize());
|
||||
|
||||
if (iEmptyPos != -1)
|
||||
@@ -567,7 +544,6 @@ ACMD(do_item)
|
||||
M2_DESTROY_ITEM(item);
|
||||
ch->ChatPacket(CHAT_TYPE_INFO, "Not enough inventory space.");
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -931,13 +907,6 @@ ACMD(do_item_purge)
|
||||
ch->SyncQuickslot(QUICKSLOT_TYPE_ITEM, i, 255);
|
||||
}
|
||||
}
|
||||
for (i = 0; i < DRAGON_SOUL_INVENTORY_MAX_NUM; ++i)
|
||||
{
|
||||
if ((item = ch->GetItem(TItemPos(DRAGON_SOUL_INVENTORY, i ))))
|
||||
{
|
||||
ITEM_MANAGER::instance().RemoveItem(item, "PURGE");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ACMD(do_state)
|
||||
@@ -4373,39 +4342,3 @@ ACMD (do_clear_affect)
|
||||
ch->ClearAffect(true);
|
||||
}
|
||||
|
||||
ACMD (do_dragon_soul)
|
||||
{
|
||||
char arg1[512];
|
||||
const char* rest = one_argument (argument, arg1, sizeof(arg1));
|
||||
switch (arg1[0])
|
||||
{
|
||||
case 'a':
|
||||
{
|
||||
one_argument (rest, arg1, sizeof(arg1));
|
||||
int deck_idx;
|
||||
if (str_to_number(deck_idx, arg1) == false)
|
||||
{
|
||||
return;
|
||||
}
|
||||
ch->DragonSoul_ActivateDeck(deck_idx);
|
||||
}
|
||||
break;
|
||||
case 'd':
|
||||
{
|
||||
ch->DragonSoul_DeactivateAll();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ACMD (do_ds_list)
|
||||
{
|
||||
for (int i = 0; i < DRAGON_SOUL_INVENTORY_MAX_NUM; i++)
|
||||
{
|
||||
TItemPos cell(DRAGON_SOUL_INVENTORY, i);
|
||||
|
||||
LPITEM item = ch->GetItem(cell);
|
||||
if (item != NULL)
|
||||
ch->ChatPacket(CHAT_TYPE_INFO, "cell : %d, name : %s, id : %d", item->GetCell(), item->GetName(), item->GetID());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
#include "locale_service.h"
|
||||
#include "../../common/length.h"
|
||||
#include "exchange.h"
|
||||
#include "DragonSoul.h"
|
||||
|
||||
void exchange_packet(LPCHARACTER ch, BYTE sub_header, bool is_me, DWORD arg1, TItemPos arg2, DWORD arg3, void * pvData = NULL);
|
||||
|
||||
@@ -325,68 +324,11 @@ bool CExchange::CheckSpace()
|
||||
s_grid2.Put(i - INVENTORY_MAX_NUM / 2, 1, item->GetSize());
|
||||
}
|
||||
|
||||
// 아... 뭔가 개병신 같지만... 용혼석 인벤을 노멀 인벤 보고 따라 만든 내 잘못이다 ㅠㅠ
|
||||
static std::vector <WORD> s_vDSGrid(DRAGON_SOUL_INVENTORY_MAX_NUM);
|
||||
|
||||
// 일단 용혼석을 교환하지 않을 가능성이 크므로, 용혼석 인벤 복사는 용혼석이 있을 때 하도록 한다.
|
||||
bool bDSInitialized = false;
|
||||
|
||||
for (i = 0; i < EXCHANGE_ITEM_MAX_NUM; ++i)
|
||||
{
|
||||
if (!(item = m_apItems[i]))
|
||||
continue;
|
||||
|
||||
if (item->IsDragonSoul())
|
||||
{
|
||||
if (!victim->DragonSoul_IsQualified())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!bDSInitialized)
|
||||
{
|
||||
bDSInitialized = true;
|
||||
victim->CopyDragonSoulItemGrid(s_vDSGrid);
|
||||
}
|
||||
|
||||
bool bExistEmptySpace = false;
|
||||
WORD wBasePos = DSManager::instance().GetBasePosition(item);
|
||||
if (wBasePos >= DRAGON_SOUL_INVENTORY_MAX_NUM)
|
||||
return false;
|
||||
|
||||
for (int i = 0; i < DRAGON_SOUL_BOX_SIZE; i++)
|
||||
{
|
||||
WORD wPos = wBasePos + i;
|
||||
// if (0 == s_vDSGrid[wBasePos])
|
||||
if (0 == s_vDSGrid[wPos]) // Fix
|
||||
{
|
||||
bool bEmpty = true;
|
||||
for (int j = 1; j < item->GetSize(); j++)
|
||||
{
|
||||
if (s_vDSGrid[wPos + j * DRAGON_SOUL_BOX_COLUMN_NUM])
|
||||
{
|
||||
bEmpty = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (bEmpty)
|
||||
{
|
||||
for (int j = 0; j < item->GetSize(); j++)
|
||||
{
|
||||
s_vDSGrid[wPos + j * DRAGON_SOUL_BOX_COLUMN_NUM] = wPos + 1;
|
||||
}
|
||||
bExistEmptySpace = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (bExistEmptySpace)
|
||||
break;
|
||||
}
|
||||
if (!bExistEmptySpace)
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
int iPos = s_grid1.FindBlank(1, item->GetSize());
|
||||
|
||||
if (iPos >= 0)
|
||||
@@ -407,7 +349,6 @@ bool CExchange::CheckSpace()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -425,9 +366,6 @@ bool CExchange::Done()
|
||||
if (!(item = m_apItems[i]))
|
||||
continue;
|
||||
|
||||
if (item->IsDragonSoul())
|
||||
empty_pos = victim->GetEmptyDragonSoulInventory(item);
|
||||
else
|
||||
empty_pos = victim->GetEmptyInventory(item->GetSize());
|
||||
|
||||
if (empty_pos < 0)
|
||||
@@ -448,9 +386,6 @@ bool CExchange::Done()
|
||||
m_pOwner->SyncQuickslot(QUICKSLOT_TYPE_ITEM, item->GetCell(), 255);
|
||||
|
||||
item->RemoveFromCharacter();
|
||||
if (item->IsDragonSoul())
|
||||
item->AddToCharacter(victim, TItemPos(DRAGON_SOUL_INVENTORY, empty_pos));
|
||||
else
|
||||
item->AddToCharacter(victim, TItemPos(INVENTORY, empty_pos));
|
||||
ITEM_MANAGER::instance().FlushDelayedSave(item);
|
||||
|
||||
|
||||
@@ -46,7 +46,6 @@
|
||||
#include "map_location.h"
|
||||
// #include "HackShield.h"
|
||||
|
||||
#include "DragonSoul.h"
|
||||
|
||||
#ifdef __AUCTION__
|
||||
#include "auction_manager.h"
|
||||
@@ -928,7 +927,6 @@ void CInputDB::Boot(const char* data)
|
||||
char szSpecialItemGroupFileName[FILE_NAME_LEN];
|
||||
char szMapIndexFileName[FILE_NAME_LEN];
|
||||
char szItemVnumMaskTableFileName[FILE_NAME_LEN];
|
||||
char szDragonSoulTableFileName[FILE_NAME_LEN];
|
||||
|
||||
snprintf(szCommonDropItemFileName, sizeof(szCommonDropItemFileName),
|
||||
"%s/common_drop_item.txt", LocaleService_GetBasePath().c_str());
|
||||
@@ -944,8 +942,6 @@ void CInputDB::Boot(const char* data)
|
||||
"%s/index", LocaleService_GetMapPath().c_str());
|
||||
snprintf(szItemVnumMaskTableFileName, sizeof(szItemVnumMaskTableFileName),
|
||||
"%s/ori_to_new_table.txt", LocaleService_GetBasePath().c_str());
|
||||
snprintf(szDragonSoulTableFileName, sizeof(szDragonSoulTableFileName),
|
||||
"%s/dragon_soul_table.txt", LocaleService_GetBasePath().c_str());
|
||||
|
||||
sys_log(0, "Initializing Informations of Cube System");
|
||||
if (!Cube_InformationInitialize())
|
||||
@@ -1009,14 +1005,6 @@ void CInputDB::Boot(const char* data)
|
||||
return;
|
||||
}
|
||||
|
||||
sys_log(0, "LoadLocaleFile: DragonSoulTable: %s", szDragonSoulTableFileName);
|
||||
if (!DSManager::instance().ReadDragonSoulTableFile(szDragonSoulTableFileName))
|
||||
{
|
||||
sys_err("cannot load DragonSoulTable: %s", szDragonSoulTableFileName);
|
||||
//thecore_shutdown();
|
||||
//return;
|
||||
}
|
||||
|
||||
// END_OF_LOCALE_SERVICE
|
||||
|
||||
|
||||
@@ -1577,7 +1565,6 @@ void CInputDB::ItemLoad(LPDESC d, const char * c_pData)
|
||||
switch (p->window)
|
||||
{
|
||||
case INVENTORY:
|
||||
case DRAGON_SOUL_INVENTORY:
|
||||
item->AddToCharacter(ch, TItemPos(p->window, p->pos));
|
||||
break;
|
||||
|
||||
|
||||
@@ -40,7 +40,6 @@
|
||||
#include "locale_service.h"
|
||||
// #include "HackShield.h"
|
||||
// #include "XTrapManager.h"
|
||||
#include "DragonSoul.h"
|
||||
|
||||
extern void SendShout(const char * szText, BYTE bEmpire);
|
||||
extern int g_nPortalLimitTime;
|
||||
@@ -2105,7 +2104,6 @@ void CInputMain::SafeboxCheckin(LPCHARACTER ch, const char * c_pData)
|
||||
}
|
||||
|
||||
pkItem->RemoveFromCharacter();
|
||||
if (!pkItem->IsDragonSoul())
|
||||
ch->SyncQuickslot(QUICKSLOT_TYPE_ITEM, p->ItemPos.cell, 255);
|
||||
pkSafebox->Add(p->bSafePos, pkItem);
|
||||
|
||||
@@ -2139,40 +2137,6 @@ void CInputMain::SafeboxCheckout(LPCHARACTER ch, const char * c_pData, bool bMal
|
||||
if (!ch->IsEmptyItemGrid(p->ItemPos, pkItem->GetSize()))
|
||||
return;
|
||||
|
||||
// 아이템 몰에서 인벤으로 옮기는 부분에서 용혼석 특수 처리
|
||||
// (몰에서 만드는 아이템은 item_proto에 정의된대로 속성이 붙기 때문에,
|
||||
// 용혼석의 경우, 이 처리를 하지 않으면 속성이 하나도 붙지 않게 된다.)
|
||||
if (pkItem->IsDragonSoul())
|
||||
{
|
||||
if (bMall)
|
||||
{
|
||||
DSManager::instance().DragonSoulItemInitialize(pkItem);
|
||||
}
|
||||
|
||||
if (DRAGON_SOUL_INVENTORY != p->ItemPos.window_type)
|
||||
{
|
||||
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<창고> 옮길 수 없는 위치입니다."));
|
||||
return;
|
||||
}
|
||||
|
||||
TItemPos DestPos = p->ItemPos;
|
||||
if (!DSManager::instance().IsValidCellForThisItem(pkItem, DestPos))
|
||||
{
|
||||
int iCell = ch->GetEmptyDragonSoulInventory(pkItem);
|
||||
if (iCell < 0)
|
||||
{
|
||||
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<창고> 옮길 수 없는 위치입니다."));
|
||||
return ;
|
||||
}
|
||||
DestPos = TItemPos (DRAGON_SOUL_INVENTORY, iCell);
|
||||
}
|
||||
|
||||
pkSafebox->Remove(p->bSafePos);
|
||||
pkItem->AddToCharacter(ch, DestPos);
|
||||
ITEM_MANAGER::instance().FlushDelayedSave(pkItem);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (DRAGON_SOUL_INVENTORY == p->ItemPos.window_type)
|
||||
{
|
||||
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<창고> 옮길 수 없는 위치입니다."));
|
||||
@@ -2195,7 +2159,6 @@ void CInputMain::SafeboxCheckout(LPCHARACTER ch, const char * c_pData, bool bMal
|
||||
}
|
||||
pkItem->AddToCharacter(ch, p->ItemPos);
|
||||
ITEM_MANAGER::instance().FlushDelayedSave(pkItem);
|
||||
}
|
||||
|
||||
DWORD dwID = pkItem->GetID();
|
||||
db_clientdesc->DBPacketHeader(HEADER_GD_ITEM_FLUSH, 0, sizeof(DWORD));
|
||||
@@ -3349,33 +3312,6 @@ int CInputMain::Analyze(LPDESC d, BYTE bHeader, const char * c_pData)
|
||||
// }
|
||||
// break;
|
||||
|
||||
case HEADER_CG_DRAGON_SOUL_REFINE:
|
||||
{
|
||||
TPacketCGDragonSoulRefine* p = reinterpret_cast <TPacketCGDragonSoulRefine*>((void*)c_pData);
|
||||
switch(p->bSubType)
|
||||
{
|
||||
case DS_SUB_HEADER_CLOSE:
|
||||
ch->DragonSoul_RefineWindow_Close();
|
||||
break;
|
||||
case DS_SUB_HEADER_DO_REFINE_GRADE:
|
||||
{
|
||||
DSManager::instance().DoRefineGrade(ch, p->ItemGrid);
|
||||
}
|
||||
break;
|
||||
case DS_SUB_HEADER_DO_REFINE_STEP:
|
||||
{
|
||||
DSManager::instance().DoRefineStep(ch, p->ItemGrid);
|
||||
}
|
||||
break;
|
||||
case DS_SUB_HEADER_DO_REFINE_STRENGTH:
|
||||
{
|
||||
DSManager::instance().DoRefineStrength(ch, p->ItemGrid);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
return (iExtraLen);
|
||||
}
|
||||
|
||||
+2
-142
@@ -17,7 +17,6 @@
|
||||
#include "item.h"
|
||||
#include "item_manager.h"
|
||||
#include "affect.h"
|
||||
#include "DragonSoul.h"
|
||||
#include "buff_on_attributes.h"
|
||||
#include "belt_inventory_helper.h"
|
||||
#include "../../common/VnumHelper.h"
|
||||
@@ -251,8 +250,6 @@ bool CItem::SetCount(DWORD count)
|
||||
|
||||
RemoveFromCharacter();
|
||||
|
||||
if (!IsDragonSoul())
|
||||
{
|
||||
LPITEM pItem = pOwner->FindSpecifyItem(GetVnum());
|
||||
|
||||
if (NULL != pItem)
|
||||
@@ -263,16 +260,12 @@ bool CItem::SetCount(DWORD count)
|
||||
{
|
||||
pOwner->SyncQuickslot(QUICKSLOT_TYPE_ITEM, wCell, 255);
|
||||
}
|
||||
}
|
||||
|
||||
M2_DESTROY_ITEM(this);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!IsDragonSoul())
|
||||
{
|
||||
m_pOwner->SyncQuickslot(QUICKSLOT_TYPE_ITEM, m_wCell, 255);
|
||||
}
|
||||
M2_DESTROY_ITEM(RemoveFromCharacter());
|
||||
}
|
||||
|
||||
@@ -308,15 +301,6 @@ LPITEM CItem::RemoveFromCharacter()
|
||||
{
|
||||
if (GetWindow() != SAFEBOX && GetWindow() != MALL)
|
||||
{
|
||||
if (IsDragonSoul())
|
||||
{
|
||||
if (m_wCell >= DRAGON_SOUL_INVENTORY_MAX_NUM)
|
||||
sys_err("CItem::RemoveFromCharacter: pos >= DRAGON_SOUL_INVENTORY_MAX_NUM");
|
||||
else
|
||||
pOwner->SetItem(TItemPos(m_bWindow, m_wCell), NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
TItemPos cell(INVENTORY, m_wCell);
|
||||
|
||||
if (false == cell.IsDefaultInventoryPosition() && false == cell.IsBeltInventoryPosition()) // 아니면 소지품에?
|
||||
@@ -325,7 +309,6 @@ LPITEM CItem::RemoveFromCharacter()
|
||||
{
|
||||
pOwner->SetItem(cell, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
m_pOwner = NULL;
|
||||
@@ -352,14 +335,6 @@ bool CItem::AddToCharacter(LPCHARACTER ch, TItemPos Cell)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (DRAGON_SOUL_INVENTORY == window_type)
|
||||
{
|
||||
if (m_wCell >= DRAGON_SOUL_INVENTORY_MAX_NUM)
|
||||
{
|
||||
sys_err("CItem::AddToCharacter: cell overflow: %s to %s cell %d", m_pProto->szName, ch->GetName(), m_wCell);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (ch->GetDesc())
|
||||
m_dwLastOwnerPID = ch->GetPlayerID();
|
||||
@@ -483,34 +458,10 @@ 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으로 구분 -_-
|
||||
if ((0 == GetWearFlag() || ITEM_TOTEM == GetType()) && ITEM_COSTUME != GetType() && ITEM_DS != GetType() && ITEM_SPECIAL_DS != GetType() && ITEM_RING != GetType() && ITEM_BELT != GetType())
|
||||
if ((0 == GetWearFlag() || ITEM_TOTEM == GetType()) && ITEM_COSTUME != 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 하기 때문.
|
||||
if (GetType() == ITEM_DS || GetType() == ITEM_SPECIAL_DS)
|
||||
{
|
||||
if (iCandidateCell < 0)
|
||||
{
|
||||
return WEAR_MAX_NUM + GetSubType();
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < DRAGON_SOUL_DECK_MAX_NUM; i++)
|
||||
{
|
||||
if (WEAR_MAX_NUM + i * DS_SLOT_MAX + GetSubType() == iCandidateCell)
|
||||
{
|
||||
return iCandidateCell;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else if (GetType() == ITEM_COSTUME)
|
||||
if (GetType() == ITEM_COSTUME)
|
||||
{
|
||||
if (GetSubType() == COSTUME_BODY)
|
||||
return WEAR_COSTUME_BODY;
|
||||
@@ -813,8 +764,6 @@ bool CItem::IsEquipable() const
|
||||
case ITEM_ROD:
|
||||
case ITEM_PICK:
|
||||
case ITEM_UNIQUE:
|
||||
case ITEM_DS:
|
||||
case ITEM_SPECIAL_DS:
|
||||
case ITEM_RING:
|
||||
case ITEM_BELT:
|
||||
return true;
|
||||
@@ -832,23 +781,11 @@ bool CItem::EquipTo(LPCHARACTER ch, BYTE bWearCell)
|
||||
return false;
|
||||
}
|
||||
|
||||
// 용혼석 슬롯 index는 WEAR_MAX_NUM 보다 큼.
|
||||
if (IsDragonSoul())
|
||||
{
|
||||
if (bWearCell < WEAR_MAX_NUM || bWearCell >= WEAR_MAX_NUM + DRAGON_SOUL_DECK_MAX_NUM * DS_SLOT_MAX)
|
||||
{
|
||||
sys_err("EquipTo: invalid dragon soul cell (this: #%d %s wearflag: %d cell: %d)", GetOriginalVnum(), GetName(), GetSubType(), bWearCell - WEAR_MAX_NUM);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (bWearCell >= WEAR_MAX_NUM)
|
||||
{
|
||||
sys_err("EquipTo: invalid wear cell (this: #%d %s wearflag: %d cell: %d)", GetOriginalVnum(), GetName(), GetWearFlag(), bWearCell);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (ch->GetWear(bWearCell))
|
||||
{
|
||||
@@ -899,12 +836,6 @@ bool CItem::EquipTo(LPCHARACTER ch, BYTE bWearCell)
|
||||
m_pOwner->SetImmuneFlag(dwImmuneFlag);
|
||||
//P3NG3R immun fix end
|
||||
|
||||
if (IsDragonSoul())
|
||||
{
|
||||
DSManager::instance().ActivateDragonSoul(this);
|
||||
}
|
||||
else
|
||||
{
|
||||
ModifyPoints(true);
|
||||
StartUniqueExpireEvent();
|
||||
if (-1 != GetProto()->cLimitTimerBasedOnWearIndex)
|
||||
@@ -913,7 +844,6 @@ bool CItem::EquipTo(LPCHARACTER ch, BYTE bWearCell)
|
||||
// ACCESSORY_REFINE
|
||||
StartAccessorySocketExpireEvent();
|
||||
// END_OF_ACCESSORY_REFINE
|
||||
}
|
||||
|
||||
ch->BuffOnAttr_AddBuffsFromItem(this);
|
||||
|
||||
@@ -947,14 +877,7 @@ bool CItem::Unequip()
|
||||
if (IsRideItem())
|
||||
ClearMountAttributeAndAffect();
|
||||
|
||||
if (IsDragonSoul())
|
||||
{
|
||||
DSManager::instance().DeactivateDragonSoul(this);
|
||||
}
|
||||
else
|
||||
{
|
||||
ModifyPoints(false);
|
||||
}
|
||||
|
||||
StopUniqueExpireEvent();
|
||||
|
||||
@@ -1391,15 +1314,7 @@ EVENTFUNC(timer_based_on_wear_expire_event)
|
||||
pkItem->SetTimerBasedOnWearExpireEvent(NULL);
|
||||
pkItem->SetSocket(ITEM_SOCKET_REMAIN_SEC, 0);
|
||||
|
||||
// 일단 timer based on wear 용혼석은 시간 다 되었다고 없애지 않는다.
|
||||
if (pkItem->IsDragonSoul())
|
||||
{
|
||||
DSManager::instance().DeactivateDragonSoul(pkItem);
|
||||
}
|
||||
else
|
||||
{
|
||||
ITEM_MANAGER::instance().RemoveItem(pkItem, "TIMER_BASED_ON_WEAR_EXPIRE");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
pkItem->SetSocket(ITEM_SOCKET_REMAIN_SEC, remain_time);
|
||||
@@ -2062,61 +1977,6 @@ void CItem::CopyToRawData (TPlayerItem* new_item)
|
||||
}
|
||||
#endif
|
||||
|
||||
bool CItem::IsDragonSoul()
|
||||
{
|
||||
return GetType() == ITEM_DS;
|
||||
}
|
||||
|
||||
int CItem::GiveMoreTime_Per(float fPercent)
|
||||
{
|
||||
if (IsDragonSoul())
|
||||
{
|
||||
DWORD duration = DSManager::instance().GetDuration(this);
|
||||
int remain_sec = GetSocket(ITEM_SOCKET_REMAIN_SEC);
|
||||
int given_time = fPercent * duration / 100;
|
||||
if (remain_sec == duration)
|
||||
return false;
|
||||
if ((given_time + remain_sec) >= duration)
|
||||
{
|
||||
SetSocket(ITEM_SOCKET_REMAIN_SEC, duration);
|
||||
return duration - remain_sec;
|
||||
}
|
||||
else
|
||||
{
|
||||
SetSocket(ITEM_SOCKET_REMAIN_SEC, given_time + remain_sec);
|
||||
return given_time;
|
||||
}
|
||||
}
|
||||
// 우선 용혼석에 관해서만 하도록 한다.
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
int CItem::GiveMoreTime_Fix(DWORD dwTime)
|
||||
{
|
||||
if (IsDragonSoul())
|
||||
{
|
||||
DWORD duration = DSManager::instance().GetDuration(this);
|
||||
int remain_sec = GetSocket(ITEM_SOCKET_REMAIN_SEC);
|
||||
if (remain_sec == duration)
|
||||
return false;
|
||||
if ((dwTime + remain_sec) >= duration)
|
||||
{
|
||||
SetSocket(ITEM_SOCKET_REMAIN_SEC, duration);
|
||||
return duration - remain_sec;
|
||||
}
|
||||
else
|
||||
{
|
||||
SetSocket(ITEM_SOCKET_REMAIN_SEC, dwTime + remain_sec);
|
||||
return dwTime;
|
||||
}
|
||||
}
|
||||
// 우선 용혼석에 관해서만 하도록 한다.
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int CItem::GetDuration()
|
||||
{
|
||||
if(!GetProto())
|
||||
|
||||
@@ -254,11 +254,6 @@ class CItem : public CEntity
|
||||
DWORD GetMaskVnum() { return m_dwMaskVnum; }
|
||||
bool IsMaskedItem() { return m_dwMaskVnum != 0; }
|
||||
|
||||
// 용혼석
|
||||
bool IsDragonSoul();
|
||||
int GiveMoreTime_Per(float fPercent);
|
||||
int GiveMoreTime_Fix(DWORD dwTime);
|
||||
|
||||
private:
|
||||
TItemTable const * m_pProto; // 프로토 타잎
|
||||
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
#include "high_risk.h"
|
||||
|
||||
#include "../../common/VnumHelper.h"
|
||||
#include "DragonSoul.h"
|
||||
#include "cube.h"
|
||||
|
||||
ITEM_MANAGER::ITEM_MANAGER()
|
||||
@@ -409,11 +408,6 @@ LPITEM ITEM_MANAGER::CreateItem(DWORD vnum, DWORD count, DWORD id, bool bTryMagi
|
||||
}
|
||||
}
|
||||
|
||||
// 새로 생성되는 용혼석 처리.
|
||||
if (item->IsDragonSoul() && 0 == id)
|
||||
{
|
||||
DSManager::instance().DragonSoulItemInitialize(item);
|
||||
}
|
||||
return item;
|
||||
}
|
||||
|
||||
@@ -1579,13 +1573,6 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller,
|
||||
pkKiller->AutoGiveItem (xmas_sock, 1);
|
||||
}
|
||||
|
||||
//if (pkChr->GetLevel() >= 30 && (GetDropPerKillPct(50, 100, iDeltaPercent, "ds_drop") >= number(1, iRandRange)))
|
||||
//{
|
||||
// const static DWORD dragon_soul_gemstone = 30270;
|
||||
// if ((item = CreateItem(dragon_soul_gemstone, 1, 0, true)))
|
||||
// vec_item.push_back(item);
|
||||
//}
|
||||
|
||||
if ( GetDropPerKillPct(100, g_iUseLocale ? 2000 : 800, iDeltaPercent, "halloween_drop") >= number(1, iRandRange) )
|
||||
{
|
||||
const static DWORD halloween_item = 30321;
|
||||
|
||||
@@ -62,7 +62,6 @@
|
||||
#include "skill_power.h"
|
||||
#include "SpeedServer.h"
|
||||
// #include "XTrapManager.h"
|
||||
#include "DragonSoul.h"
|
||||
#include <boost/bind.hpp>
|
||||
#ifndef __WIN32__
|
||||
#include "limit_time.h"
|
||||
@@ -515,7 +514,6 @@ int main(int argc, char **argv)
|
||||
// CXTrapManager XTManager;
|
||||
|
||||
CSpeedServerManager SSManager;
|
||||
DSManager dsManager;
|
||||
|
||||
#ifdef __AUCTION__
|
||||
AuctionManager auctionManager;
|
||||
|
||||
@@ -107,7 +107,6 @@ enum
|
||||
HEADER_CG_HS_ACK = 203,
|
||||
HEADER_CG_XTRAP_ACK = 204,
|
||||
|
||||
HEADER_CG_DRAGON_SOUL_REFINE = 205,
|
||||
HEADER_CG_STATE_CHECKER = 206,
|
||||
|
||||
HEADER_CG_CLIENT_VERSION = 0xfd,
|
||||
@@ -293,7 +292,6 @@ enum
|
||||
|
||||
HEADER_GC_SPECIFIC_EFFECT = 208,
|
||||
|
||||
HEADER_GC_DRAGON_SOUL_REFINE = 209,
|
||||
HEADER_GC_RESPOND_CHANNELSTATUS = 210,
|
||||
|
||||
|
||||
@@ -2332,47 +2330,6 @@ typedef struct SPacketGCSpecificEffect
|
||||
char effect_file[MAX_EFFECT_FILE_NAME];
|
||||
} TPacketGCSpecificEffect;
|
||||
|
||||
// ¿ëÈ¥¼®
|
||||
enum EDragonSoulRefineWindowRefineType
|
||||
{
|
||||
DragonSoulRefineWindow_UPGRADE,
|
||||
DragonSoulRefineWindow_IMPROVEMENT,
|
||||
DragonSoulRefineWindow_REFINE,
|
||||
};
|
||||
|
||||
enum EPacketCGDragonSoulSubHeaderType
|
||||
{
|
||||
DS_SUB_HEADER_OPEN,
|
||||
DS_SUB_HEADER_CLOSE,
|
||||
DS_SUB_HEADER_DO_REFINE_GRADE,
|
||||
DS_SUB_HEADER_DO_REFINE_STEP,
|
||||
DS_SUB_HEADER_DO_REFINE_STRENGTH,
|
||||
DS_SUB_HEADER_REFINE_FAIL,
|
||||
DS_SUB_HEADER_REFINE_FAIL_MAX_REFINE,
|
||||
DS_SUB_HEADER_REFINE_FAIL_INVALID_MATERIAL,
|
||||
DS_SUB_HEADER_REFINE_FAIL_NOT_ENOUGH_MONEY,
|
||||
DS_SUB_HEADER_REFINE_FAIL_NOT_ENOUGH_MATERIAL,
|
||||
DS_SUB_HEADER_REFINE_FAIL_TOO_MUCH_MATERIAL,
|
||||
DS_SUB_HEADER_REFINE_SUCCEED,
|
||||
};
|
||||
typedef struct SPacketCGDragonSoulRefine
|
||||
{
|
||||
SPacketCGDragonSoulRefine() : header (HEADER_CG_DRAGON_SOUL_REFINE)
|
||||
{}
|
||||
BYTE header;
|
||||
BYTE bSubType;
|
||||
TItemPos ItemGrid[DRAGON_SOUL_REFINE_GRID_SIZE];
|
||||
} TPacketCGDragonSoulRefine;
|
||||
|
||||
typedef struct SPacketGCDragonSoulRefine
|
||||
{
|
||||
SPacketGCDragonSoulRefine() : header(HEADER_GC_DRAGON_SOUL_REFINE)
|
||||
{}
|
||||
BYTE header;
|
||||
BYTE bSubType;
|
||||
TItemPos Pos;
|
||||
} TPacketGCDragonSoulRefine;
|
||||
|
||||
typedef struct SPacketCGStateCheck
|
||||
{
|
||||
BYTE header;
|
||||
|
||||
@@ -226,7 +226,6 @@ CPacketInfoCG::CPacketInfoCG()
|
||||
|
||||
// Set(HEADER_CG_HS_ACK, sizeof(TPacketGCHSCheck), "HackShieldResponse", false);
|
||||
// Set(HEADER_CG_XTRAP_ACK, sizeof(TPacketXTrapCSVerify), "XTrapResponse", false);
|
||||
Set(HEADER_CG_DRAGON_SOUL_REFINE, sizeof(TPacketCGDragonSoulRefine), "DragonSoulRefine", false);
|
||||
Set(HEADER_CG_STATE_CHECKER, sizeof(BYTE), "ServerStateCheck", false);
|
||||
|
||||
}
|
||||
|
||||
@@ -489,7 +489,6 @@ namespace quest
|
||||
RegisterDanceEventFunctionTable();
|
||||
RegisterDragonLairFunctionTable();
|
||||
RegisterSpeedServerFunctionTable();
|
||||
RegisterDragonSoulFunctionTable();
|
||||
|
||||
{
|
||||
luaL_reg member_functions[] =
|
||||
|
||||
@@ -33,7 +33,6 @@ namespace quest
|
||||
extern void RegisterDanceEventFunctionTable();
|
||||
extern void RegisterDragonLairFunctionTable();
|
||||
extern void RegisterSpeedServerFunctionTable();
|
||||
extern void RegisterDragonSoulFunctionTable();
|
||||
|
||||
extern void combine_lua_string(lua_State* L, std::ostringstream &s);
|
||||
|
||||
|
||||
@@ -268,14 +268,7 @@ int CShop::Buy(LPCHARACTER ch, BYTE pos)
|
||||
}
|
||||
|
||||
int iEmptyPos;
|
||||
if (item->IsDragonSoul())
|
||||
{
|
||||
iEmptyPos = ch->GetEmptyDragonSoulInventory(item);
|
||||
}
|
||||
else
|
||||
{
|
||||
iEmptyPos = ch->GetEmptyInventory(item->GetSize());
|
||||
}
|
||||
|
||||
if (iEmptyPos < 0)
|
||||
{
|
||||
@@ -362,9 +355,6 @@ int CShop::Buy(LPCHARACTER ch, BYTE pos)
|
||||
}
|
||||
|
||||
item->RemoveFromCharacter();
|
||||
if (item->IsDragonSoul())
|
||||
item->AddToCharacter(ch, TItemPos(DRAGON_SOUL_INVENTORY, iEmptyPos));
|
||||
else
|
||||
item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
|
||||
ITEM_MANAGER::instance().FlushDelayedSave(item);
|
||||
|
||||
@@ -388,9 +378,6 @@ int CShop::Buy(LPCHARACTER ch, BYTE pos)
|
||||
}
|
||||
else
|
||||
{
|
||||
if (item->IsDragonSoul())
|
||||
item->AddToCharacter(ch, TItemPos(DRAGON_SOUL_INVENTORY, iEmptyPos));
|
||||
else
|
||||
item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
|
||||
ITEM_MANAGER::instance().FlushDelayedSave(item);
|
||||
LogManager::instance().ItemLog(ch, item, "BUY", item->GetName());
|
||||
|
||||
@@ -173,14 +173,7 @@ int CShopEx::Buy(LPCHARACTER ch, BYTE pos)
|
||||
return SHOP_SUBHEADER_GC_SOLD_OUT;
|
||||
|
||||
int iEmptyPos;
|
||||
if (item->IsDragonSoul())
|
||||
{
|
||||
iEmptyPos = ch->GetEmptyDragonSoulInventory(item);
|
||||
}
|
||||
else
|
||||
{
|
||||
iEmptyPos = ch->GetEmptyInventory(item->GetSize());
|
||||
}
|
||||
|
||||
if (iEmptyPos < 0)
|
||||
{
|
||||
@@ -200,9 +193,6 @@ int CShopEx::Buy(LPCHARACTER ch, BYTE pos)
|
||||
}
|
||||
|
||||
|
||||
if (item->IsDragonSoul())
|
||||
item->AddToCharacter(ch, TItemPos(DRAGON_SOUL_INVENTORY, iEmptyPos));
|
||||
else
|
||||
item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
|
||||
|
||||
ITEM_MANAGER::instance().FlushDelayedSave(item);
|
||||
|
||||
@@ -106,12 +106,6 @@ enum
|
||||
|
||||
REWARD_BOX_UNIQUE_ITEM_CAPE_OF_COURAGE = 76007,
|
||||
|
||||
// 용혼석 추출 확률을 높여주는 아이템
|
||||
DRAGON_SOUL_EXTRACTOR_GROUP = 10600,
|
||||
// 용심 추출해주는 아이템
|
||||
DRAGON_HEART_EXTRACTOR_GROUP = 10601,
|
||||
// 용혼석에서 추출할 때 주는 용심.
|
||||
DRAGON_HEART_VNUM = 100000,
|
||||
};
|
||||
|
||||
#endif /* __INC_METIN2_UNIQUE_ITEM_H */
|
||||
|
||||
Reference in New Issue
Block a user