ExchangeRoom.cpp
Upload User: hnnxmgz
Upload Date: 2009-02-28
Package Size: 45474k
Code Size: 11k
Category:

Other systems

Development Platform:

Visual C++

  1. #include "stdafx.h"
  2. #include "ExchangeRoom.h"
  3. #include "ExchangeManager.h"
  4. #include "mapdbmsgparser.h"
  5. #include "Player.h"
  6. #include "ItemManager.h"
  7. CExchangeRoom::CExchangeRoom()
  8. {
  9. }
  10. CExchangeRoom::~CExchangeRoom()
  11. {
  12. }
  13. void CExchangeRoom::Init( CPlayer* pPlayer1, CPlayer* pPlayer2 )
  14. {
  15. sEXCHANGECONTAINER ExchangeContainer;
  16. m_ExchangeData[0].pPlayer = pPlayer1;
  17. m_ExchangeData[0].bExchange = FALSE;
  18. m_ExchangeData[0].bLock = FALSE;
  19. m_ExchangeData[0].dwMoney = 0;
  20. m_ExchangeData[0].nAddItemNum = 0;
  21. ZeroMemory( m_ExchangeData[0].ItemInfo, sizeof(ITEMBASE)*MAX_EXCHANGEITEM );
  22. m_ExchangeData[1].pPlayer = pPlayer2;
  23. m_ExchangeData[1].bExchange = FALSE;
  24. m_ExchangeData[1].bLock = FALSE;
  25. m_ExchangeData[1].dwMoney = 0;
  26. m_ExchangeData[1].nAddItemNum = 0;
  27. ZeroMemory( m_ExchangeData[1].ItemInfo, sizeof(ITEMBASE)*MAX_EXCHANGEITEM );
  28. ExchangeContainer.pRoom = this;
  29. ExchangeContainer.nMyIndex = 0;
  30. ExchangeContainer.pOpPlayer = pPlayer2;
  31. pPlayer1->SetExchangeContainer( &ExchangeContainer );
  32. ExchangeContainer.nMyIndex = 1;
  33. ExchangeContainer.pOpPlayer = pPlayer1;
  34. pPlayer2->SetExchangeContainer( &ExchangeContainer );
  35. m_nExchangeState = EXCS_WAITING;
  36. }
  37. void CExchangeRoom::Exit()
  38. {
  39. //item lock 钱扁
  40. CItemSlot* pItemSlot = NULL;
  41. POSTYPE ItemPos;
  42. for( int j = 0 ; j < 2 ; ++j )
  43. for( int i = 0 ; i < m_ExchangeData[j].nAddItemNum ; ++i )
  44. {
  45. ItemPos = m_ExchangeData[j].ItemInfo[i].Position;
  46. pItemSlot = m_ExchangeData[j].pPlayer->GetSlot( ItemPos );
  47. if( pItemSlot )
  48. pItemSlot->SetLock( ItemPos, FALSE );
  49. }
  50. //player data 檬扁拳
  51. sEXCHANGECONTAINER ExchangeContainer; //檬扁拳窃
  52. if( m_ExchangeData[0].pPlayer )
  53. m_ExchangeData[0].pPlayer->SetExchangeContainer( &ExchangeContainer );
  54. if( m_ExchangeData[1].pPlayer )
  55. m_ExchangeData[1].pPlayer->SetExchangeContainer( &ExchangeContainer );
  56. //
  57. }
  58. void CExchangeRoom::Lock( int nIndex, BOOL bLock )
  59. {
  60. if( bLock )
  61. m_ExchangeData[nIndex].bLock = TRUE;
  62. else
  63. {
  64. m_ExchangeData[0].bLock = FALSE;
  65. m_ExchangeData[1].bLock = FALSE;
  66. m_ExchangeData[0].bExchange = FALSE;
  67. m_ExchangeData[1].bExchange = FALSE;
  68. }
  69. }
  70. BOOL CExchangeRoom::IsAllLock()
  71. {
  72. if( m_ExchangeData[0].bLock && m_ExchangeData[1].bLock )
  73. return TRUE;
  74. return FALSE;
  75. }
  76. void CExchangeRoom::SetExchange( int nIndex )
  77. {
  78. m_ExchangeData[nIndex].bExchange = TRUE;
  79. }
  80. BOOL CExchangeRoom::IsAllExchange()
  81. {
  82. if( m_ExchangeData[0].bExchange && m_ExchangeData[1].bExchange )
  83. return TRUE;
  84. return FALSE;
  85. }
  86. BOOL CExchangeRoom::AddItem( int nPlayerIndex, ITEMBASE* pItemInfo )
  87. {
  88. if( IsLocked( nPlayerIndex ) ) return FALSE;
  89. if( m_ExchangeData[nPlayerIndex].nAddItemNum >= MAX_EXCHANGEITEM )
  90. return FALSE;
  91. if( pItemInfo->QuickPosition != 0 ) return FALSE;
  92. //辑滚俊档 酒捞袍 LOCK
  93. CInventorySlot* pItemSlot = (CInventorySlot*)m_ExchangeData[nPlayerIndex].pPlayer->GetSlot( eItemTable_Inventory );
  94. if( pItemSlot )
  95. {
  96. if( GetItemKind( pItemInfo->wIconIdx ) == eYOUNGYAK_ITEM )
  97. {
  98. if( pItemSlot->CheckQPosForItemIdx( pItemInfo->wIconIdx ) == FALSE )
  99. return FALSE;
  100. }
  101. else
  102. {
  103. if( pItemSlot->GetItemInfoAbs( pItemInfo->Position )->QuickPosition != 0 )
  104. return FALSE;
  105. }
  106. if( pItemSlot->IsLock( pItemInfo->Position ) ) return FALSE;
  107. pItemSlot->SetLock( pItemInfo->Position, TRUE );
  108. }
  109. //
  110. m_ExchangeData[nPlayerIndex].ItemInfo[m_ExchangeData[nPlayerIndex].nAddItemNum] = *pItemInfo;
  111. ++m_ExchangeData[nPlayerIndex].nAddItemNum;
  112. return TRUE;
  113. }
  114. BOOL CExchangeRoom::DelItem( int nPlayerIndex, POSTYPE pos )
  115. {
  116. ASSERT( pos >=0 && pos < m_ExchangeData[nPlayerIndex].nAddItemNum );
  117. if( IsLocked( nPlayerIndex ) ) return FALSE;
  118. if( m_ExchangeData[nPlayerIndex].nAddItemNum <= 0 )
  119. return FALSE;
  120. //辑滚俊档 酒捞袍 UNLOCK
  121. POSTYPE ItemAbsPos = m_ExchangeData[nPlayerIndex].ItemInfo[pos].Position;
  122. CItemSlot* pItemSlot = m_ExchangeData[nPlayerIndex].pPlayer->GetSlot( ItemAbsPos );
  123. if( pItemSlot )
  124. pItemSlot->SetLock( ItemAbsPos, FALSE );
  125. //
  126. --m_ExchangeData[nPlayerIndex].nAddItemNum;
  127. for( int i = pos ; i < m_ExchangeData[nPlayerIndex].nAddItemNum ; ++i )
  128. {
  129. m_ExchangeData[nPlayerIndex].ItemInfo[i] = m_ExchangeData[nPlayerIndex].ItemInfo[i+1];
  130. }
  131. return TRUE;
  132. }
  133. DWORD CExchangeRoom::InputMoney( int nPlayerIndex, DWORD dwMoney )
  134. {
  135. if( dwMoney > m_ExchangeData[nPlayerIndex].pPlayer->GetMoney() )
  136. dwMoney = m_ExchangeData[nPlayerIndex].pPlayer->GetMoney();
  137. m_ExchangeData[nPlayerIndex].dwMoney = dwMoney;
  138. return dwMoney;
  139. }
  140. int CExchangeRoom::DoExchange()
  141. {
  142. CInventorySlot* pInventory[2];
  143. pInventory[0] = (CInventorySlot*)m_ExchangeData[0].pPlayer->GetSlot( eItemTable_Inventory );
  144. pInventory[1] = (CInventorySlot*)m_ExchangeData[1].pPlayer->GetSlot( eItemTable_Inventory );
  145. if( pInventory[0] == NULL || pInventory[1] == NULL )
  146. return eEE_ERROR;
  147. //后磊府眉农 //瘤况龙 磊府档 绊妨茄促?(ok)
  148. WORD EmptySellPos[2][MAX_EXCHANGEITEM];
  149. WORD sOut;
  150. if( m_ExchangeData[1].nAddItemNum > m_ExchangeData[0].nAddItemNum )
  151. {
  152. sOut = pInventory[0]->GetEmptyCell( EmptySellPos[0], m_ExchangeData[1].nAddItemNum - m_ExchangeData[0].nAddItemNum );
  153. if( sOut != m_ExchangeData[1].nAddItemNum - m_ExchangeData[0].nAddItemNum )
  154. return eEE_NOTENOUGHSPACE;
  155. }
  156. if( m_ExchangeData[0].nAddItemNum > m_ExchangeData[1].nAddItemNum )
  157. {
  158. sOut = pInventory[1]->GetEmptyCell( EmptySellPos[1], m_ExchangeData[0].nAddItemNum - m_ExchangeData[1].nAddItemNum );
  159. if( sOut != m_ExchangeData[0].nAddItemNum - m_ExchangeData[1].nAddItemNum )
  160. return eEE_NOTENOUGHSPACE;
  161. }
  162. //捣眉农
  163. if( m_ExchangeData[0].dwMoney > m_ExchangeData[0].pPlayer->GetMoney() )
  164. return eEE_NOTENOUGHMONEY;
  165. if( m_ExchangeData[1].dwMoney > m_ExchangeData[1].pPlayer->GetMoney() )
  166. return eEE_NOTENOUGHMONEY;
  167. if( m_ExchangeData[1].dwMoney + m_ExchangeData[0].pPlayer->GetMoney() > MAX_INVENTORY_MONEY )
  168. return eEE_MAXMONEY;
  169. if( m_ExchangeData[0].dwMoney + m_ExchangeData[1].pPlayer->GetMoney() > MAX_INVENTORY_MONEY )
  170. return eEE_MAXMONEY;
  171. ///////////////////////////////////////////////
  172. //酒捞袍 八荤 内靛 持磊.. 力磊府俊 促 甸绢乐唱? 抛胶飘 鞘夸.
  173. int i, j;
  174. for( j = 0 ; j < 2 ; ++ j )
  175. {
  176. for( i = 0 ; i < m_ExchangeData[j].nAddItemNum ; ++i )
  177. {
  178. const ITEMBASE* pItemBase = pInventory[j]->GetItemInfoAbs( m_ExchangeData[j].ItemInfo[i].Position );
  179. if( pItemBase->dwDBIdx != m_ExchangeData[j].ItemInfo[i].dwDBIdx ||
  180. pItemBase->wIconIdx != m_ExchangeData[j].ItemInfo[i].wIconIdx ||
  181. pItemBase->Durability != m_ExchangeData[j].ItemInfo[i].Durability ||
  182. pItemBase->Position != m_ExchangeData[j].ItemInfo[i].Position )
  183. return eEE_ERROR; //角力 牢亥配府客 背券芒狼 沥焊啊 促福促.
  184. if( ITEMMGR->IsDupItem(pItemBase->wIconIdx) )
  185. if( pItemBase->Durability > 5/*MAX_DURABILITY*/ )
  186. return eEE_ERROR;
  187. }
  188. }
  189. //夯惑怕肺 汗备啊 啊瓷茄啊?
  190. /////////////
  191. //EXCHANGE!!!
  192. for( j = 0 ; j < 2 ; ++ j )
  193. {
  194. for( i = 0 ; i < m_ExchangeData[j].nAddItemNum ; ++i )
  195. {
  196. ITEMBASE ItemBase;
  197. pInventory[j]->DeleteItemAbs( NULL, m_ExchangeData[j].ItemInfo[i].Position, &ItemBase, SS_LOCKOMIT ); //吝夸! 眉农.
  198. //昏力 皋技瘤.. //葛酒辑 茄波锅俊 力芭窍磊.
  199. MSG_EXCHANGE_REMOVEITEM RemoveMsg;
  200. RemoveMsg.Category = MP_EXCHANGE;
  201. RemoveMsg.Protocol = MP_EXCHANGE_REMOVE;
  202. RemoveMsg.wAbsPosition = m_ExchangeData[j].ItemInfo[i].Position;
  203. m_ExchangeData[j].pPlayer->SendMsg( &RemoveMsg, sizeof( RemoveMsg ) );
  204. }
  205. }
  206. /*
  207. sOut = pInventory[0]->GetEmptyCell( EmptySellPos[0], m_ExchangeData[1].nAddItemNum );
  208. if( sOut != m_ExchangeData[1].nAddItemNum )
  209. return FALSE;
  210. sOut = pInventory[1]->GetEmptyCell( EmptySellPos[1], m_ExchangeData[0].nAddItemNum );
  211. if( sOut != m_ExchangeData[0].nAddItemNum  )
  212. return FALSE;
  213. */
  214. for( j = 0 ; j < 2 ; ++ j )
  215. {
  216. for( i = 0 ; i < m_ExchangeData[j].nAddItemNum ; ++i )
  217. {
  218. POSTYPE EmptyPos;
  219. if( pInventory[!j]->GetEmptyCell( &EmptyPos ) == 0 ) //后傍埃 绝阑锭 俊矾眉农窍扁
  220. {
  221. ASSERT(0);
  222. continue;
  223. }
  224. ItemUpdateToDB( m_ExchangeData[!j].pPlayer->GetID(), m_ExchangeData[j].ItemInfo[i].dwDBIdx,
  225. m_ExchangeData[j].ItemInfo[i].wIconIdx, m_ExchangeData[j].ItemInfo[i].Durability,
  226. EmptyPos, 0 );
  227. m_ExchangeData[j].ItemInfo[i].Position = EmptyPos;
  228. //itemoption
  229. if( ITEMMGR->IsOptionItem( m_ExchangeData[j].ItemInfo[i].wIconIdx, m_ExchangeData[j].ItemInfo[i].Durability) )
  230. {
  231. m_ExchangeData[!j].pPlayer->AddItemOption(
  232. m_ExchangeData[j].pPlayer->GetItemOption( m_ExchangeData[j].ItemInfo[i].Durability ) );
  233. m_ExchangeData[j].pPlayer->RemoveItemOption( m_ExchangeData[j].ItemInfo[i].Durability );
  234. // ItemOptionUpdateToDB( m_ExchangeData[j].ItemInfo[i].Durability, m_ExchangeData[!j].pPlayer->GetID() );
  235. }
  236. /////
  237. int rt = pInventory[!j]->InsertItemAbs( NULL, EmptyPos, &m_ExchangeData[j].ItemInfo[i], SS_LOCKOMIT ); //Itembase俊辑 position父 官诧促.
  238. ASSERT( rt == EI_TRUE );
  239. //眠啊 皋技瘤... //葛酒辑 茄锅俊 焊郴绰 吧肺 背眉窍磊. confirm
  240. MSG_ITEM InsertMsg;
  241. InsertMsg.Category = MP_EXCHANGE;
  242. InsertMsg.Protocol = MP_EXCHANGE_INSERT;
  243. InsertMsg.ItemInfo = m_ExchangeData[j].ItemInfo[i];
  244. m_ExchangeData[!j].pPlayer->SendMsg( &InsertMsg, sizeof( MSG_ITEM ) );
  245. LogItemMoney(m_ExchangeData[j].pPlayer->GetID(), m_ExchangeData[j].pPlayer->GetObjectName(), 
  246. m_ExchangeData[1-j].pPlayer->GetID(), m_ExchangeData[1-j].pPlayer->GetObjectName(),
  247. eLog_Exchange, m_ExchangeData[j].pPlayer->GetMoney(), m_ExchangeData[1-j].pPlayer->GetMoney(), 
  248. 0, m_ExchangeData[j].ItemInfo[i].wIconIdx, m_ExchangeData[j].ItemInfo[i].dwDBIdx, m_ExchangeData[j].ItemInfo[i].Position, 0, m_ExchangeData[j].ItemInfo[i].Durability,
  249. m_ExchangeData[j].pPlayer->GetPlayerExpPoint());
  250. }
  251. }
  252. DWORD dwMoney = 0;
  253. MSG_DWORD MoneyMsg;
  254. MoneyMsg.Category = MP_EXCHANGE;
  255. MoneyMsg.Protocol = MP_EXCHANGE_SETMONEY;
  256. int FromNum =0;
  257. for( j = 0 ; j < 2 ; ++j )
  258. {
  259. if( m_ExchangeData[j].dwMoney > m_ExchangeData[!j].dwMoney ) //郴啊 扒捣捞 歹 腹促.
  260. {
  261. dwMoney = m_ExchangeData[j].dwMoney - m_ExchangeData[!j].dwMoney;
  262. m_ExchangeData[j].pPlayer->SetMoney( dwMoney, MONEY_SUBTRACTION, 0, eItemTable_Inventory, eMoneyLog_LoseExchange, m_ExchangeData[1-j].pPlayer->GetID() );
  263. FromNum = j;
  264. }
  265. else if( m_ExchangeData[j].dwMoney < m_ExchangeData[!j].dwMoney )
  266. {
  267. dwMoney = m_ExchangeData[!j].dwMoney - m_ExchangeData[j].dwMoney;
  268. m_ExchangeData[j].pPlayer->SetMoney( dwMoney, MONEY_ADDITION, 0, eItemTable_Inventory, eMoneyLog_GetExchange, m_ExchangeData[1-j].pPlayer->GetID() );
  269. }
  270. else
  271. {
  272. continue;
  273. }
  274. // MoneyMsg.dwData = m_ExchangeData[j].pPlayer->GetMoney();
  275. // m_ExchangeData[j].pPlayer->SendMsg( &MoneyMsg, sizeof( MoneyMsg ) );
  276. }
  277. LogItemMoney(m_ExchangeData[FromNum].pPlayer->GetID(), m_ExchangeData[FromNum].pPlayer->GetObjectName(),
  278. m_ExchangeData[!FromNum].pPlayer->GetID(), m_ExchangeData[!FromNum].pPlayer->GetObjectName(),
  279. eLog_Exchange, m_ExchangeData[FromNum].pPlayer->GetMoney(), m_ExchangeData[!FromNum].pPlayer->GetMoney(), 
  280. dwMoney, 0, 0, 0, 0, 0,
  281. m_ExchangeData[FromNum].pPlayer->GetPlayerExpPoint());
  282. return eEE_OK;
  283. }