Files
Sun1602/SolarTrigger/TriggerManager.h
T
2022-10-26 12:25:11 +08:00

150 lines
4.7 KiB
C++

#ifndef _SOLARTRIGGER_TRIGGER_MANAGER_H
#define _SOLARTRIGGER_TRIGGER_MANAGER_H
#pragma once
//==================================================================================================
// TriggerManager class
/**
@author Cho Jae Sik < jscho@webzen.com >
@since 2007. 04. 04
@remark
- 트리거와 트리거인포를 관리하는 클래스.
@note
-
@history
- 2007. 04. 04 최초 생성.
- 2007. 10. xx waverix, rearrange
- 2009. 06. 13 waverix, rearrange
- 2011. 07. 20, waverix, code improvement
*/
//==================================================================================================
#include "BaseTrigger.h"
#include "TriggerAreaManager.h"
class CWzArchive;
namespace ns_trigger {
;
struct TriggerListNode
{
WzID first;
BaseTrigger* second;
};
}; //end of namespace
typedef STLX_VECTOR<ns_trigger::TriggerListNode> TRIGGER_LIST;
//==================================================================================================
// (TriggerManager)
//
class TriggerManager
{
public:
typedef std::pair<WzID, BaseTrigger*> sTRIGGER_LIST_NODE;
typedef STLX_LIST<ns_trigger::TriggerListNode> ACTIVE_TRIGGER_LIST;
TriggerManager();
virtual ~TriggerManager();
void Release();
bool Disconnected(TriggerPlayerLink* const link);
const TRIGGER_LIST& GetTriggerList() const;
const TriggerAreaManager* GetAreaManager() const;
//////////////////////////////////////////////////////////////////////////
// (TRIGGER SECTION)
bool InsertTrigger(BaseTrigger* trigger);
BaseTrigger* FindTrigger(const WzID trigger_id) const;
BaseTrigger* FindNextTrigger(WzID current_trigger_id);
int GetTriggerCount() const;
//////////////////////////////////////////////////////////////////////////
// (TRIGGER_AREA SECTION)
bool CreateArea(int area_id, TriggerAreaLocalStorage* area_item);
bool OnLeaveArea(TRIGGER_LEAVE_AREA* trigger_msg);
bool OnEnterArea(TRIGGER_ENTER_AREA* trigger_msg);
DWORD GetPlayerNumForAreaID(int area_id) const;
int GetTriggerAreaCount() const;
//////////////////////////////////////////////////////////////////////////
// <MESSAGE HANDLER>
// 클라이언트로 부터 오는 이벤트 메세지
// - TRIGGER_ENTER_AREA
// - TRIGGER_LEAVE_AREA
// - TRIGGER_CLICK_OBJECT
// 서버에서 오는 이벤트 메세지
// - TRIGGER_DAMAGE_OBJECT
// - TRIGGER_KILL_MONSTER
void OnMsg(TRIGGER_MSG* trigger_msg);
//////////////////////////////////////////////////////////////////////////
// <ACTIVE TRIGGER SECTION>
bool InsertActiveTrigger(WzID trigger_id);
// CHANGES: f110720.3L, prevent the corrupted list container state
void RequestRemoveActiveTrigger(WzID trigger_id) const;
// WARNING: f110721.2L, this method must be used in GameDominationField.
// side-effect: it call the Trigger::Release(triggers cleared)
void RemoveAllActiveTrigger();
BaseTrigger* FindActiveTrigger(WzID trigger_id) const;
bool ActiveNextTrigger(WzID current_trigger_id);
//////////////////////////////////////////////////////////////////////////
// <OTHER METHODs>
protected:
virtual BaseTrigger* AllocTrigger() = 0;
virtual void FreeTrigger(BaseTrigger* trigger) = 0;
private:
typedef util::SolarHashTable<BaseTrigger*, WzID> TriggerSearcher;
//////////////////////////////////////////////////////////////////////////
// <FIELDs>
protected:
TRIGGER_LIST m_listTrigger;
//ACTIVE_TRIGGER_LIST active_trigger_list_; //< 활성화된 트리거
TriggerAreaManager trigger_area_manager_;
util::__LList<ns_trigger::ActiveTriggerLink> active_trigger_list_;
private:
TriggerSearcher trigger_searcher_;
};
//==================================================================================================
inline const TRIGGER_LIST& TriggerManager::GetTriggerList() const {
return m_listTrigger;
}
inline const TriggerAreaManager* TriggerManager::GetAreaManager() const {
return &trigger_area_manager_;
}
inline int TriggerManager::GetTriggerCount() const {
return int(m_listTrigger.size());
}
inline int TriggerManager::GetTriggerAreaCount() const {
return trigger_area_manager_.GetTriggerAreaCount();
}
inline BaseTrigger* TriggerManager::FindTrigger(const WzID trigger_id) const
{
BaseTrigger* found = trigger_searcher_.GetData(trigger_id);
return found;
}
inline BaseTrigger* TriggerManager::FindActiveTrigger(WzID trigger_id) const
{
BaseTrigger* found = this->FindTrigger(trigger_id);
if ((found == NULL)) {
return NULL;
};
if (util::LList::IsEmpty(&found->active_link_)) {
return NULL;
};
assert(found->activated_ != false);
return found;
}
#endif //_SOLARTRIGGER_TRIGGER_MANAGER_H