Guest User

Untitled

a guest
Mar 13th, 2019
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.59 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include "desc_client.h"
  3. #include "desc_manager.h"
  4. #include "char_manager.h"
  5. #include "sectree_manager.h"
  6. #include "config.h"
  7. #include "char.h"
  8. #include "wedding.h"
  9. #include "regen.h"
  10. #include "locale_service.h"
  11.  
  12. namespace marriage
  13. {
  14. using namespace std;
  15.  
  16. EVENTINFO(wedding_map_info)
  17. {
  18. WeddingMap * pWeddingMap;
  19. int iStep;
  20.  
  21. wedding_map_info()
  22. : pWeddingMap( 0 )
  23. , iStep( 0 )
  24. {
  25. }
  26. };
  27.  
  28. EVENTFUNC(wedding_end_event)
  29. {
  30. wedding_map_info* info = dynamic_cast<wedding_map_info*>( event->info );
  31.  
  32. if ( info == NULL )
  33. {
  34. sys_err( "wedding_end_event> <Factor> Null pointer" );
  35. return 0;
  36. }
  37.  
  38. WeddingMap* pMap = info->pWeddingMap;
  39.  
  40. if (info->iStep == 0)
  41. {
  42. ++info->iStep;
  43. pMap->WarpAll();
  44. return PASSES_PER_SEC(15);
  45. }
  46. WeddingManager::instance().DestroyWeddingMap(pMap);
  47. return 0;
  48. }
  49.  
  50. // Map instance
  51. WeddingMap::WeddingMap(DWORD dwMapIndex, DWORD dwPID1, DWORD dwPID2) :
  52. m_dwMapIndex(dwMapIndex),
  53. m_pEndEvent(NULL),
  54. m_isDark(false),
  55. m_isSnow(false),
  56. m_isMusic(false),
  57. dwPID1(dwPID1),
  58. dwPID2(dwPID2)
  59. {
  60. }
  61.  
  62. WeddingMap::~WeddingMap()
  63. {
  64. event_cancel(&m_pEndEvent);
  65. }
  66.  
  67. void WeddingMap::SetEnded()
  68. {
  69. if (m_pEndEvent)
  70. {
  71. sys_err("WeddingMap::SetEnded - ALREADY EndEvent(m_pEndEvent=%x)", get_pointer(m_pEndEvent));
  72. return;
  73. }
  74.  
  75. wedding_map_info* info = AllocEventInfo<wedding_map_info>();
  76.  
  77. info->pWeddingMap = this;
  78.  
  79. m_pEndEvent = event_create(wedding_end_event, info, PASSES_PER_SEC(5));
  80.  
  81. Notice(LC_TEXT("결혼식이 종료됩니다."));
  82. Notice(LC_TEXT("자동으로 나가게됩니다."));
  83.  
  84. for (itertype(m_set_pkChr) it = m_set_pkChr.begin(); it != m_set_pkChr.end(); ++it)
  85. {
  86. LPCHARACTER ch = *it;
  87. if (ch->GetPlayerID() == dwPID1 || ch->GetPlayerID() == dwPID2)
  88. continue;
  89.  
  90. if (ch->GetLevel() < 10) // 10 레벨이하는 주지않는다.
  91. continue;
  92.  
  93. //ch->AutoGiveItem(27003, 5);
  94. ch->AutoGiveItem(27002, 5);
  95. }
  96. }
  97.  
  98. struct FNotice
  99. {
  100. FNotice(const char * psz) :
  101. m_psz(psz)
  102. {
  103. }
  104.  
  105. void operator() (LPCHARACTER ch)
  106. {
  107. ch->ChatPacket(CHAT_TYPE_NOTICE, "%s", m_psz);
  108. }
  109.  
  110. const char * m_psz;
  111. };
  112.  
  113. void WeddingMap::Notice(const char * psz)
  114. {
  115. FNotice f(psz);
  116. for_each(m_set_pkChr.begin(), m_set_pkChr.end(), f);
  117. }
  118.  
  119. struct FWarpEveryone
  120. {
  121. void operator() (LPCHARACTER ch)
  122. {
  123. if (ch->IsPC())
  124. {
  125. // ExitToSavedLocation은 WarpSet을 부르는데 이 함수에서
  126. // Sectree가 NULL이 된다. 추 후 SectreeManager로 부터는
  127. // 이 캐릭터를 찾을 수 없으므로 아래 DestroyAll에서 별도 처리함
  128. ch->ExitToSavedLocation();
  129. }
  130. }
  131. };
  132.  
  133. void WeddingMap::WarpAll()
  134. {
  135. FWarpEveryone f;
  136. for_each(m_set_pkChr.begin(), m_set_pkChr.end(), f);
  137. }
  138.  
  139. struct FDestroyEveryone
  140. {
  141. void operator() (LPCHARACTER ch)
  142. {
  143. sys_log(0, "WeddingMap::DestroyAll: %s", ch->GetName());
  144.  
  145. if (ch->GetDesc())
  146. DESC_MANAGER::instance().DestroyDesc(ch->GetDesc());
  147. else
  148. M2_DESTROY_CHARACTER(ch);
  149. }
  150. };
  151.  
  152. void WeddingMap::DestroyAll()
  153. {
  154. sys_log(0, "WeddingMap::DestroyAll: m_set_pkChr size %zu", m_set_pkChr.size());
  155.  
  156. FDestroyEveryone f;
  157.  
  158. for (charset_t::iterator it = m_set_pkChr.begin(); it != m_set_pkChr.end(); it = m_set_pkChr.begin())
  159. f(*it);
  160. }
  161.  
  162. void WeddingMap::IncMember(LPCHARACTER ch)
  163. {
  164. if (IsMember(ch) == true)
  165. return;
  166.  
  167. //sys_log(0, "WeddingMap: IncMember %s", ch->GetName());
  168. m_set_pkChr.insert(ch);
  169.  
  170. SendLocalEvent(ch);
  171.  
  172. if (ch->GetLevel() < 10)
  173. {
  174. ch->SetObserverMode(true);
  175. }
  176. }
  177.  
  178. void WeddingMap::DecMember(LPCHARACTER ch)
  179. {
  180. if (IsMember(ch) == false)
  181. return;
  182.  
  183. //sys_log(0, "WeddingMap: DecMember %s", ch->GetName());
  184. m_set_pkChr.erase(ch);
  185.  
  186. if (ch->GetLevel() < 10)
  187. {
  188. ch->SetObserverMode(false);
  189. }
  190. }
  191.  
  192. bool WeddingMap::IsMember(LPCHARACTER ch)
  193. {
  194. if (m_set_pkChr.size() <= 0)
  195. return false;
  196.  
  197. return m_set_pkChr.find(ch) != m_set_pkChr.end();
  198. }
  199.  
  200. void WeddingMap::ShoutInMap(BYTE type, const char* msg)
  201. {
  202. for (itertype(m_set_pkChr) it = m_set_pkChr.begin(); it != m_set_pkChr.end(); ++it)
  203. {
  204. LPCHARACTER ch = *it;
  205. ch->ChatPacket(CHAT_TYPE_COMMAND, msg);
  206. }
  207. }
  208.  
  209. void WeddingMap::SetMusic(bool bSet, const char* musicFileName)
  210. {
  211. if (m_isMusic != bSet)
  212. {
  213. m_isMusic = bSet;
  214. m_stMusicFileName = musicFileName;
  215.  
  216. char szCommand[256];
  217. if (m_isMusic)
  218. {
  219. ShoutInMap(CHAT_TYPE_COMMAND, __BuildCommandPlayMusic(szCommand, sizeof(szCommand), 1, m_stMusicFileName.c_str()));
  220. }
  221. else
  222. {
  223. ShoutInMap(CHAT_TYPE_COMMAND, __BuildCommandPlayMusic(szCommand, sizeof(szCommand), 0, "default"));
  224. }
  225. }
  226. }
  227.  
  228. void WeddingMap::SetDark(bool bSet)
  229. {
  230. if (m_isDark != bSet)
  231. {
  232. m_isDark = bSet;
  233.  
  234. if (m_isDark)
  235. ShoutInMap(CHAT_TYPE_COMMAND, "DayMode dark");
  236. else
  237. ShoutInMap(CHAT_TYPE_COMMAND, "DayMode light");
  238. }
  239. }
  240.  
  241. void WeddingMap::SetSnow(bool bSet)
  242. {
  243. return;
  244. }
  245.  
  246. bool WeddingMap::IsPlayingMusic()
  247. {
  248. return m_isMusic;
  249. }
  250.  
  251. void WeddingMap::SendLocalEvent(LPCHARACTER ch)
  252. {
  253. char szCommand[256];
  254.  
  255. if (m_isDark)
  256. ch->ChatPacket(CHAT_TYPE_COMMAND, "DayMode dark");
  257. if (m_isMusic)
  258. ch->ChatPacket(CHAT_TYPE_COMMAND, __BuildCommandPlayMusic(szCommand, sizeof(szCommand), 1, m_stMusicFileName.c_str()));
  259. }
  260.  
  261. const char* WeddingMap::__BuildCommandPlayMusic(char* szCommand, size_t nCmdLen, BYTE bSet, const char* c_szMusicFileName)
  262. {
  263. if (nCmdLen < 1)
  264. {
  265. szCommand[0] = '\0';
  266. return "PlayMusic 0 CommandLengthError";
  267. }
  268.  
  269. snprintf(szCommand, nCmdLen, "PlayMusic %d %s", bSet, c_szMusicFileName);
  270. return szCommand;
  271. }
  272. // Manager
  273.  
  274. WeddingManager::WeddingManager()
  275. {
  276. }
  277.  
  278. WeddingManager::~WeddingManager()
  279. {
  280. }
  281.  
  282. bool WeddingManager::IsWeddingMap(DWORD dwMapIndex)
  283. {
  284. return (dwMapIndex == WEDDING_MAP_INDEX || dwMapIndex / 10000 == WEDDING_MAP_INDEX);
  285. }
  286.  
  287. WeddingMap* WeddingManager::Find(DWORD dwMapIndex)
  288. {
  289. itertype(m_mapWedding) it = m_mapWedding.find(dwMapIndex);
  290.  
  291. if (it == m_mapWedding.end())
  292. return NULL;
  293.  
  294. return it->second;
  295. }
  296.  
  297. DWORD WeddingManager::__CreateWeddingMap(DWORD dwPID1, DWORD dwPID2)
  298. {
  299. SECTREE_MANAGER& rkSecTreeMgr = SECTREE_MANAGER::instance();
  300.  
  301. DWORD dwMapIndex = rkSecTreeMgr.CreatePrivateMap(WEDDING_MAP_INDEX);
  302.  
  303. if (!dwMapIndex)
  304. {
  305. sys_err("CreateWeddingMap(pid1=%d, pid2=%d) / CreatePrivateMap(%d) FAILED", dwPID1, dwPID2, WEDDING_MAP_INDEX);
  306. return 0;
  307. }
  308.  
  309. m_mapWedding.insert(make_pair(dwMapIndex, M2_NEW WeddingMap(dwMapIndex, dwPID1, dwPID2)));
  310.  
  311.  
  312. // LOCALE_SERVICE
  313. LPSECTREE_MAP pkSectreeMap = rkSecTreeMgr.GetMap(dwMapIndex);
  314. if (pkSectreeMap == NULL) {
  315. return 0;
  316. }
  317. string st_weddingMapRegenFileName;
  318. st_weddingMapRegenFileName.reserve(64);
  319. st_weddingMapRegenFileName = LocaleService_GetMapPath();
  320. st_weddingMapRegenFileName += "/metin2_map_wedding_01/npc.txt";
  321.  
  322. if (!regen_do(st_weddingMapRegenFileName.c_str(), dwMapIndex, pkSectreeMap->m_setting.iBaseX, pkSectreeMap->m_setting.iBaseY, NULL, true))
  323. {
  324. sys_err("CreateWeddingMap(pid1=%d, pid2=%d) / regen_do(fileName=%s, mapIndex=%d, basePos=(%d, %d)) FAILED", dwPID1, dwPID2, st_weddingMapRegenFileName.c_str(), dwMapIndex, pkSectreeMap->m_setting.iBaseX, pkSectreeMap->m_setting.iBaseY);
  325. }
  326. else
  327. {
  328. sys_log(0, "CreateWeddingMap(pid1=%d, pid2=%d) / regen_do(fileName=%s, mapIndex=%d, basePos=(%d, %d)) ok", dwPID1, dwPID2, st_weddingMapRegenFileName.c_str(), dwMapIndex, pkSectreeMap->m_setting.iBaseX, pkSectreeMap->m_setting.iBaseY);
  329. }
  330. // END_OF_LOCALE_SERVICE
  331.  
  332. return dwMapIndex;
  333. }
  334.  
  335. void WeddingManager::DestroyWeddingMap(WeddingMap* pMap)
  336. {
  337. sys_log(0, "DestroyWeddingMap(index=%u)", pMap->GetMapIndex());
  338. pMap->DestroyAll();
  339. m_mapWedding.erase(pMap->GetMapIndex());
  340. SECTREE_MANAGER::instance().DestroyPrivateMap(pMap->GetMapIndex());
  341. M2_DELETE(pMap);
  342. }
  343.  
  344. bool WeddingManager::End(DWORD dwMapIndex)
  345. {
  346. itertype(m_mapWedding) it = m_mapWedding.find(dwMapIndex);
  347.  
  348. if (it == m_mapWedding.end())
  349. return false;
  350.  
  351. it->second->SetEnded();
  352. return true;
  353. }
  354.  
  355. void WeddingManager::Request(DWORD dwPID1, DWORD dwPID2)
  356. {
  357. if (map_allow_find(WEDDING_MAP_INDEX))
  358. {
  359. DWORD dwMapIndex = __CreateWeddingMap(dwPID1, dwPID2);
  360.  
  361. if (!dwMapIndex)
  362. {
  363. sys_err("cannot create wedding map for %u, %u", dwPID1, dwPID2);
  364. return;
  365. }
  366.  
  367. TPacketWeddingReady p;
  368. p.dwPID1 = dwPID1;
  369. p.dwPID2 = dwPID2;
  370. p.dwMapIndex = dwMapIndex;
  371.  
  372. db_clientdesc->DBPacket(HEADER_GD_WEDDING_READY, 0, &p, sizeof(p));
  373. }
  374. }
  375.  
  376. }
Advertisement
Add Comment
Please, Sign In to add comment