Files
test/DlgTaskTrace_clean.cpp
T
2026-03-24 12:28:56 +07:00

1428 lines
45 KiB
C++

// Filename : DlgTaskTrace.cpp
// Creator : Feng Ning
// Date : 2011/11/15
#pragma warning(disable:4786)
#include "DlgTaskTrace.h"
#include "DlgTask.h"
#include "DlgAward.h"
#include "EC_Global.h"
#include "EC_Game.h"
#include "EC_GameRun.h"
#include "EC_GameSession.h"
#include "EC_GameUIMan.h"
#include "EC_World.h"
#include "EC_TaskInterface.h"
#include "TaskTemplMan.h"
#include "elementdataman.h"
#include "EC_IvtrItem.h"
#include "EC_HostPlayer.h"
#include "DlgWorldMap.h"
#include "EC_Instance.h"
#include "EC_UIConfigs.h"
#include "EC_UIHelper.h"
#include "AUIDef.h"
#include "EC_FixedMsg.h"
#define new A_DEBUG_NEW
AUI_BEGIN_COMMAND_MAP(CDlgTaskTrace, CDlgNameLink)
AUI_ON_COMMAND("Chk_Collapse", OnCommand_SwitchCollapse)
AUI_ON_COMMAND("Rdo_Quest*", OnCommand_SwitchShowType)
AUI_ON_COMMAND("Btn_UnTrace", OnCommand_UnTraceTask)
AUI_ON_COMMAND("Btn_Map", OnCommand_Map)
AUI_ON_COMMAND("Btn_ForChat", OnCommand_Chat)
AUI_ON_COMMAND("Btn_Finish", OnCommand_FinishTask)
AUI_END_COMMAND_MAP()
AUI_BEGIN_EVENT_MAP(CDlgTaskTrace, CDlgNameLink)
AUI_ON_EVENT("Edit_Title", WM_LBUTTONDBLCLK, OnEventDBClk_Title)
AUI_ON_EVENT("Txt_Title", WM_LBUTTONDBLCLK, OnEventDBClk_Title)
AUI_ON_EVENT("Txt_Link_Trace", WM_RBUTTONDOWN, OnEventRButton_Txt_Link_Trace)
AUI_ON_EVENT("Txt_Link_Trace", WM_RBUTTONUP, OnEventRButton_Txt_Link_Trace)
AUI_ON_EVENT("Txt_Link_Trace", WM_LBUTTONDOWN, OnEventLButton_Txt_Link_Trace)
AUI_ON_EVENT("Txt_Link_Trace", WM_LBUTTONUP, OnEventLButton_Txt_Link_Trace)
AUI_ON_EVENT("Txt_Link_Trace", WM_MOUSEWHEEL, OnMouseWheel)
AUI_END_EVENT_MAP()
static const ACString COLOR_YELLOW = _AL("^ffcb4a");
static const ACString COLOR_RED = _AL("^ff0000");
static const ACString COLOR_WHITE = _AL("^ffffff");
static const ACString INDENTATION = _AL(" ");
//////////////////////////////////////////////////////////////////////////
// TaskNameHoverCommand
//////////////////////////////////////////////////////////////////////////
// 用于确定鼠标悬浮到哪个任务上
class TaskNameHoverCommand : public CDlgNameLink::LinkCommand
{
public:
virtual bool operator()(P_AUITEXTAREA_NAME_LINK pLink){ return true; };
TaskNameHoverCommand(ACString& buffer, ACString& strName, int task_id, bool bError, bool bCanContributionFinish = false);
TaskNameHoverCommand(const TaskNameHoverCommand& rhs);
virtual ACString GetLinkText() const;
int GetTaskID(){ return m_iTaskID; }
bool CanConbutionFinish() { return m_bCanContributionFinish; };
protected:
virtual void AppendText();
virtual CDlgNameLink::LinkCommand* Clone() const;
ACString& m_Buffer;
ACString m_TaskName;
bool m_bError;
int m_iTaskID;
bool m_bCanContributionFinish;
};
TaskNameHoverCommand::TaskNameHoverCommand(ACString& buffer, ACString& strName, int task_id, bool bError, bool bCanContributionFinish):
m_Buffer(buffer),
m_TaskName(strName),
m_iTaskID(task_id),
m_bError(bError),
m_bCanContributionFinish(bCanContributionFinish)
{
}
TaskNameHoverCommand::TaskNameHoverCommand(const TaskNameHoverCommand& rhs):
m_Buffer(rhs.m_Buffer),
m_TaskName(rhs.m_TaskName),
m_iTaskID(rhs.m_iTaskID),
m_bError(rhs.m_bError),
m_bCanContributionFinish(rhs.m_bCanContributionFinish)
{
}
ACString TaskNameHoverCommand::GetLinkText() const
{
ACString szNameLink;
if (m_bError)
szNameLink.Format(_AL("&^%s%s&"), COLOR_RED, m_TaskName);
else
szNameLink.Format(_AL("&^%s%s&"), COLOR_YELLOW, m_TaskName);
return szNameLink;
}
void TaskNameHoverCommand::AppendText()
{
m_Buffer += this->GetLinkText();
}
CDlgNameLink::LinkCommand* TaskNameHoverCommand::Clone() const
{
return new TaskNameHoverCommand(*this);
}
//////////////////////////////////////////////////////////////////////////
// TraceLinkCommandCommand
//////////////////////////////////////////////////////////////////////////
typedef abase::vector<CECGame::OBJECT_COORD> ObjectTargets;
class TraceLinkCommand : public CDlgNameLink::MoveToLinkCommand
{
public:
TraceLinkCommand(ACString& buffer, int id, const ACString &name, int taskid = 0);
TraceLinkCommand(ACString& buffer, const ObjectTargets& targets, const ACString &name);
TraceLinkCommand(const TraceLinkCommand& rhs);
protected:
virtual void AppendText();
virtual CDlgNameLink::LinkCommand* Clone() const;
ACString& m_Buffer;
};
TraceLinkCommand::TraceLinkCommand(ACString& buffer, int id, const ACString &name, int taskid)
:CDlgNameLink::MoveToLinkCommand(id, name, taskid)
,m_Buffer(buffer)
{}
TraceLinkCommand::TraceLinkCommand(ACString& buffer, const ObjectTargets& targets, const ACString &name)
:CDlgNameLink::MoveToLinkCommand(targets, name)
,m_Buffer(buffer)
{
}
TraceLinkCommand::TraceLinkCommand(const TraceLinkCommand& rhs)
:CDlgNameLink::MoveToLinkCommand(rhs)
,m_Buffer(rhs.m_Buffer)
{}
CDlgNameLink::LinkCommand* TraceLinkCommand::Clone() const
{
return new TraceLinkCommand(*this);
}
void TraceLinkCommand::AppendText()
{
// do nothing here
m_Buffer += this->GetLinkText();
}
//////////////////////////////////////////////////////////////////////////
// CDlgTaskTrace
//////////////////////////////////////////////////////////////////////////
CDlgTaskTrace::CDlgTaskTrace()
{
m_pTxt_Desc = NULL;
m_nLastTracedTasks = -1;
m_nLastShowType = ST_NONE;
m_nTraceWorldID = -1;
m_pBtnUnTrace = NULL;
m_pBtnFinishTaskByContribution = NULL;
m_pBtnContributionTaskHelp = NULL;
m_pBtnMap = NULL;
m_pBtnChat = NULL;
m_iContributionCurrentPage = 0;
m_iContributionTotalPage = 1;
m_iIndexForContribution = 0;
m_bShowTrace = true;
}
CDlgTaskTrace::~CDlgTaskTrace()
{
}
bool CDlgTaskTrace::OnInitDialog()
{
if(!CDlgNameLink::OnInitDialog())
return false;
m_pTxt_Desc = dynamic_cast<PAUITEXTAREA>(GetDlgItem("Txt_Link_Trace"));
if(m_pTxt_Desc) m_pTxt_Desc->SetForceRenderScroll(false);
m_pChk_Collapse = dynamic_cast<PAUICHECKBOX>(GetDlgItem("Chk_Collapse"));
if (m_szName == "Win_QuestMinion") {
DDX_Control("Btn_UnTrace", m_pBtnUnTrace);
DDX_Control("Btn_Map", m_pBtnMap);
DDX_Control("Btn_ForChat", m_pBtnChat);
DDX_Control("Btn_Finish", m_pBtnFinishTaskByContribution);
DDX_Control("Btn_Help", m_pBtnContributionTaskHelp);
m_pBtnUnTrace->Show(false);
m_pBtnMap->Show(false);
m_pBtnChat->Show(false);
m_pBtnFinishTaskByContribution->Show(false);
m_pBtnContributionTaskHelp->Show(false);
}
// 任务追踪界面显示默认列表
PAUIOBJECT pObjRadio = GetDlgItem("Rdo_Quest1");
if (pObjRadio) SetShowType(ST_TRACED);
pObjRadio = GetDlgItem("Rdo_Quest2");
if (pObjRadio) pObjRadio->Show(CECUIConfig::Instance().GetGameUI().bEnableTitle);
return true;
}
void CDlgTaskTrace::OnShowDialog()
{
m_pChk_Collapse->Check(m_pTxt_Desc->IsShow());
PAUIOBJECT pObjRadio = GetDlgItem("Rdo_Quest3");
if (pObjRadio) {
int levelLimit = CECUIConfig::Instance().GetGameUI().nContributionTaskLevelLimit;
CECHostPlayer* pHost = GetHostPlayer();
if (pHost && pHost->GetMaxLevelSofar() >= levelLimit)
pObjRadio->SetFlash(true);
}
}
void CDlgTaskTrace::OnChangeLayoutEnd(bool bAllDone) {
// 如果处于被收起状态,则对话框的大小也要相应缩小
if (m_szName == "Win_QuestMinion" && !m_bShowTrace) {
SIZE cur = this->GetSize();
SIZE desc = m_pTxt_Desc->GetSize();
cur.cy -= desc.cy;
this->SetSize(cur.cx, cur.cy);
m_pChk_Collapse->Check(false);
}
}
void CDlgTaskTrace::AppendCommand(const ACHAR* pName, int idTarget, int idTask)
{
ACString strName = pName;
if(!strName.IsEmpty())
{
ACString strUniqueName = MakeNameUnique(strName);
if (!strUniqueName.IsEmpty()){
TraceLinkCommand cmd(m_Buffer, idTarget, strUniqueName, idTask);
BindLinkCommand(m_pTxt_Desc, &strUniqueName, &cmd);
}
}
}
void CDlgTaskTrace::ResetNameUnique(){
m_uniqueNameCountMap.clear();
}
ACString CDlgTaskTrace::MakeNameUnique(const ACString &strName){
ACString result;
if (!strName.IsEmpty()){
ACString strTrimmedName = strName;
strTrimmedName.TrimLeft();
strTrimmedName.TrimRight();
if (!strTrimmedName.IsEmpty()){
UniqueNameCountMap::iterator it = m_uniqueNameCountMap.find(strTrimmedName);
if (it == m_uniqueNameCountMap.end()){
m_uniqueNameCountMap[strTrimmedName] = 1;
}else{
++ it->second;
}
result = strTrimmedName;
if (int spaceCount = m_uniqueNameCountMap[strTrimmedName]-1){
ACString strMakeUniqueSuffix(_AL(' '), spaceCount);
result += strMakeUniqueSuffix;
}
}
}
return result;
}
void CDlgTaskTrace::AppendCommand(int worldid, const Task_Region* pRegions, int size)
{
ObjectTargets instCoord, tempCoord;
int cur = g_pGame->GetGameRun()->GetWorld()->GetInstanceID();
CECInstance *pInstance = g_pGame->GetGameRun()->GetInstance(cur);
ACString strCurMap = AS2AC(pInstance->GetPath());
// find the entrance of instance
pInstance = g_pGame->GetGameRun()->GetInstance(worldid);
ACString mapName = pInstance ? AS2AC(pInstance->GetPath()) : _AL("");
if(cur != worldid)
{
g_pGame->GetObjectCoord(mapName, tempCoord);
ObjectTargets::iterator iter = std::find(tempCoord.begin(), tempCoord.end(), strCurMap);
if (iter != tempCoord.end()) instCoord.push_back(*iter);
}
else if(size > 0 && pRegions)
{
for(int i=0;i<size;i++)
{
const Task_Region& reg = pRegions[i];
CECGame::OBJECT_COORD coor;
coor.strMap = mapName;
coor.vPos.x = (reg.zvMax.x - reg.zvMin.x) / 2 + reg.zvMin.x;
coor.vPos.y = (reg.zvMax.y - reg.zvMin.y) / 2 + reg.zvMin.y;
coor.vPos.z = (reg.zvMax.z - reg.zvMin.z) / 2 + reg.zvMin.z;
instCoord.push_back(coor);
}
}
// find the targets
if(instCoord.size() > 0)
{
ACString strName;
A3DVECTOR3 vPos = instCoord[0].vPos;
strName.Format(GetStringFromTable(9393), ((int)vPos.x+4000)/10, ((int)vPos.z+5500)/10);
TraceLinkCommand cmd(m_Buffer, instCoord, strName);
BindLinkCommand(m_pTxt_Desc, &strName, &cmd);
}
}
void CDlgTaskTrace::AppendText(const ACString & text)
{
m_Buffer += text;
}
void CDlgTaskTrace::PrepareRebuildTaskTrace(){
m_Buffer.Empty();
ClearCommands();
ResetNameUnique();
}
void CDlgTaskTrace::RefreshTaskTrace(const int* tasks, size_t size, bool withName)
{
bool bShow = size > 0;
// show/hide the trace dialog
if(this->IsShow() != bShow)
{
this->Show(bShow);
}
if (!IsShow() || !m_pTxt_Desc->IsShow()) return;
PrepareRebuildTaskTrace();
// get the formatted desc
for(int i=(int)size-1; i>=0; i--)
{
FormatTaskTraceDesc(tasks[i], withName, _AL(""));
}
int lastTop = m_pTxt_Desc->GetFirstLine();
m_pTxt_Desc->SetText(m_Buffer);
int curTop = m_pTxt_Desc->GetFirstLine();
if(lastTop != curTop)
{
int top = (lastTop < m_pTxt_Desc->GetLines()) ? lastTop
: max(0, m_pTxt_Desc->GetLines() - m_pTxt_Desc->GetLinesPP());
m_pTxt_Desc->SetFirstLine(top);
}
}
void CDlgTaskTrace::OnEventMouseMove(int x, int y, DWORD keys, const P_AUITEXTAREA_NAME_LINK pLink)
{
if (m_szName != "Win_QuestMinion")
return;
ShowType showType = GetShowType();
if(!pLink) GetGameUIMan()->ContinueDealMessage();
else if (showType == ST_TRACED || showType == ST_CONTRIBUTION) {
int pos_y = pLink->rc.top - m_pAUIManager->GetRect().top - GetPos().y;
TaskNameHoverCommand* pCmd = dynamic_cast<TaskNameHoverCommand*>(GetLinkCommand(m_pTxt_Desc, &pLink->strName));
if (pCmd == NULL) return;
if (showType == ST_TRACED) {
SetBtnUnTraceY(pos_y, pCmd->GetTaskID());
} else {
CECTaskInterface* pTask = GetHostPlayer()->GetTaskInterface();
ActiveTaskList* pActiveLst = (ActiveTaskList*)pTask->GetActiveTaskList();
int taskID = pCmd->GetTaskID();
ATaskTempl* pTempl = GetGame()->GetTaskTemplateMan()->GetTaskTemplByID(taskID);
if (pTempl == NULL) return;
ActiveTaskEntry* pEntry = pActiveLst->GetEntry(taskID);
if (pCmd->CanConbutionFinish() && pEntry && !pEntry->IsFinished() && pTempl->m_pFirstChild == NULL ) {
SetBtnUnTraceY(pos_y, pCmd->GetTaskID());
}
}
}
}
void CDlgTaskTrace::OnEventLButtonClick(int x, int y, DWORD keys, const P_AUITEXTAREA_NAME_LINK pLink)
{
if(!pLink) GetGameUIMan()->ContinueDealMessage();
}
bool CDlgTaskTrace::PtInRect(const AUITEXTAREA_NAME_LINK &name, int x, int y)
{
if (m_szName == "Win_QuestMinion"){
A3DRECT rcExpanded = name.rc;
int right = m_pAUIManager->GetRect().left + m_pTxt_Desc->GetRect().right;
if (right > rcExpanded.right){
rcExpanded.right = right; // 扩充到控件最右侧,方便弹出相应“关闭追踪”等控件
}
return rcExpanded.PtInRect(x, y);
}
return CDlgNameLink::PtInRect(name, x, y);
}
void CDlgTaskTrace::FormatTaskTraceDesc(int idTask, bool withName, const ACString& strIndentIn, bool requireActive, int index, bool bCanContributionFinish, int contribution)
{
int j;
ATaskTemplMan *pMan = g_pGame->GetTaskTemplateMan();
elementdataman *pDataMan = g_pGame->GetElementDataMan();
CECTaskInterface *pTask = GetHostPlayer()->GetTaskInterface();
CECGameUIMan *pUIMan = GetGameUIMan();
bool bActiveTask = pTask->HasTask(idTask);
if (requireActive && !bActiveTask) return;
ATaskTempl *pTemp = NULL;
if (pTemp = pMan->GetTaskTemplByID(idTask))
{
Task_State_info tsi;
pTask->GetTaskStateInfo(idTask, &tsi, bActiveTask);
float vMin[3] = {-6000.0f,-6000.0f,-6000.0f};
float vMax[3] = {6000.0f,6000.0f,6000.0f};
if(pTemp->m_ulReachSiteCnt > 0
&& is_in_zone(pTemp->m_pReachSite[0].zvMin,pTemp->m_pReachSite[0].zvMax,vMin) && is_in_zone(pTemp->m_pReachSite[0].zvMin,pTemp->m_pReachSite[0].zvMax,vMax))
return;
// append the name
if (withName)
{
AppendText(strIndentIn);
ACString strNum;
strNum.Format(_AL("%d"), index);
ACString strName = pTemp->GetName();
DeleteColorStr(strName);
strName = strNum + _AL(" ") + strName;
TaskNameHoverCommand cmd(m_Buffer, strName, idTask, tsi.m_ulErrCode != 0, bCanContributionFinish);
BindLinkCommand(m_pTxt_Desc, &strName, &cmd);
if (contribution != 0) {
int colorIndex = contribution > 0 ? 11288 : 11291;
strNum.Format(_AL(" %s【%+d】"), GetStringFromTable(colorIndex), contribution);
AppendText(strNum);
}
AppendText(_AL("\r"));
}
// init the indent
ACString strIndent = withName ? strIndentIn + INDENTATION :_AL("");
// 任务未接时显示接任务NPC
int nDNPC = pTemp->GetDeliverNPC();
if (!bActiveTask && nDNPC > 0)
{
DATA_TYPE dt = DT_INVALID;
NPC_ESSENCE *pNPC = (NPC_ESSENCE *)pDataMan->get_data_ptr(nDNPC, ID_SPACE_ESSENCE, dt);
if (dt == DT_NPC_ESSENCE)
{
AppendText(strIndent);
AppendText(pUIMan->GetStringFromTable(9764));
AppendCommand(pNPC->name, nDNPC, idTask);
AppendText(_AL("\r"));
}
}
// check whether can finish the task
int nANPC = pTemp->GetAwardNPC();
// 当任务奖励类型比较特殊时,不要在这里返回
bool bSpecialAwardType = pTemp->m_ulAwardType_S != enumTATNormal;
if(nANPC > 0 && pTask->CanFinishTask(idTask) && !bSpecialAwardType)
{
DATA_TYPE DataType = DT_INVALID;
NPC_ESSENCE *pNPC =
(NPC_ESSENCE *)pDataMan->get_data_ptr(nANPC, ID_SPACE_ESSENCE, DataType);
if( DataType == DT_NPC_ESSENCE )
{
this->AppendText(strIndent);
this->AppendText(pUIMan->GetStringFromTable(9391));
this->AppendCommand(pNPC->name, nANPC, idTask);
this->AppendText(_AL("\r"));
return;
}
}
// append global task character
for(int i = 0; i < (int)tsi.m_TaskCharArr.size(); i++)
{
ACString strPrefix = strIndent;
strPrefix += _AL("^00FF00");
strPrefix += tsi.m_TaskCharArr[i];
strPrefix += _AL("\r");
this->AppendText(strPrefix);
}
for( j = 0; j < MAX_ITEM_WANTED; j++ )
{
int itemid = tsi.m_ItemsWanted[j].m_ulItemId;
if( itemid <= 0 )
break;
int gained = tsi.m_ItemsWanted[j].m_ulItemsGained;
int toget = tsi.m_ItemsWanted[j].m_ulItemsToGet;
CECIvtrItem* pItem = CECIvtrItem::CreateItem(itemid, 0, 1);
if (pItem)
{
ACString strPrefix = strIndent;
if( gained < toget )
strPrefix += COLOR_WHITE;
else
strPrefix += _AL("^00e83a");
this->AppendText(strPrefix);
// track the monster id which contains this item
int monid = tsi.m_ItemsWanted[j].m_ulMonsterId;
ACString strName;
if (pTemp->m_enumMethod != enumTMKillPlayer)
{
if(monid > 0)
{
this->AppendText(pUIMan->GetStringFromTable(9388));
this->AppendCommand(pItem->GetName(), monid);
strName.Format(pUIMan->GetStringFromTable(9389), gained, toget);
}
else
{
const MINE_ESSENCE* pMine = CDlgTask::SearchTaskMine(idTask);
if(pMine)
{
this->AppendText(pUIMan->GetStringFromTable(9388));
this->AppendCommand(pItem->GetName(), pMine->id);
strName.Format(pUIMan->GetStringFromTable(9389), gained, toget);
}
else
{
strName.Format(pUIMan->GetStringFromTable(248), pItem->GetName(), gained, toget);
}
}
}
else
{
this->AppendText(pUIMan->GetStringFromTable(9388));
this->AppendText(pItem->GetName());
strName.Format(pUIMan->GetStringFromTable(9389), gained, toget);
strName += dynamic_cast<CDlgTask*>(m_pAUIManager->GetDialog("Win_Quest"))->GetKillPlayerRequirements(tsi,j);
}
this->AppendText(strName);
delete pItem;
}
}
for (j = 0; j < MAX_MONSTER_WANTED; j++)
{
int monid = tsi.m_MonsterWanted[j].m_ulMonsterId;
if (monid == 0)
break;
int killed = tsi.m_MonsterWanted[j].m_ulMonstersKilled;
int tokill = tsi.m_MonsterWanted[j].m_ulMonstersToKill;
if(killed > 0 || tokill > 0 )
{
DATA_TYPE DataType = DT_INVALID;
MONSTER_ESSENCE *pMonster = (tokill <= 0) ? NULL:
(MONSTER_ESSENCE *)pDataMan->get_data_ptr(monid, ID_SPACE_ESSENCE, DataType);
ACString strPrefix = strIndent;
if(killed < tokill )
strPrefix += COLOR_WHITE;
else
strPrefix += _AL("^00e83a");
this->AppendText(strPrefix);
ACString strName;
if( DataType == DT_MONSTER_ESSENCE )
{
// trace the monster
this->AppendText(pUIMan->GetStringFromTable(9386));
this->AppendCommand(pMonster->name, pMonster->id);
strName.Format(pUIMan->GetStringFromTable(9387), killed, tokill);
}
else
{
strName.Format(pUIMan->GetStringFromTable(256),killed);
}
this->AppendText(strName);
}
}
for(int i = 0; i < MAX_PLAYER_WANTED; i++ )
{
if (tsi.m_PlayerWanted[i].m_ulPlayersToKill == 0)
break;
if (tsi.m_ItemsWanted[i].m_ulItemId > 0)
{
continue;
}
int killed = tsi.m_PlayerWanted[j].m_ulPlayersKilled;
int tokill = tsi.m_PlayerWanted[j].m_ulPlayersToKill;
ACString strPrefix = strIndent;
if(killed < tokill )
strPrefix += COLOR_WHITE;
else
strPrefix += _AL("^00e83a");
AppendText(strPrefix);
AppendText(GetStringFromTable(7630));
this->AppendText(dynamic_cast<CDlgTask*>(m_pAUIManager->GetDialog("Win_Quest"))->GetKillPlayerRequirements(tsi,i));
}
if( tsi.m_ulTimeLimit > 0 )
{
int nSec = bActiveTask ? max(0, tsi.m_ulTimeLimit - tsi.m_ulTimePassed) : tsi.m_ulTimeLimit;
ACString strPrefix = strIndent;
strPrefix += CDlgTask::FormatTime(nSec, pUIMan->GetStringFromTable(bActiveTask ? 246 : 245), tsi.m_ulTimeLimit);
this->AppendText(strPrefix);
}
if( tsi.m_ulWaitTime > 0 )
{
int nSec = max(0, int(tsi.m_ulWaitTime) - int(tsi.m_ulTimePassed));
ACString strPrefix = strIndent + COLOR_WHITE;
strPrefix += CDlgTask::FormatTime(nSec, pUIMan->GetStringFromTable(199), 0);
this->AppendText(strPrefix);
}
if( tsi.m_ulNPCToProtect > 0 )
{
this->AppendText(strIndent);
DATA_TYPE DataType = DT_INVALID;
MONSTER_ESSENCE *pMonster = (MONSTER_ESSENCE *)pDataMan->get_data_ptr(
tsi.m_ulNPCToProtect, ID_SPACE_ESSENCE, DataType);
if( DataType == DT_MONSTER_ESSENCE )
{
// trace the protected npc
this->AppendText(pUIMan->GetStringFromTable(9390));
this->AppendCommand(pMonster->name, pMonster->id);
this->AppendText(_AL("\r"));
}
// update protected time
int nSec = max(0, tsi.m_ulProtectTime - tsi.m_ulTimePassed);
ACString strTime = CDlgTask::FormatTime(nSec, pUIMan->GetStringFromTable(259), tsi.m_ulProtectTime);
this->AppendText(strTime);
}
if(pTemp->m_ulReachSiteCnt > 0)
{
this->AppendText(strIndent);
this->AppendText(pUIMan->GetStringFromTable(9392));
this->AppendCommand(pTemp->m_ulReachSiteId, pTemp->m_pReachSite, pTemp->m_ulReachSiteCnt);
this->AppendText(_AL("\r"));
}
CECHostPlayer* pHost = GetHostPlayer();
ACString strTemp;
if (pTemp->m_ulReachLevel)
{
this->AppendText(strIndent);
strTemp.Format(pUIMan->GetStringFromTable(9396), pHost->GetBasicProps().iLevel, pTemp->m_ulReachLevel);
this->AppendText(strTemp);
this->AppendText(_AL("\r"));
}
if (pTemp->m_ulReachRealmLevel)
{
this->AppendText(strIndent);
strTemp.Format(pUIMan->GetStringFromTable(9397),
pUIMan->GetRealmName(pHost->GetRealmLevel()), pUIMan->GetRealmName(pTemp->m_ulReachRealmLevel));
this->AppendText(strTemp);
this->AppendText(_AL("\r"));
}
if (pTemp->m_ulReachReincarnationCount)
{
this->AppendText(strIndent);
strTemp.Format(pUIMan->GetStringFromTable(9398), pHost->GetReincarnationCount(), pTemp->m_ulReachReincarnationCount);
this->AppendText(strTemp);
this->AppendText(_AL("\r"));
}
}
}
bool CDlgTaskTrace::IsCollapsed()
{
return !m_pChk_Collapse->IsChecked();
}
void CDlgTaskTrace::SwitchCollapse()
{
// adjust the dialog size
SIZE cur = this->GetSize();
SIZE desc = m_pTxt_Desc->GetSize();
cur.cy += m_pTxt_Desc->IsShow() ? -desc.cy : desc.cy;
this->SetSize(cur.cx, cur.cy);
m_pTxt_Desc->Show(!m_pTxt_Desc->IsShow());
m_bShowTrace = !m_bShowTrace;
if (GetShowType() == ST_TRACED || GetShowType() == ST_TITLE) {
m_pBtnContributionTaskHelp->Show(false);
} else {
m_pBtnContributionTaskHelp->Show(!m_pBtnContributionTaskHelp->IsShow());
}
if (GetShowType() == ST_TRACED && m_pBtnUnTrace->GetData()) {
m_pBtnUnTrace->Show(!m_pBtnUnTrace->IsShow());
m_pBtnMap->Show(!m_pBtnMap->IsShow());
m_pBtnChat->Show(!m_pBtnChat->IsShow());
} else if (GetShowType() == ST_CONTRIBUTION && m_pBtnFinishTaskByContribution->GetData()) {
m_pBtnFinishTaskByContribution->Show(!m_pBtnFinishTaskByContribution->IsShow());
}
PAUILABEL pTxt_Title = dynamic_cast<PAUILABEL>(GetDlgItem("Txt_Title"));
if(pTxt_Title)
{
pTxt_Title->SetText(GetStringFromTable(m_pTxt_Desc->IsShow() ? 9394:9395));
}
m_pChk_Collapse->Check(m_pTxt_Desc->IsShow());
}
void CDlgTaskTrace::OnEventDBClk_Title(WPARAM wParam, LPARAM lParam, AUIObject *pObj)
{
SwitchCollapse();
}
void CDlgTaskTrace::OnCommand_SwitchCollapse(const char * szCommand)
{
SwitchCollapse();
}
void CDlgTaskTrace::OnCommand_SwitchShowType(const char * szCommand)
{
SetBtnUnTraceY(-1, 0);
if (IsCollapsed()){
SwitchCollapse();
}
if (GetShowType() == ST_CONTRIBUTION) {
int levelLimit = CECUIConfig::Instance().GetGameUI().nContributionTaskLevelLimit;
if (GetHostPlayer()->GetMaxLevelSofar() < levelLimit
&& szCommand && strlen(szCommand) != 0) {
SetShowType(ST_TRACED);
ACString strText;
strText.Format(GetStringFromTable(11293), levelLimit);
GetGameUIMan()->MessageBox("", strText, MB_OK, A3DCOLORRGBA(255, 255, 255, 160));
}
PAUIOBJECT pObjRadio = GetDlgItem("Rdo_Quest3");
if (pObjRadio) pObjRadio->SetFlash(false);
}
m_pBtnContributionTaskHelp->Show(GetShowType() == ST_CONTRIBUTION);
GetGameUIMan()->m_pDlgTask->RefreshTaskTrace();
}
void CDlgTaskTrace::OnEventRButton_Txt_Link_Trace(WPARAM wParam, LPARAM lParam, AUIObject *pObj)
{
GetGameUIMan()->ContinueDealMessage();
this->ChangeFocus(m_pBtnUnTrace);
}
void CDlgTaskTrace::OnEventLButton_Txt_Link_Trace(WPARAM wParam, LPARAM lParam, AUIObject *pObj)
{
CDlgNameLink::OnEventLButtonClick_NameLink(wParam, lParam, pObj);
if (m_pTxt_Desc->GetState() != AUITEXTAREA_STATE_PRESSBAR)
this->ChangeFocus(m_pBtnUnTrace);
else if (m_pBtnUnTrace->IsShow())
SetBtnUnTraceY(-1, 0);
}
CDlgTaskTrace::ShowType CDlgTaskTrace::GetShowType()
{
ShowType ret = ST_TRACED;
int nCheck = GetCheckedRadioButton(0);
switch (nCheck)
{
case 0: ret = ST_TRACED; break;
case 1: ret = ST_TITLE; break;
case 2: ret = ST_CONTRIBUTION; break;
default: ASSERT(false);
}
return ret;
}
void CDlgTaskTrace::SetShowType(ShowType rhs)
{
int nCheck(0);
switch (rhs)
{
case ST_TRACED: nCheck = 0; break;
case ST_TITLE: nCheck = 1; break;
case ST_CONTRIBUTION: nCheck = 2; break;
default: ASSERT(false);
}
CheckRadioButton(0, nCheck);
m_nLastShowType = rhs;
}
void CDlgTaskTrace::RefreshTaskTrace(const int* traced, int nTraced, const int* titletasks, int num, bool withName)
{
ShowType showType = GetShowType();
int size(0);
const int* tasks = NULL;
switch (showType)
{
case ST_TRACED: size = nTraced; tasks = traced; break;
case ST_TITLE: size = num; tasks = titletasks; break;
}
bool bShow = !GetGameUIMan()->IsCustomizeCharacter();
if(IsShow() != bShow) Show(bShow);
int idWorld = GetGameRun()->GetWorld()->GetInstanceID();
if (IsShow() && m_pTxt_Desc->IsShow())
{
if (m_nTraceWorldID != idWorld || // 地图有变,追踪信息需更新
showType == ST_TRACED || // 已接任务信息需实时更新
showType == ST_TITLE) // 已接称号任务信息需实时更新
{
PrepareRebuildTaskTrace();
for (int i = size-1; i >= 0; i--)
FormatTaskTraceDesc(tasks[i], withName, _AL(""), false, size - i);
KeepScrollBarPosition();
m_nTraceWorldID = idWorld;
}
}
m_nLastTracedTasks = nTraced;
}
void CDlgTaskTrace::DeleteColorStr(ACString& strName)
{
if (strName.Left(1) == _AL("^")) {
strName.CutLeft(7);
}
}
void CDlgTaskTrace::SetBtnUnTraceY(int pos_y, int task_id)
{
m_pBtnUnTrace->Show(pos_y != -1 && GetShowType() == ST_TRACED);
m_pBtnUnTrace->SetPos(m_pBtnUnTrace->GetPos(true).x, pos_y);
m_pBtnUnTrace->SetData(task_id);
m_pBtnMap->Show(pos_y != -1 && GetShowType() == ST_TRACED);
m_pBtnMap->SetPos(m_pBtnMap->GetPos(true).x, pos_y);
m_pBtnMap->SetData(task_id);
m_pBtnChat->Show(pos_y != -1 && GetShowType() == ST_TRACED);
m_pBtnChat->SetPos(m_pBtnChat->GetPos(true).x, pos_y);
m_pBtnChat->SetData(task_id);
m_pBtnFinishTaskByContribution->Show(pos_y != -1 && GetShowType() == ST_CONTRIBUTION);
m_pBtnFinishTaskByContribution->SetPos(m_pBtnFinishTaskByContribution->GetPos(true).x, pos_y);
m_pBtnFinishTaskByContribution->SetData(task_id);
if (m_pBtnFinishTaskByContribution->IsShow()) StartButtonGfx("Btn_Finish", "界面\\打钩");
}
void CDlgTaskTrace::OnCommand_UnTraceTask(const char * szCommand)
{
PAUIOBJECT pObj = GetDlgItem(szCommand);
if (pObj) {
int idTask = pObj->GetData();
CECGameUIMan* pGameUI = GetGameUIMan();
if (pGameUI) {
pGameUI->m_pDlgTask->SwitchTaskTrace(idTask);
}
}
}
void CDlgTaskTrace::OnCommand_Map(const char * szCommand)
{
PAUIOBJECT pObj = GetDlgItem(szCommand);
if (pObj) {
int idTask = pObj->GetData();
if (CECUIHelper::ShowOneTaskInMap(idTask))
GetGameUIMan()->GetMapDlgsMgr()->SwitchWorldMapShow();
}
}
void CDlgTaskTrace::OnCommand_Chat(const char * szCommand)
{
PAUIOBJECT pObj = GetDlgItem(szCommand);
if (pObj) {
int idTask = pObj->GetData();
ATaskTemplMan *pMan = g_pGame->GetTaskTemplateMan();
elementdataman *pDataMan = g_pGame->GetElementDataMan();
CECHostPlayer* pHost = GetHostPlayer();
CECTaskInterface *pTask = pHost->GetTaskInterface();
CECGameUIMan *pUIMan = GetGameUIMan();
bool bActiveTask = pTask->HasTask(idTask);
ACString strText;
ATaskTempl *pTemp = NULL;
while (pTemp = pMan->GetTaskTemplByID(idTask))
{
Task_State_info tsi;
pTask->GetTaskStateInfo(idTask, &tsi, bActiveTask);
float vMin[3] = {-6000.0f,-6000.0f,-6000.0f};
float vMax[3] = {6000.0f,6000.0f,6000.0f};
ACString strName = pTemp->GetName();
DeleteColorStr(strName);
strText += strName;
ACString strIndent = INDENTATION;
int nANPC = pTemp->GetAwardNPC();
if(nANPC > 0 && pTask->CanFinishTask(idTask)) {
DATA_TYPE DataType = DT_INVALID;
NPC_ESSENCE *pNPC =
(NPC_ESSENCE *)pDataMan->get_data_ptr(nANPC, ID_SPACE_ESSENCE, DataType);
if( DataType == DT_NPC_ESSENCE ) {
strText += strIndent;
strText += pUIMan->GetStringFromTable(9378);
strText += pNPC->name;
strText += _AL("\r");
break;
}
}
// append global task character
for(int i = 0; i < (int)tsi.m_TaskCharArr.size(); i++) {
ACString strPrefix = strIndent;
strPrefix += tsi.m_TaskCharArr[i];
strPrefix += _AL("\r");
strText += strPrefix;
}
int j = 0;
for( j = 0; j < MAX_ITEM_WANTED; j++ ) {
int itemid = tsi.m_ItemsWanted[j].m_ulItemId;
if( itemid <= 0 )
break;
int gained = tsi.m_ItemsWanted[j].m_ulItemsGained;
int toget = tsi.m_ItemsWanted[j].m_ulItemsToGet;
CECIvtrItem* pItem = CECIvtrItem::CreateItem(itemid, 0, 1);
if (pItem)
{
strText += strIndent;
ACString strName;
strName.Format(pUIMan->GetStringFromTable(248), pItem->GetName(), gained, toget);
if (pTemp->m_enumMethod == enumTMKillPlayer)
strName += dynamic_cast<CDlgTask*>(m_pAUIManager->GetDialog("Win_Quest"))->GetKillPlayerRequirements(tsi,j);
strText += strName;
delete pItem;
}
}
for (j = 0; j < MAX_MONSTER_WANTED; j++) {
int monid = tsi.m_MonsterWanted[j].m_ulMonsterId;
if (monid == 0)
break;
int killed = tsi.m_MonsterWanted[j].m_ulMonstersKilled;
int tokill = tsi.m_MonsterWanted[j].m_ulMonstersToKill;
if(killed > 0 || tokill > 0 ) {
DATA_TYPE DataType = DT_INVALID;
MONSTER_ESSENCE *pMonster = (tokill <= 0) ? NULL:
(MONSTER_ESSENCE *)pDataMan->get_data_ptr(monid, ID_SPACE_ESSENCE, DataType);
strText += strIndent;
ACString strName;
if( DataType == DT_MONSTER_ESSENCE ) {
strText += pUIMan->GetStringFromTable(9386);
strText += pMonster->name;
strName.Format(pUIMan->GetStringFromTable(9387), killed, tokill);
} else strName.Format(pUIMan->GetStringFromTable(256),killed);
strText += strName;
}
}
for( int i = 0; i < MAX_PLAYER_WANTED; i++ ) {
if (tsi.m_PlayerWanted[i].m_ulPlayersToKill == 0)
break;
if (tsi.m_ItemsWanted[i].m_ulItemId > 0)
continue;
int killed = tsi.m_PlayerWanted[j].m_ulPlayersKilled;
int tokill = tsi.m_PlayerWanted[j].m_ulPlayersToKill;
strText +=strIndent;
strText += GetStringFromTable(7630);
strText += dynamic_cast<CDlgTask*>(m_pAUIManager->GetDialog("Win_Quest"))->GetKillPlayerRequirements(tsi,i);
}
if( tsi.m_ulTimeLimit > 0 ) {
int nSec = bActiveTask ? max(0, tsi.m_ulTimeLimit - tsi.m_ulTimePassed) : tsi.m_ulTimeLimit;
ACString strPrefix = strIndent;
strPrefix += CDlgTask::FormatTime(nSec, pUIMan->GetStringFromTable(bActiveTask ? 246 : 245), tsi.m_ulTimeLimit);
strText += strPrefix;
}
if( tsi.m_ulWaitTime > 0 ) {
int nSec = max(0, int(tsi.m_ulWaitTime) - int(tsi.m_ulTimePassed));
ACString strPrefix = strIndent;
strPrefix += CDlgTask::FormatTime(nSec, pUIMan->GetStringFromTable(199), 0);
strText += strPrefix;
}
if( tsi.m_ulNPCToProtect > 0 ) {
strText += strIndent;
DATA_TYPE DataType = DT_INVALID;
MONSTER_ESSENCE *pMonster = (MONSTER_ESSENCE *)pDataMan->get_data_ptr(
tsi.m_ulNPCToProtect, ID_SPACE_ESSENCE, DataType);
if( DataType == DT_MONSTER_ESSENCE ) {
strText += pUIMan->GetStringFromTable(9390);
strText += pMonster->name;
strText += _AL("\r");
}
int nSec = max(0, tsi.m_ulProtectTime - tsi.m_ulTimePassed);
ACString strTime = CDlgTask::FormatTime(nSec, pUIMan->GetStringFromTable(259), tsi.m_ulProtectTime);
strText += strTime;
}
if(pTemp->m_ulReachSiteCnt > 0) {
strText += strIndent;
strText += pUIMan->GetStringFromTable(9379);
int cur_instance = g_pGame->GetGameRun()->GetWorld()->GetInstanceID();
A3DVECTOR3 pos;
if (cur_instance != (int)pTemp->m_ulReachSiteId) {
ObjectTargets tempCoord;
CECInstance *pInstance = g_pGame->GetGameRun()->GetInstance(cur_instance);
ACString strCurMap = AS2AC(pInstance->GetPath());
pInstance = g_pGame->GetGameRun()->GetInstance(pTemp->m_ulReachSiteId);
ACString mapName = pInstance ? AS2AC(pInstance->GetPath()) : _AL("");
g_pGame->GetObjectCoord(mapName, tempCoord);
ObjectTargets::iterator iter = std::find(tempCoord.begin(), tempCoord.end(), strCurMap);
if (iter != tempCoord.end()) pos = iter->vPos;
} else {
const Task_Region& region = pTemp->m_pReachSite[0];
pos.x = (region.zvMax.x - region.zvMin.x) / 2 + region.zvMin.x;
pos.y = (region.zvMax.y - region.zvMin.y) / 2 + region.zvMin.y;
pos.z = (region.zvMax.z - region.zvMin.z) / 2 + region.zvMin.z;
}
ACString strName;
strName.Format(GetStringFromTable(9393), ((int)pos.x+4000) / 10, ((int)pos.z + 5500) / 10);
strText += strName;
strText += _AL("\r");
}
ACString strTemp;
if (pTemp->m_ulReachLevel) {
strText += strIndent;
strTemp.Format(pUIMan->GetStringFromTable(9396), pHost->GetBasicProps().iLevel, pTemp->m_ulReachLevel);
strText += strTemp;
strText += _AL("\r");
}
if (pTemp->m_ulReachRealmLevel) {
strText += strIndent;
strTemp.Format(pUIMan->GetStringFromTable(9397), pUIMan->GetRealmName(pHost->GetRealmLevel()), pUIMan->GetRealmName(pTemp->m_ulReachRealmLevel));
strText += strTemp;
strText += _AL("\r");
}
if (pTemp->m_ulReachReincarnationCount) {
strText += strIndent;
strTemp.Format(pUIMan->GetStringFromTable(9398), pHost->GetReincarnationCount(), pTemp->m_ulReachReincarnationCount);
strText += strTemp;
strText += _AL("\r");
}
break;
}
strText.TrimRight('\r');
CECGameSession *pSession = GetGameSession();
int channel = pHost->GetTeam() ? GP_CHAT_TEAM : GP_CHAT_LOCAL;
pSession->SendChatData(channel, strText, -1, -1);
pUIMan->AddChatMessage(strText, channel);
}
}
void CDlgTaskTrace::OnTaskCompleted(int id)
{
if (id == (int)m_pBtnUnTrace->GetData())
SetBtnUnTraceY(-1, 0);
}
void CDlgTaskTrace::OnMouseWheel(WPARAM wParam, LPARAM lParam, AUIObject *pObj)
{
SetBtnUnTraceY(-1, 0);
}
void CDlgTaskTrace::UpdateContributionTask()
{
if (GetShowType() != ST_CONTRIBUTION) return;
CECHostPlayer* pHost = GetHostPlayer();
CECTaskInterface* pTask = pHost->GetTaskInterface();
StorageTaskList* pStorageList = (StorageTaskList*)pTask->GetStorageTaskList();
ActiveTaskList* pActiveLst = (ActiveTaskList*)pTask->GetActiveTaskList();
ATaskTemplMan* pTaskMan = GetGame()->GetTaskTemplateMan();
elementdataman* pElementDataMan = GetGame()->GetElementDataMan();
PrepareRebuildTaskTrace();
// 显示贡献度和已消费贡献度
ACString strText;
strText.Format(_AL("%s%s%s%d %s%s%s%d/%d"), GetStringFromTable(11289), GetStringFromTable(11280),
GetStringFromTable(11292), pHost->GetWorldContribution(), GetStringFromTable(11289), GetStringFromTable(11281),
GetStringFromTable(11292), pHost->GetWorldContributionSpend(),
pHost->HaveHealthStones() ? 9999 : TASK_WORLD_CONTRIBUTION_SPEND_PER_DAY);
AppendText(strText);
AppendText(_AL("\r"));
//
m_iIndexForContribution = 0;
if (pStorageList && pTaskMan && pElementDataMan && pActiveLst) {
int weightTaskStorageCount = 0;
for (int i = 1; i <= TASK_STORAGE_COUNT; ++i) {
const TASK_DICE_BY_WEIGHT_CONFIG* pEssence = pTaskMan->GetWeightTasksEssence(i);
if (pEssence != NULL) {
if (m_iContributionCurrentPage == weightTaskStorageCount) {
std::set<int> TaskSetIDs, TaskIDs;
// 奖励贡献度的任务
for (int j = 0; j < pStorageList->m_StoragesTaskSetCount[i - 1]; ++j) {
int id = pStorageList->m_Storages[i - 1][j];
if (id == 0) break;
AddTaskSetString(id, true, i);
TaskSetIDs.insert(id);
}
for (int j = pStorageList->m_StoragesTaskSetCount[i - 1]; j < TASK_STORAGE_LEN; ++j) {
int id = pStorageList->m_Storages[i - 1][j];
if (id == 0) break;
AddTaskString(id, true, INDENTATION, true);
TaskIDs.insert(id);
}
AppendText(GetStringFromTable(11290));
// 不奖励贡献度但已领取未完成的任务
ActiveTaskEntry* aEntries = pActiveLst->m_TaskEntries;
size_t count = sizeof(pEssence->uniform_weight_list) / sizeof(pEssence->uniform_weight_list[0]);
for (int j = 0; j < pActiveLst->m_uTaskCount; ++j) {
ActiveTaskEntry& CurEntry = aEntries[j];
if (CurEntry.IsFinished())
continue;
int id = CurEntry.m_ID;
for (size_t k = 0; k < count; ++k) {
int taskSetID = pEssence->uniform_weight_list[k].task_list_config_id;
if (taskSetID == 0) break;
if (TaskSetIDs.find(taskSetID) == TaskSetIDs.end() && TaskListHasID(taskSetID, id)) {
AddTaskSetString(taskSetID, false, i);
TaskSetIDs.insert(taskSetID);
}
}
if (TaskIDs.find(id) == TaskIDs.end() && TaskListHasID(pEssence->other_task_list_config_id, id)) {
AddTaskString(id, false, INDENTATION, true);
TaskIDs.insert(id);
}
}
// 其余不奖励贡献度的任务
for (int j = 0; j < (int)count; ++j) {
int id = pEssence->uniform_weight_list[j].task_list_config_id;
if (TaskSetIDs.find(id) == TaskSetIDs.end())
AddTaskSetString(id, false, i);
}
DATA_TYPE dt;
const TASK_LIST_CONFIG* pConfig = (TASK_LIST_CONFIG*)pElementDataMan->get_data_ptr(pEssence->other_task_list_config_id, ID_SPACE_CONFIG, dt);
if (dt == DT_TASK_LIST_CONFIG && pConfig) {
count = sizeof(pConfig->id_tasks) / sizeof(pConfig->id_tasks[0]);
for (int j = 0; j < (int)count; ++j) {
int id = pConfig->id_tasks[j];
if (id == 0) break;
if (TaskIDs.find(id) == TaskIDs.end())
AddTaskString(id, false, INDENTATION, true);
}
}
}
weightTaskStorageCount++;
}
}
m_iContributionTotalPage = weightTaskStorageCount;
}
KeepScrollBarPosition();
}
bool CDlgTaskTrace::TaskListHasID(int listID, int taskID)
{
elementdataman* pElementDataMan = GetGame()->GetElementDataMan();
DATA_TYPE dt;
const TASK_LIST_CONFIG* pConfig = (const TASK_LIST_CONFIG*)pElementDataMan->get_data_ptr(listID, ID_SPACE_CONFIG, dt);
if (pConfig && dt == DT_TASK_LIST_CONFIG) {
size_t count = sizeof(pConfig->id_tasks) / sizeof(pConfig->id_tasks[0]);
for (size_t i = 0; i < count; ++i) {
int id = pConfig->id_tasks[i];
if (id == 0) break;
if (id == taskID)
return true;
}
}
return false;
}
void CDlgTaskTrace::AddTaskSetString(unsigned int id, bool hasContributionAward, int idStorage)
{
elementdataman* pElementDataMan = GetGame()->GetElementDataMan();
CECTaskInterface* pTask = GetHostPlayer()->GetTaskInterface();
ActiveTaskList* pActiveLst = (ActiveTaskList*)pTask->GetActiveTaskList();
DATA_TYPE dt;
const TASK_LIST_CONFIG* pConfig = (const TASK_LIST_CONFIG*)pElementDataMan->get_data_ptr(id, ID_SPACE_CONFIG, dt);
const TASK_DICE_BY_WEIGHT_CONFIG* pStorage = GetGame()->GetTaskTemplateMan()->GetWeightTasksEssence(idStorage);
if (pConfig && dt == DT_TASK_LIST_CONFIG && pStorage) {
size_t count = sizeof(pStorage->uniform_weight_list) / sizeof(pStorage->uniform_weight_list[0]);
int weight = 0;
for (size_t i = 0; i < count; ++i) {
if(pStorage->uniform_weight_list[i].task_list_config_id == 0) {
ASSERT(0);
return;
}
if (pStorage->uniform_weight_list[i].task_list_config_id == id) {
weight = pStorage->uniform_weight_list[i].weight;
break;
}
}
ACString strColor;
if (hasContributionAward) {
strColor = GetStringFromTable(11286);
AppendText(strColor);
AppendText(GetStringFromTable(11284));
} else {
weight = -weight;
strColor = GetStringFromTable(11287);
AppendText(strColor);
AppendText(GetStringFromTable(11285));
}
ACString strName = pConfig->name;
AppendColorText(strName, strColor);
ActiveTaskEntry* aEntries = pActiveLst->m_TaskEntries;
for (int j = 0; j < pActiveLst->m_uTaskCount; ++j) {
ActiveTaskEntry& CurEntry = aEntries[j];
int taskID = CurEntry.m_ID;
if (TaskListHasID(id, taskID))
AddTaskString(taskID, hasContributionAward, INDENTATION);
}
}
}
void CDlgTaskTrace::AddTaskString(unsigned int id, bool hasContributionAward, const ACString& strIndentIn, bool topLevel)
{
CECTaskInterface* pTask = GetHostPlayer()->GetTaskInterface();
ATaskTemplMan* pTaskMan = GetGame()->GetTaskTemplateMan();
ActiveTaskList* pActiveLst = (ActiveTaskList*)pTask->GetActiveTaskList();
ATaskTempl* pTempl = pTaskMan->GetTaskTemplByID(id);
ActiveTaskEntry* pEntry = pActiveLst->GetEntry(id);
if (pTempl) {
int contribution = 0;
// 奖励贡献度的任务只在顶层任务显示奖励值
if (hasContributionAward) {
contribution = pTempl->m_pParent == NULL ? pTempl->m_Award_S->m_iWorldContribution : 0;
} else { // 否则只在最底层任务显示消耗值
contribution = pTempl->m_pFirstChild == NULL ? -pTempl->m_iWorldContribution : 0;
}
bool bCanContributionFinish = !hasContributionAward;
// ACString strTask = pTempl->GetName();
ACString strTask = CDlgTask::GetTaskNameWithColor(pTempl);
// 顶层显示一个任务名字
if (topLevel)
{
int indexMark = hasContributionAward ? 11284 : 11285;
int indexColor = bCanContributionFinish ? 11287 : 11286;
AppendText(GetStringFromTable(indexColor));
AppendText(GetStringFromTable(indexMark));
AppendColorText(strTask, GetStringFromTable(indexColor));
}
// 如果是奖励贡献度的任务但领取时间不是当天,则不显示
if (hasContributionAward && pEntry) {
unsigned long ulCurTime = pTask->GetCurTime();
unsigned long ulTaskTime = pEntry->m_ulTaskTime;
tm tmCur, tmTask;
ulCurTime -= unsigned long(TaskInterface::GetTimeZoneBias() * 60);
ulTaskTime -= unsigned long(TaskInterface::GetTimeZoneBias() * 60);
if ((long)(ulCurTime) < 0)
ulCurTime = 0;
if ((long)(ulTaskTime) < 0)
ulTaskTime = 0;
tmCur = *gmtime((time_t*)&ulCurTime);
tmTask = *gmtime((time_t*)&ulTaskTime);
if (!(tmCur.tm_year == tmTask.tm_year && tmCur.tm_yday == tmTask.tm_yday))
return;
}
if (pTask->HasTask(id)) {
FormatTaskTraceDesc(pTempl->m_ID, true, strIndentIn, false, ++m_iIndexForContribution, bCanContributionFinish, contribution);
}
ActiveTaskEntry* aEntries = pActiveLst->m_TaskEntries;
for (int j = 0; j < pActiveLst->m_uTaskCount; ++j) {
ActiveTaskEntry& CurEntry = aEntries[j];
int taskID = CurEntry.m_ID;
if (CurEntry.m_ParentIndex != 0xff) {
ActiveTaskEntry& ParentEntry = aEntries[CurEntry.m_ParentIndex];
if (ParentEntry.m_ID == id)
AddTaskString(taskID, hasContributionAward, strIndentIn + INDENTATION);
}
}
}
}
void CDlgTaskTrace::FinishTaskSpendingContribution(int taskID)
{
CECTaskInterface *pTask = GetHostPlayer()->GetTaskInterface();
ATaskTemplMan *pMan = GetGame()->GetTaskTemplateMan();
ATaskTempl *pTemp = pMan->GetTaskTemplByID(taskID);
ActiveTaskList* pActiveLst = (ActiveTaskList*)pTask->GetActiveTaskList();
ActiveTaskEntry* pEntry = pActiveLst->GetEntry(taskID);
if (pTemp && pEntry && !pEntry->IsFinished()) {
if (pTemp->m_Award_S->m_ulCandItems > 1) {
CDlgAward* pAward = dynamic_cast<CDlgAward*>(m_pAUIManager->GetDialog("Win_Award"));
if (pAward) {
pAward->UpdateAwardItem(taskID, false, true);
pAward->Show(true);
}
}
else GetHostPlayer()->GetTaskInterface()->FinishTaskSpendingWorldContribution(taskID);
UpdateContributionTask();
}
}
extern CECStringTab _task_err;
void CDlgTaskTrace::OnCommand_FinishTask(const char * szCommand)
{
PAUIOBJECT pObj = GetDlgItem(szCommand);
if (pObj) {
int idTask = pObj->GetData();
if (idTask) {
const ATaskTempl* pTempl = GetGame()->GetTaskTemplateMan()->GetTaskTemplByID(idTask);
if (pTempl) {
CECHostPlayer* pHost = GetHostPlayer();
CECGameUIMan* pGameUI = GetGameUIMan();
CECTaskInterface* pTask = pHost->GetTaskInterface();
Task_State_info tsi;
pTask->GetTaskStateInfo(idTask, &tsi);
if (tsi.m_ulErrCode)
{
const wchar_t* szMsg = _task_err.GetWideString(tsi.m_ulErrCode);
if (szMsg)
{
ACString strText = szMsg;
ACString strTemp;
if (tsi.m_ulErrCode == TASK_AWARD_FAIL_LEVEL_CHECK)
strTemp.Format(GetStringFromTable(7637), tsi.m_ulPremLevelMin);
else strTemp = GetStringFromTable(807);
strText += strTemp;
strText += _AL("\r");
strText += COLOR_WHITE;
pGameUI->MessageBox("", strText, MB_OK, A3DCOLORRGBA(255, 255, 255, 160));
return;
}
}
if (pHost->GetWorldContribution() < pTempl->m_iWorldContribution)
pGameUI->MessageBox("", pGameUI->GetStringFromTable(11282), MB_OK, A3DCOLORRGBA(255, 255, 255, 160));
else if (!pHost->HaveHealthStones() &&
pHost->GetWorldContributionSpend() + pTempl->m_iWorldContribution > TASK_WORLD_CONTRIBUTION_SPEND_PER_DAY)
pGameUI->MessageBox("", pGameUI->GetStringFromTable(11283), MB_OK, A3DCOLORRGBA(255, 255, 255, 160));
else
FinishTaskSpendingContribution(idTask);
}
}
}
}
void CDlgTaskTrace::AppendColorText(ACString& strTask, const ACString& strColor)
{
ACString strText;
DeleteColorStr(strTask);
strText.Format(_AL("%s%s"), strColor, strTask);
AppendText(strText);
AppendText(_AL("\r"));
}
void CDlgTaskTrace::KeepScrollBarPosition()
{
// 列表类型未改变时,保持滚动条位置
ShowType showType = GetShowType();
if (m_nLastShowType == showType)
{
int lastTop = m_pTxt_Desc->GetFirstLine();
m_pTxt_Desc->SetText(m_Buffer);
int curTop = m_pTxt_Desc->GetFirstLine();
if(lastTop != curTop)
{
int top = (lastTop < m_pTxt_Desc->GetLines()) ? lastTop
: max(0, m_pTxt_Desc->GetLines() - m_pTxt_Desc->GetLinesPP());
m_pTxt_Desc->SetFirstLine(top);
}
}
else m_pTxt_Desc->SetText(m_Buffer);
if (showType != m_nLastShowType)
SetShowType(showType);
}
void CDlgTaskTrace::OnTaskNew(unsigned long idTask)
{
ATaskTemplMan* pMan = GetGame()->GetTaskTemplateMan();
ATaskTempl* pTempl = pMan->GetTaskTemplByID(idTask);
if (pTempl &&
GetShowType() != ST_CONTRIBUTION &&
pTempl->GetTopTask()->CanDeliverWorldContribution(GetHostPlayer()->GetTaskInterface()) &&
GetHostPlayer()->GetMaxLevelSofar() >= CECUIConfig::Instance().GetGameUI().nContributionTaskLevelLimit) {
SetShowType(ST_CONTRIBUTION);
OnCommand_SwitchShowType(NULL);
if (!IsShow()) {
CDlgTask* pDlg = dynamic_cast<CDlgTask*>(m_pAUIManager->GetDialog("Win_Quest"));
if (pDlg)
pDlg->OnCommand_showtrace(NULL);
}
}
}