Kirooos

Untitled

Jun 1st, 2025
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.69 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include "config.h"
  3. #include "char.h"
  4. #include "char_manager.h"
  5. #include "regen.h"
  6. #include "mob_manager.h"
  7. #include "dungeon.h"
  8.  
  9. LPREGEN regen_list = NULL;
  10. LPREGEN_EXCEPTION regen_exception_list = NULL;
  11.  
  12. enum ERegenModes
  13. {
  14. MODE_TYPE = 0,
  15. MODE_SX,
  16. MODE_SY,
  17. MODE_EX,
  18. MODE_EY,
  19. MODE_Z_SECTION,
  20. MODE_DIRECTION,
  21. MODE_REGEN_TIME,
  22. MODE_REGEN_PERCENT,
  23. MODE_MAX_COUNT,
  24. MODE_VNUM
  25. };
  26.  
  27. static bool get_word(FILE *fp, char *buf) // 워드단위로 받는다.
  28. {
  29. int i = 0;
  30. int c;
  31.  
  32. int semicolon_mode = 0;
  33.  
  34. while ((c = fgetc(fp)) != EOF)
  35. {
  36. if (i == 0)
  37. {
  38. if (c == '"')
  39. {
  40. semicolon_mode = 1;
  41. continue;
  42. }
  43.  
  44. if (c == ' ' || c == '\t' || c == '\n' || c == '\r')
  45. continue;
  46. }
  47.  
  48. if (semicolon_mode)
  49. {
  50. if (c == '"')
  51. {
  52. buf[i] = '\0';
  53. return true;
  54. }
  55.  
  56. buf[i++] = c;
  57. }
  58. else
  59. {
  60. if ((c == ' ' || c == '\t' || c == '\n' || c == '\r'))
  61. {
  62. buf[i] = '\0';
  63. return true;
  64. }
  65.  
  66. buf[i++] = c;
  67. }
  68.  
  69. if (i == 2 && buf[0] == '/' && buf[1] == '/')
  70. {
  71. buf[i] = '\0';
  72. return true;
  73. }
  74. }
  75.  
  76. buf[i] = '\0';
  77. return (i != 0);
  78. }
  79.  
  80. static void next_line(FILE *fp)
  81. {
  82. int c;
  83.  
  84. while ((c = fgetc(fp)) != EOF)
  85. if (c == '\n')
  86. return;
  87. }
  88.  
  89. static bool read_line(FILE *fp, LPREGEN regen)
  90. {
  91. char szTmp[256];
  92.  
  93. int mode = MODE_TYPE;
  94. int tmpTime;
  95. DWORD i;
  96.  
  97. while (get_word(fp, szTmp))
  98. {
  99. if (!strncmp(szTmp, "//", 2))
  100. {
  101. next_line(fp);
  102. continue;
  103. }
  104.  
  105. switch (mode)
  106. {
  107. case MODE_TYPE:
  108. if (szTmp[0] == 'm')
  109. regen->type = REGEN_TYPE_MOB;
  110. else if (szTmp[0] == 'g')
  111. {
  112. regen->type = REGEN_TYPE_GROUP;
  113.  
  114. if (szTmp[1] == 'a')
  115. regen->is_aggressive = true;
  116. }
  117. else if (szTmp[0] == 'e')
  118. regen->type = REGEN_TYPE_EXCEPTION;
  119. else if (szTmp[0] == 'r')
  120. regen->type = REGEN_TYPE_GROUP_GROUP;
  121. else if (szTmp[0] == 's')
  122. regen->type = REGEN_TYPE_ANYWHERE;
  123. else
  124. {
  125. sys_err("read_line: unknown regen type %c", szTmp[0]);
  126. exit(1);
  127. }
  128.  
  129. ++mode;
  130. break;
  131.  
  132. case MODE_SX:
  133. str_to_number(regen->sx, szTmp);
  134. ++mode;
  135. break;
  136.  
  137. case MODE_SY:
  138. str_to_number(regen->sy, szTmp);
  139. ++mode;
  140. break;
  141.  
  142. case MODE_EX:
  143. {
  144. int iX = 0;
  145. str_to_number(iX, szTmp);
  146.  
  147. regen->sx -= iX;
  148. regen->ex = regen->sx + iX * 2;
  149.  
  150. regen->sx *= 100;
  151. regen->ex *= 100;
  152.  
  153. ++mode;
  154. }
  155. break;
  156.  
  157. case MODE_EY:
  158. {
  159. int iY = 0;
  160. str_to_number(iY, szTmp);
  161.  
  162. regen->sy -= iY;
  163. regen->ey = regen->sy + iY * 2;
  164.  
  165. regen->sy *= 100;
  166. regen->ey *= 100;
  167.  
  168. ++mode;
  169. }
  170. break;
  171.  
  172. case MODE_Z_SECTION:
  173. str_to_number(regen->z_section, szTmp);
  174.  
  175. // 익셉션 이면 나가주자.
  176. if (regen->type == REGEN_TYPE_EXCEPTION)
  177. return true;
  178.  
  179. ++mode;
  180. break;
  181.  
  182. case MODE_DIRECTION:
  183. str_to_number(regen->direction, szTmp);
  184. ++mode;
  185. break;
  186.  
  187. case MODE_REGEN_TIME:
  188. regen->time = 0;
  189. tmpTime = 0;
  190.  
  191. for (i = 0; i < strlen(szTmp); ++i)
  192. {
  193. switch (szTmp[i])
  194. {
  195. case 'h':
  196. regen->time += tmpTime * 3600;
  197. tmpTime = 0;
  198. break;
  199.  
  200. case 'm':
  201. regen->time += tmpTime * 60;
  202. tmpTime = 0;
  203. break;
  204.  
  205. case 's':
  206. regen->time += tmpTime;
  207. tmpTime = 0;
  208. break;
  209.  
  210. default:
  211. if (szTmp[i] >= '0' && szTmp[i] <= '9')
  212. {
  213. tmpTime *= 10;
  214. tmpTime += (szTmp[i] - '0');
  215. }
  216. }
  217. }
  218.  
  219. ++mode;
  220. break;
  221.  
  222. case MODE_REGEN_PERCENT:
  223. ++mode;
  224. break;
  225.  
  226. case MODE_MAX_COUNT:
  227. regen->count = 0;
  228. str_to_number(regen->max_count, szTmp);
  229. ++mode;
  230. break;
  231.  
  232. case MODE_VNUM:
  233. str_to_number(regen->vnum, szTmp);
  234. ++mode;
  235. return true;
  236. }
  237. }
  238.  
  239. return false;
  240. }
  241.  
  242. bool is_regen_exception(long x, long y)
  243. {
  244. LPREGEN_EXCEPTION exc;
  245.  
  246. for (exc = regen_exception_list; exc; exc = exc->next)
  247. {
  248. if (exc->sx <= x && exc->sy <= y)
  249. if (exc->ex >= x && exc->ey >= y)
  250. return true;
  251. }
  252.  
  253. return false;
  254. }
  255.  
  256. static void regen_spawn_dungeon(LPREGEN regen, LPDUNGEON pDungeon, bool bOnce)
  257. {
  258. DWORD num;
  259. DWORD i;
  260.  
  261. num = (regen->max_count - regen->count);
  262.  
  263. if (!num)
  264. return;
  265.  
  266. for (i = 0; i < num; ++i)
  267. {
  268. LPCHARACTER ch = NULL;
  269.  
  270. if (regen->type == REGEN_TYPE_ANYWHERE)
  271. {
  272. ch = CHARACTER_MANAGER::instance().SpawnMobRandomPosition(regen->vnum, regen->lMapIndex);
  273.  
  274. if (ch)
  275. {
  276. ++regen->count;
  277. ch->SetDungeon(pDungeon);
  278. }
  279. }
  280. else if (regen->sx == regen->ex && regen->sy == regen->ey)
  281. {
  282. ch = CHARACTER_MANAGER::instance().SpawnMob(regen->vnum,
  283. regen->lMapIndex,
  284. regen->sx,
  285. regen->sy,
  286. regen->z_section,
  287. false,
  288. regen->direction == 0 ? number(0, 7) * 45 : (regen->direction - 1) * 45);
  289.  
  290. if (ch)
  291. {
  292. ++regen->count;
  293. ch->SetDungeon(pDungeon);
  294. }
  295. }
  296. else
  297. {
  298. if (regen->type == REGEN_TYPE_MOB)
  299. {
  300. ch = CHARACTER_MANAGER::Instance().SpawnMobRange(regen->vnum, regen->lMapIndex, regen->sx, regen->sy, regen->ex, regen->ey, true);
  301.  
  302. if (ch)
  303. {
  304. ++regen->count;
  305. ch->SetDungeon(pDungeon);
  306. }
  307. }
  308. else if (regen->type == REGEN_TYPE_GROUP)
  309. {
  310. if (CHARACTER_MANAGER::Instance().SpawnGroup(regen->vnum, regen->lMapIndex, regen->sx, regen->sy, regen->ex, regen->ey, bOnce ? NULL : regen, regen->is_aggressive, pDungeon))
  311. ++regen->count;
  312. }
  313. else if (regen->type == REGEN_TYPE_GROUP_GROUP)
  314. {
  315. if (CHARACTER_MANAGER::Instance().SpawnGroupGroup(regen->vnum, regen->lMapIndex, regen->sx, regen->sy, regen->ex, regen->ey, bOnce ? NULL : regen, regen->is_aggressive, pDungeon))
  316. ++regen->count;
  317. }
  318. }
  319.  
  320. if (ch && !bOnce)
  321. ch->SetRegen(regen);
  322. }
  323. }
  324.  
  325. static void regen_spawn(LPREGEN regen, bool bOnce)
  326. {
  327. DWORD num;
  328. DWORD i;
  329.  
  330. num = (regen->max_count - regen->count);
  331.  
  332. if (!num)
  333. return;
  334.  
  335. for (i = 0; i < num; ++i)
  336. {
  337. LPCHARACTER ch = NULL;
  338.  
  339. if (regen->type == REGEN_TYPE_ANYWHERE)
  340. {
  341. ch = CHARACTER_MANAGER::instance().SpawnMobRandomPosition(regen->vnum, regen->lMapIndex);
  342.  
  343. if (ch)
  344. ++regen->count;
  345. }
  346. else if (regen->sx == regen->ex && regen->sy == regen->ey)
  347. {
  348. ch = CHARACTER_MANAGER::instance().SpawnMob(regen->vnum,
  349. regen->lMapIndex,
  350. regen->sx,
  351. regen->sy,
  352. regen->z_section,
  353. false,
  354. regen->direction == 0 ? number(0, 7) * 45 : (regen->direction - 1) * 45);
  355.  
  356. if (ch)
  357. ++regen->count;
  358. }
  359. else
  360. {
  361. if (regen->type == REGEN_TYPE_MOB)
  362. {
  363. ch = CHARACTER_MANAGER::Instance().SpawnMobRange(regen->vnum, regen->lMapIndex, regen->sx, regen->sy, regen->ex, regen->ey, true, regen->is_aggressive, regen->is_aggressive );
  364.  
  365. if (ch)
  366. ++regen->count;
  367. }
  368. else if (regen->type == REGEN_TYPE_GROUP)
  369. {
  370. if (CHARACTER_MANAGER::Instance().SpawnGroup(regen->vnum, regen->lMapIndex, regen->sx, regen->sy, regen->ex, regen->ey, bOnce ? NULL : regen, regen->is_aggressive))
  371. ++regen->count;
  372. }
  373. else if (regen->type == REGEN_TYPE_GROUP_GROUP)
  374. {
  375. if (CHARACTER_MANAGER::Instance().SpawnGroupGroup(regen->vnum, regen->lMapIndex, regen->sx, regen->sy, regen->ex, regen->ey, bOnce ? NULL : regen, regen->is_aggressive))
  376. ++regen->count;
  377. }
  378. }
  379.  
  380. if (ch && !bOnce)
  381. ch->SetRegen(regen);
  382. }
  383. }
  384.  
  385. EVENTFUNC(dungeon_regen_event)
  386. {
  387. dungeon_regen_event_info* info = dynamic_cast<dungeon_regen_event_info*>( event->info );
  388.  
  389. if ( info == NULL )
  390. {
  391. sys_err( "dungeon_regen_event> <Factor> Null pointer" );
  392. return 0;
  393. }
  394.  
  395. LPDUNGEON pDungeon = CDungeonManager::instance().Find(info->dungeon_id);
  396. if (pDungeon == NULL) {
  397. return 0;
  398. }
  399.  
  400. LPREGEN regen = info->regen;
  401. if (regen->time == 0)
  402. {
  403. regen->event = NULL;
  404. }
  405.  
  406. regen_spawn_dungeon(regen, pDungeon, false);
  407. return PASSES_PER_SEC(regen->time);
  408. }
  409.  
  410. bool regen_do(const char* filename, long lMapIndex, int base_x, int base_y, LPDUNGEON pDungeon, bool bOnce)
  411. {
  412. if (g_bNoRegen)
  413. return true;
  414.  
  415. if ( lMapIndex >= 114 && lMapIndex <= 117 )
  416. return true;
  417.  
  418. LPREGEN regen = NULL;
  419. FILE* fp = fopen(filename, "rt");
  420.  
  421. if (NULL == fp)
  422. {
  423. sys_err("SYSTEM: regen_do: %s: file not found", filename);
  424. return false;
  425. }
  426.  
  427. while (true)
  428. {
  429. REGEN tmp;
  430.  
  431. memset(&tmp, 0, sizeof(tmp));
  432.  
  433. if (!read_line(fp, &tmp))
  434. break;
  435.  
  436. if (tmp.type == REGEN_TYPE_MOB ||
  437. tmp.type == REGEN_TYPE_GROUP ||
  438. tmp.type == REGEN_TYPE_GROUP_GROUP ||
  439. tmp.type == REGEN_TYPE_ANYWHERE)
  440. {
  441. if (!bOnce)
  442. {
  443. regen = M2_NEW REGEN;
  444. memcpy(regen, &tmp, sizeof(REGEN));
  445. }
  446. else
  447. regen = &tmp;
  448.  
  449. if (pDungeon)
  450. regen->is_aggressive = true;
  451.  
  452. regen->lMapIndex = lMapIndex;
  453. regen->count = 0;
  454.  
  455. regen->sx += base_x;
  456. regen->ex += base_x;
  457.  
  458. regen->sy += base_y;
  459. regen->ey += base_y;
  460.  
  461. if (regen->sx > regen->ex)
  462. {
  463. regen->sx ^= regen->ex;
  464. regen->ex ^= regen->sx;
  465. regen->sx ^= regen->ex;
  466. }
  467.  
  468. if (regen->sy > regen->ey)
  469. {
  470. regen->sy ^= regen->ey;
  471. regen->ey ^= regen->sy;
  472. regen->sy ^= regen->ey;
  473. }
  474.  
  475. if (regen->type == REGEN_TYPE_MOB)
  476. {
  477. const CMob * p = CMobManager::instance().Get(regen->vnum);
  478.  
  479. if (!p)
  480. {
  481. sys_err("No mob data by vnum %u", regen->vnum);
  482. if (!bOnce) {
  483. M2_DELETE(regen);
  484. }
  485. continue;
  486. }
  487. }
  488.  
  489. if (!bOnce && pDungeon != NULL)
  490. {
  491. dungeon_regen_event_info* info = AllocEventInfo<dungeon_regen_event_info>();
  492.  
  493. info->regen = regen;
  494. info->dungeon_id = pDungeon->GetId();
  495.  
  496. regen->event = event_create(dungeon_regen_event, info, PASSES_PER_SEC(number(0, 16)) + PASSES_PER_SEC(regen->time));
  497.  
  498. pDungeon->AddRegen(regen);
  499. // regen_id should be determined at this point,
  500. // before the call to CHARACTER::SetRegen()
  501. }
  502.  
  503. // 처음엔 무조건 리젠 해준다.
  504. regen_spawn_dungeon(regen, pDungeon, bOnce);
  505.  
  506. }
  507. }
  508.  
  509. fclose(fp);
  510. return true;
  511. }
  512.  
  513. #ifdef ENABLE_ATLAS_BOSS
  514. bool regen_load(const char* filename, long lMapIndex, int base_x, int base_y, bool bossFile)
  515. #else
  516. bool regen_load(const char* filename, long lMapIndex, int base_x, int base_y)
  517. #endif
  518. {
  519. if (g_bNoRegen)
  520. return true;
  521.  
  522. LPREGEN regen = NULL;
  523. FILE * fp = fopen(filename, "rt");
  524.  
  525. if (NULL == fp)
  526. {
  527. sys_err("SYSTEM: regen_do: %s: file not found", filename);
  528. return false;
  529. }
  530.  
  531. while (true)
  532. {
  533. REGEN tmp;
  534.  
  535. memset(&tmp, 0, sizeof(tmp));
  536.  
  537. if (!read_line(fp, &tmp))
  538. break;
  539.  
  540. if (tmp.type == REGEN_TYPE_MOB ||
  541. tmp.type == REGEN_TYPE_GROUP ||
  542. tmp.type == REGEN_TYPE_GROUP_GROUP ||
  543. tmp.type == REGEN_TYPE_ANYWHERE)
  544. {
  545. regen = &tmp;
  546.  
  547. regen->is_aggressive = true;
  548.  
  549. regen->lMapIndex = lMapIndex;
  550. regen->count = 0;
  551.  
  552. regen->sx += base_x;
  553. regen->ex += base_x;
  554.  
  555. regen->sy += base_y;
  556. regen->ey += base_y;
  557.  
  558. if (regen->sx > regen->ex)
  559. {
  560. regen->sx ^= regen->ex;
  561. regen->ex ^= regen->sx;
  562. regen->sx ^= regen->ex;
  563. }
  564.  
  565. if (regen->sy > regen->ey)
  566. {
  567. regen->sy ^= regen->ey;
  568. regen->ey ^= regen->sy;
  569. regen->sy ^= regen->ey;
  570. }
  571.  
  572. if (regen->type == REGEN_TYPE_MOB)
  573. {
  574. const CMob * p = CMobManager::instance().Get(regen->vnum);
  575.  
  576. if (!p)
  577. {
  578. sys_err("No mob data by vnum %u", regen->vnum);
  579. continue;
  580. }
  581. }
  582.  
  583. // 처음엔 무조건 리젠 해준다.
  584. regen_spawn(regen, true);
  585. }
  586. }
  587.  
  588. fclose(fp);
  589. return true;
  590. }
  591.  
  592. EVENTFUNC(regen_event)
  593. {
  594. regen_event_info* info = dynamic_cast<regen_event_info*>( event->info );
  595.  
  596. if ( info == NULL )
  597. {
  598. sys_err( "regen_event> <Factor> Null pointer" );
  599. return 0;
  600. }
  601.  
  602. LPREGEN regen = info->regen;
  603.  
  604. if (regen->time == 0)
  605. regen->event = NULL;
  606.  
  607. regen_spawn(regen, false);
  608. return PASSES_PER_SEC(regen->time);
  609. }
  610.  
  611. bool regen_load(const char* filename, long lMapIndex, int base_x, int base_y)
  612. {
  613. if (g_bNoRegen)
  614. return true;
  615.  
  616. LPREGEN regen = NULL;
  617. FILE* fp = fopen(filename, "rt");
  618.  
  619. if (NULL == fp)
  620. {
  621. sys_log(0, "SYSTEM: regen_load: %s: file not found", filename);
  622. return false;
  623. }
  624.  
  625. while (true)
  626. {
  627. REGEN tmp;
  628.  
  629. memset(&tmp, 0, sizeof(tmp));
  630.  
  631. if (!read_line(fp, &tmp))
  632. break;
  633.  
  634. if (tmp.type == REGEN_TYPE_MOB ||
  635. tmp.type == REGEN_TYPE_GROUP ||
  636. tmp.type == REGEN_TYPE_GROUP_GROUP ||
  637. tmp.type == REGEN_TYPE_ANYWHERE)
  638. {
  639. if (test_server)
  640. {
  641. CMobManager::instance().IncRegenCount(tmp.type, tmp.vnum, tmp.max_count, tmp.time);
  642. }
  643.  
  644. regen = M2_NEW REGEN;
  645. memcpy(regen, &tmp, sizeof(REGEN));
  646. INSERT_TO_TW_LIST(regen, regen_list, prev, next);
  647.  
  648. regen->lMapIndex = lMapIndex;
  649. regen->count = 0;
  650.  
  651. regen->sx += base_x;
  652. regen->ex += base_x;
  653.  
  654. regen->sy += base_y;
  655. regen->ey += base_y;
  656.  
  657. if (regen->sx > regen->ex)
  658. {
  659. regen->sx ^= regen->ex;
  660. regen->ex ^= regen->sx;
  661. regen->sx ^= regen->ex;
  662. }
  663.  
  664. if (regen->sy > regen->ey)
  665. {
  666. regen->sy ^= regen->ey;
  667. regen->ey ^= regen->sy;
  668. regen->sy ^= regen->ey;
  669. }
  670.  
  671. if (regen->type == REGEN_TYPE_MOB)
  672. {
  673. const CMob * p = CMobManager::instance().Get(regen->vnum);
  674.  
  675. if (!p)
  676. {
  677. sys_err("No mob data by vnum %u", regen->vnum);
  678. }
  679. else if (p->m_table.bType == CHAR_TYPE_NPC || p->m_table.bType == CHAR_TYPE_WARP || p->m_table.bType == CHAR_TYPE_GOTO)
  680. {
  681. SECTREE_MANAGER::instance().InsertNPCPosition(lMapIndex,
  682. p->m_table.bType,
  683. p->m_table.szLocaleName,
  684. (regen->sx+regen->ex) / 2 - base_x,
  685. (regen->sy+regen->ey) / 2 - base_y);
  686. }
  687. }
  688. #ifdef ENABLE_ATLAS_BOSS
  689. if ((bossFile) && (tmp.type == REGEN_TYPE_MOB))
  690. {
  691. const CMob * p = CMobManager::instance().Get(regen->vnum);
  692. if (!p)
  693. sys_err("In %s, No mob data by vnum %u", filename, regen->vnum);
  694. else {
  695. SECTREE_MANAGER::instance().InsertBossPosition(lMapIndex, p->m_table.bType,
  696.  
  697. p->m_table.szLocaleName
  698.  
  699. , (regen->sx+regen->ex) / 2 - base_x, (regen->sy+regen->ey) / 2 - base_y, tmp.time);
  700. }
  701. }
  702. #endif
  703.  
  704.  
  705. //NO_REGEN
  706. // Desc: regen.txt (외 리젠관련 텍스트 ) 에서 리젠 시간을 0으로 세팅할시
  707. // 리젠을 하지 안한다.
  708. if (regen->time != 0)
  709. {
  710. // 처음엔 무조건 리젠 해준다.
  711. regen_spawn(regen, false);
  712.  
  713. regen_event_info* info = AllocEventInfo<regen_event_info>();
  714.  
  715. info->regen = regen;
  716.  
  717. regen->event = event_create(regen_event, info, PASSES_PER_SEC(number(0, 16)) + PASSES_PER_SEC(regen->time));
  718. }
  719. //END_NO_REGEN
  720. }
  721. else if (tmp.type == REGEN_TYPE_EXCEPTION)
  722. {
  723. LPREGEN_EXCEPTION exc;
  724.  
  725. exc = M2_NEW REGEN_EXCEPTION;
  726.  
  727. exc->sx = tmp.sx;
  728. exc->sy = tmp.sy;
  729. exc->ex = tmp.ex;
  730. exc->ey = tmp.ey;
  731. exc->z_section = tmp.z_section;
  732.  
  733. INSERT_TO_TW_LIST(exc, regen_exception_list, prev, next);
  734. }
  735. }
  736.  
  737. fclose(fp);
  738. return true;
  739. }
  740.  
  741. void regen_free(void)
  742. {
  743. LPREGEN regen, next_regen;
  744. LPREGEN_EXCEPTION exc, next_exc;
  745.  
  746. for (regen = regen_list; regen; regen = next_regen)
  747. {
  748. next_regen = regen->next;
  749.  
  750. event_cancel(&regen->event);
  751. M2_DELETE(regen);
  752. }
  753.  
  754. regen_list = NULL;
  755.  
  756. for (exc = regen_exception_list; exc; exc = next_exc)
  757. {
  758. next_exc = exc->next;
  759.  
  760. M2_DELETE(exc);
  761. }
  762.  
  763. regen_exception_list = NULL;
  764. }
  765.  
  766. void regen_reset(int x, int y)
  767. {
  768. LPREGEN regen;
  769.  
  770. for (regen = regen_list; regen; regen = regen->next)
  771. {
  772. if (!regen->event)
  773. continue;
  774.  
  775. // 좌표가 있으면 좌표 내에 있는 리젠 리스트만 리젠 시킨다.
  776. if (x != 0 || y != 0)
  777. {
  778. if (x >= regen->sx && x <= regen->ex)
  779. if (y >= regen->sy && y <= regen->ey)
  780. event_reset_time(regen->event, 1);
  781. }
  782. // 없으면 전부 리젠
  783. else
  784. event_reset_time(regen->event, 1);
  785. }
  786. }
  787.  
  788.  
Advertisement
Add Comment
Please, Sign In to add comment