⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chrtakenskill.cpp

📁 网络游戏龙族服务器端管理工具 rmtool 源代码
💻 CPP
字号:
// ChrTakenSkill.cpp : implementation file
//

#include "stdafx.h"
#include "rmtool.h"
#include "ChrTakenSkill.h"
#include "CharacterView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CChrTakenSkill dialog
int CALLBACK pfnCompare2(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);

CChrTakenSkill::CChrTakenSkill(CWnd* pParent /*=NULL*/)
	: CDialog(CChrTakenSkill::IDD, pParent)
{
	//{{AFX_DATA_INIT(CChrTakenSkill)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}


void CChrTakenSkill::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CChrTakenSkill)
	DDX_Control(pDX, IDC_LIST_TOTAL_SKILL, c_TotalSkill);
	DDX_Control(pDX, IDC_LIST_LEARN_SKILL, c_LearnSkill);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CChrTakenSkill, CDialog)
	//{{AFX_MSG_MAP(CChrTakenSkill)
	ON_BN_CLICKED(IDC_BUTTON_LEARN, OnButtonLearn)
	ON_BN_CLICKED(IDC_BUTTON_DELETE, OnButtonDelete)
	ON_BN_CLICKED(IDC_BUTTON_TOTAL_ALL, OnButtonTotalAll)
	ON_BN_CLICKED(IDC_BUTTON_TAKEN_ALL, OnButtonTakenAll)
	ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST_LEARN_SKILL, OnColumnclickListLearnSkill)
	ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST_TOTAL_SKILL, OnColumnclickListTotalSkill)
	ON_BN_CLICKED(IDC_SAVE, OnSave)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CChrTakenSkill message handlers

void CChrTakenSkill::OnButtonLearn() 
{
	//般摹绰 酒捞袍捞 乐唱 绝唱 眉农茄促. 
	if(ExistSameSkill())
	{
		MessageBox("Taken skill is already exist!");
		return;
	}

	int index,nItem;
	char temp[0xff];
	CString str;

	CCharacterView* pView; pView = (CCharacterView*)GetParent();
	
	POSITION pos = c_TotalSkill.GetFirstSelectedItemPosition();
	
	if (pos == NULL)
	   MessageBox("No items were selected!");
	else
	{
	   while (pos)
	   {
		  //急琶等 亲格甸阑 备茄促. 
		  nItem = c_TotalSkill.GetNextSelectedItem(pos);
	
		  index = atoi(c_TotalSkill.GetItemText(nItem,0));

		  //割锅掳俊 牢辑飘 矫懦瘤甫 舅扁 困秦 醚 肮荐甫 备秦辑 
		  int i = c_LearnSkill.GetItemCount();

		  //急琶茄 亲格阑 insert矫虐绊 
		  LVITEM item;
          item.mask = LVIF_TEXT | LVIF_PARAM;
		  item.pszText = _itoa(m_pApp->m_SkillList[ index ].num,  temp, 10);
		  item.iItem = i;
		  item.iSubItem = 0;
		  item.lParam = m_pApp->m_SkillList[ index ].num;
		  c_LearnSkill.InsertItem(&item);

		  str = m_pApp->m_SkillList[ index ].name;
		  str.TrimRight();
		  item.mask = LVIF_TEXT;
		  item.iSubItem = 1;
		  item.pszText = str.GetBuffer(str.GetLength());
		  c_LearnSkill.SetItem(&item);


		  //眠啊等 酒捞袍篮 颇鄂臂揪肺 窍捞扼捞飘 矫虐绊 
		  //c_LearnSkill.SetHotItem(i);
			
		  //盖 关栏肺 胶农费官 捞悼..
		  POINT    point;
		  CHeaderCtrl* pHeader = (CHeaderCtrl*)c_LearnSkill.GetDlgItem(0);
		  RECT rect;
		  pHeader->GetClientRect( &rect );
		  int header = rect.bottom;
		  c_LearnSkill.GetItemPosition(i, &point);
		  c_LearnSkill.Scroll(CSize(0, point.y - header));

		  //急琶等 惑怕肺 父电促. 
		  c_LearnSkill.SetFocus();		//器目胶 林绊 
		  c_LearnSkill.SetItemState(i, LVIS_SELECTED,LVIS_SELECTED);
			
		  
	   }
	}
}

void CChrTakenSkill::OnButtonDelete() 
{
	if( !RIGHT(MASK_20) )	return;
	if( MessageBox( "Do you want to Delete Skill", "Skill", MB_YESNO ) != IDYES) return;

	int nItem=0;
	int count=0;

	POSITION pos = c_LearnSkill.GetFirstSelectedItemPosition();
	
	if (pos == NULL)
	   MessageBox("No items were selected!");
	else
	{
	 	while (pos)
		{
			nItem = c_LearnSkill.GetNextSelectedItem(pos);
			count++;
		}
		// 贸澜 急琶等 巴俊辑何磐 急琶等 巴阑 瘤款促.
		nItem = nItem - count + 1;
		while(count)
		{
			c_LearnSkill.DeleteItem(nItem);
			count--;
		}
        // 急琶等 府胶飘 吝狼 窍唱甫 瘤快搁
        // 关俊 乐绰 府胶飘甸捞 犁沥纺登扁 锭巩俊.. 
        // 盖贸澜巴父 急琶等 俺荐父怒 瘤快搁 等促.
	}
}

void CChrTakenSkill::OnButtonTotalAll() 
{
	// TODO: Add your control notification handler code here
	c_TotalSkill.SetFocus();		//器目胶 林绊 
	for(int i=0; i<c_TotalSkill.GetItemCount() ; i++)
	{
	   c_TotalSkill.SetItemState(i, LVIS_SELECTED | LVIS_FOCUSED ,LVIS_SELECTED | LVIS_FOCUSED );
	}	
}

void CChrTakenSkill::OnButtonTakenAll() 
{
	// TODO: Add your control notification handler code here
	c_LearnSkill.SetFocus();		//器目胶 林绊 
	for(int i=0; i<c_LearnSkill.GetItemCount() ; i++)
	{
	   c_LearnSkill.SetItemState(i, LVIS_SELECTED | LVIS_FOCUSED ,LVIS_SELECTED | LVIS_FOCUSED );
	}
}

BOOL CChrTakenSkill::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	m_pApp = (CRMToolApp*)AfxGetApp();
	//傈眉 急琶 登绰 可记 
	c_LearnSkill.SetExtendedStyle(LVS_EX_FULLROWSELECT);
	c_TotalSkill.SetExtendedStyle(LVS_EX_FULLROWSELECT);

	//ListView 牧飘费 檬扁拳..  漠烦汲沥 	
	LV_COLUMN col;
	col.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM | LVCF_FMT;
	col.fmt = LVCFMT_LEFT;
	col.cx = 60;
	col.pszText = "Number";
	col.cchTextMax = 100;
	col.iSubItem = 0;

	c_LearnSkill.InsertColumn(0, &col);
	c_TotalSkill.InsertColumn(0, &col);

	col.cx = 250;
	col.iSubItem = 1;
	col.pszText = "Skill Name";
	
	c_LearnSkill.InsertColumn(1, &col);
	c_TotalSkill.InsertColumn(1, &col);


	//Total SKill List 盲快扁 
	char temp[0xff];
	CString str;
	int nItem = 0;
	for(int i=1; i<113; i++)
	{
		if(i < 87 || i > 100)
		{
			if(m_pApp->m_SkillList[ i ].num != 0)
			{
				LVITEM item;
				item.mask = LVIF_TEXT | LVIF_PARAM;
				item.pszText = _itoa(m_pApp->m_SkillList[ i ].num,  temp, 10);
				item.iItem = nItem;
				item.iSubItem = 0;
				item.lParam = m_pApp->m_SkillList[ i ].num;
				c_TotalSkill.InsertItem(&item);

				str = m_pApp->m_SkillList[ i ].name;
				str.TrimRight();
				item.mask = LVIF_TEXT;
				item.iSubItem = 1;
				item.pszText = str.GetBuffer(str.GetLength());
				c_TotalSkill.SetItem(&item);

				nItem++;
			}
		}

	}

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CChrTakenSkill::RefreshData()
{
	CCharacterView* pView = (CCharacterView*)GetParent();
	char temp[0xff];
	CString str;
	LVITEM item;

	c_LearnSkill.DeleteAllItems();
	int index = 0;
	for(int i=1; i<113 ; i++)
	{
		if(pView->m_ChrInfoEtc.skill[i] == 1)
		{
			if(i >= 87  && i < 101)
				continue;

			item.mask = LVIF_TEXT | LVIF_PARAM;
			item.pszText = _itoa(m_pApp->m_SkillList[ i ].num,  temp, 10);
			item.iItem = index;
			item.iSubItem = 0;
			item.lParam = m_pApp->m_SkillList[ i ].num;
			c_LearnSkill.InsertItem(&item);

			str = m_pApp->m_SkillList[ i ].name;
			str.TrimRight();
			item.mask = LVIF_TEXT;
			item.iSubItem = 1;
			item.pszText = str.GetBuffer(str.GetLength());
			c_LearnSkill.SetItem(&item);

			index++;
		}
	}
	 
}

BOOL CChrTakenSkill::ExistSameSkill()
{
	int nItem,index;

	POSITION pos = c_TotalSkill.GetFirstSelectedItemPosition();
	
	if (pos == NULL)
	   return FALSE;
	else
	{
	   while (pos)
	   {
			nItem = c_TotalSkill.GetNextSelectedItem(pos);
			index = atoi(c_TotalSkill.GetItemText(nItem,0));

			LVFINDINFO	lInfo;
			lInfo.flags = LVFI_PARAM;
			lInfo.lParam =  index;

			if(c_LearnSkill.FindItem(&lInfo) != -1)
				return TRUE;
			
	   }

	}
	return FALSE;
}
int  LearnSortItem[2] = {0,0};
int  TotalSortItem[2] = {0,0};
void CChrTakenSkill::OnColumnclickListLearnSkill(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
	// TODO: Add your control notification handler code here
	if(LearnSortItem[ pNMListView->iSubItem ] == ASC)
		LearnSortItem[ pNMListView->iSubItem ] = DESC;
	else
		LearnSortItem[ pNMListView->iSubItem ] = ASC;
	ListValue value;
	value.iSubItem = pNMListView->iSubItem;
	value.pListCtrl = &c_LearnSkill;
	value.iListCtrl = 1;		//0锅捞 配呕, 1锅捞 Learn栏肺 窍磊 

	ListView_SortItems(c_LearnSkill.m_hWnd, pfnCompare2, &value);
	*pResult = 0;
}

void CChrTakenSkill::OnColumnclickListTotalSkill(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
	// TODO: Add your control notification handler code here
	if(TotalSortItem[ pNMListView->iSubItem ] == ASC)
		TotalSortItem[ pNMListView->iSubItem ] = DESC;
	else
		TotalSortItem[ pNMListView->iSubItem ] = ASC;
	
	ListValue value;
	value.iSubItem = pNMListView->iSubItem;
	value.pListCtrl = &c_TotalSkill;
	value.iListCtrl = 0;		//0锅捞 配呕, 1锅捞 Learn栏肺 窍磊 

	ListView_SortItems(c_TotalSkill.m_hWnd, pfnCompare2, &value);
	*pResult = 0;
}


int CALLBACK pfnCompare2(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
	static LV_FINDINFO fi;
	static int nItem1,nItem2;
	static char szBuf1[101],szBuf2[101];
	int iList;
	
	ListValue* pValue = (ListValue*)lParamSort;

	HWND hList = pValue->pListCtrl->m_hWnd;
	int iSub = pValue->iSubItem; 

	switch(iSub)
	{

	case 2:
	case 1:		//胶懦疙, 汲疙 沥纺 
		{
			fi.flags = LVFI_PARAM;
			fi.lParam = lParam1;
			nItem1 = ListView_FindItem( hList, -1,&fi);

			fi.lParam = lParam2;
			nItem2 = ListView_FindItem( hList,-1,&fi);
			ListView_GetItemText( hList, nItem1, iSub, szBuf1,sizeof(szBuf1));
			ListView_GetItemText( hList, nItem2, iSub, szBuf2,sizeof(szBuf2));

			if( (int)(iList = pValue->iListCtrl) )
			{
				if(LearnSortItem[ iSub ] == ASC)
				{
					return( strcmp( szBuf1,szBuf2) );
				}
				else
				{
					return( strcmp( szBuf1,szBuf2) * -1);
				}
			}
			else
			{
				if(TotalSortItem[ iSub ] == ASC)
				{
					return( strcmp( szBuf1,szBuf2) );
				}
				else
				{
					return( strcmp( szBuf1,szBuf2) * -1);
				}
			}
		}
		break;
	
	case 0:	//胶懦 num 沥纺 
		{
			if( (int)(iList = pValue->iListCtrl) )
			{
				if(LearnSortItem[iSub] == ASC )
					return( lParam1 < lParam2 ? -1 : lParam1 > lParam2 ? 1 : 0);
				else 
					return( lParam1 > lParam2 ? -1 : lParam1 < lParam2 ? 1 : 0);
			}
			else
			{
				if(TotalSortItem[iSub] == ASC )
					return( lParam1 < lParam2 ? -1 : lParam1 > lParam2 ? 1 : 0);
				else 
					return( lParam1 > lParam2 ? -1 : lParam1 < lParam2 ? 1 : 0);
			}
		}
		break;
	}
	return 0;

}

void CChrTakenSkill::OnSave() 
{
	if( !RIGHT(MASK_20) )	return;
	if( MessageBox( "Do you want to SAVE Skill", "SAVE", MB_YESNO ) != IDYES) return;

	// TODO: Add your control notification handler code here
	CCharacterView* pView = (CCharacterView*)GetParent();

		
	if( strcmp(g_CurDbName[ pView->m_nCurDbIndex ], g_NationAccount.szDragon_DB_DefaultName[pView->m_nCurDbIndex]) )
	//if( strcmp(g_CurDbName[ pView->m_nCurDbIndex ], DEFAULT_GAME_DB) )
	{
		MessageBox("Don't Change In Backup DB Data!");
		return;
	}

	int index;
	memset(pView->m_ChrInfoEtc.skill+1,0,112);	//skill狼 醚 肮荐啊 112俺啊 酒聪扼..  87~100锅鳖瘤绰 救敬促.  勘扁 备炼促....ぱ_-;;

	for(int i=1; i<=c_LearnSkill.GetItemCount() ; i++)
	{
		index = atoi(c_LearnSkill.GetItemText(i-1,0));
		pView->m_ChrInfoEtc.skill[index] = 1;
	}


	//历厘窍扁 
	char szQuery[ 1024 ];
	WCHAR wszQuery[ 1024 ];
	
	sprintf(szQuery, "Update chr_info set skill=? where [name]='%s'",pView->m_szCurCharName);

	int nColumn = 1;
	DWORD	dwParamOffset = 0;	
	DBBINDING* pBinding = g_pDb->CreateParamInfo((BYTE)nColumn);	if(!pBinding) { MessageBox("Failed CreateParamInfo");	return;	}

	pBinding[0].obValue = dwParamOffset;	
	pBinding[0].cbMaxLen = sizeof(pView->m_ChrInfoEtc.skill);
	pBinding[0].wType = DBTYPE_BYTES;
	dwParamOffset += sizeof(pView->m_ChrInfoEtc.skill);

	g_pDb->KSCToUnicode(szQuery,wszQuery);
	int ret = g_pDb->ExecuteSQLByParam(wszQuery, pBinding, pView->m_ChrInfoEtc.skill, (BYTE)nColumn, (BYTE)CON);
	
	if(!ret)
	{
		MessageBox("Have no Character!");
		return; 
	}
	else if(ret < 0)
	{
		MessageBox("fail to update chr_info_binary!");
		return;
	}

	g_pDb->ReleaseParamInfo(pBinding, (BYTE)CON);

	
#ifdef RM_LOG_MODE
	CString str;	str.Format("CChrTakenSkill :: Saved taken skill info(%s)",pView->m_szCurCharName);
	m_pApp->LogChar(pView->m_nCurServerSet, str);
#endif


}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -