Guest User

Untitled

a guest
Jan 27th, 2016
292
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.07 KB | None | 0 0
  1. void CHARACTER::PointChange(BYTE type, unsigned long long amount, bool bAmount, bool bBroadcast)
  2. {
  3. unsigned long long val = 0;
  4.  
  5. //sys_log(0, "PointChange %d %d | %d -> %d cHP %d mHP %d", type, amount, GetPoint(type), GetPoint(type)+amount, GetHP(), GetMaxHP());
  6.  
  7. switch (type)
  8. {
  9. case POINT_NONE:
  10. return;
  11.  
  12. case POINT_LEVEL:
  13. if ((GetLevel() + amount) > gPlayerMaxLevel)
  14. return;
  15.  
  16. SetLevel(GetLevel() + amount);
  17. val = GetLevel();
  18.  
  19. sys_log(0, "LEVELUP: %s %d NEXT EXP %d", GetName(), GetLevel(), GetNextExp());
  20.  
  21. PointChange(POINT_NEXT_EXP, GetNextExp(), false);
  22.  
  23. if (amount)
  24. {
  25. quest::CQuestManager::instance().LevelUp(GetPlayerID());
  26.  
  27. LogManager::instance().LevelLog(this, val, GetRealPoint(POINT_PLAYTIME) + (get_dword_time() - m_dwPlayStartTime) / 60000);
  28.  
  29. if (GetGuild())
  30. {
  31. GetGuild()->LevelChange(GetPlayerID(), GetLevel());
  32. }
  33.  
  34. if (GetParty())
  35. {
  36. GetParty()->RequestSetMemberLevel(GetPlayerID(), GetLevel());
  37. }
  38. }
  39. break;
  40.  
  41. case POINT_NEXT_EXP:
  42. val = GetNextExp();
  43. bAmount = false; // 무조건 bAmount는 false 여야 한다.
  44. break;
  45.  
  46. case POINT_EXP:
  47. {
  48. DWORD exp = GetExp();
  49. DWORD next_exp = GetNextExp();
  50.  
  51. // 청소년보호
  52. if (LC_IsNewCIBN())
  53. {
  54. if (IsOverTime(OT_NONE))
  55. {
  56. dev_log(LOG_DEB0, "<EXP_LOG> %s = NONE", GetName());
  57. }
  58. else if (IsOverTime(OT_3HOUR))
  59. {
  60. amount = (amount / 2);
  61. dev_log(LOG_DEB0, "<EXP_LOG> %s = 3HOUR", GetName());
  62. }
  63. else if (IsOverTime(OT_5HOUR))
  64. {
  65. amount = 0;
  66. dev_log(LOG_DEB0, "<EXP_LOG> %s = 5HOUR", GetName());
  67. }
  68. }
  69.  
  70. // exp가 0 이하로 가지 않도록 한다
  71. if (amount < 0 && exp < -amount)
  72. {
  73. sys_log(1, "%s AMOUNT < 0 %d, CUR EXP: %d", GetName(), -amount, exp);
  74. amount = -exp;
  75.  
  76. SetExp(exp + amount);
  77. val = GetExp();
  78. }
  79. else
  80. {
  81. if (gPlayerMaxLevel <= GetLevel())
  82. return;
  83.  
  84. if (block_exp)
  85. {
  86. return;
  87. }
  88.  
  89. if (test_server)
  90. ChatPacket(CHAT_TYPE_INFO, "You have gained %d exp.", amount);
  91.  
  92. DWORD iExpBalance = 0;
  93.  
  94. // 레벨 업!
  95. if (exp + amount >= next_exp)
  96. {
  97. iExpBalance = (exp + amount) - next_exp;
  98. amount = next_exp - exp;
  99.  
  100. SetExp(0);
  101. exp = next_exp;
  102. }
  103. else
  104. {
  105. SetExp(exp + amount);
  106. exp = GetExp();
  107. }
  108.  
  109. DWORD q = DWORD(next_exp / 4.0f);
  110. int iLevStep = GetRealPoint(POINT_LEVEL_STEP);
  111.  
  112. // iLevStep이 4 이상이면 레벨이 올랐어야 하므로 여기에 올 수 없는 값이다.
  113. if (iLevStep >= 4)
  114. {
  115. sys_err("%s LEVEL_STEP bigger than 4! (%d)", GetName(), iLevStep);
  116. iLevStep = 4;
  117. }
  118.  
  119. if (exp >= next_exp && iLevStep < 4)
  120. {
  121. for (int i = 0; i < 4 - iLevStep; ++i)
  122. PointChange(POINT_LEVEL_STEP, 1, false, true);
  123. }
  124. else if (exp >= q * 3 && iLevStep < 3)
  125. {
  126. for (int i = 0; i < 3 - iLevStep; ++i)
  127. PointChange(POINT_LEVEL_STEP, 1, false, true);
  128. }
  129. else if (exp >= q * 2 && iLevStep < 2)
  130. {
  131. for (int i = 0; i < 2 - iLevStep; ++i)
  132. PointChange(POINT_LEVEL_STEP, 1, false, true);
  133. }
  134. else if (exp >= q && iLevStep < 1)
  135. PointChange(POINT_LEVEL_STEP, 1);
  136.  
  137. if (iExpBalance)
  138. {
  139. PointChange(POINT_EXP, iExpBalance);
  140. }
  141.  
  142. val = GetExp();
  143. }
  144. {
  145. DWORD dwPID;
  146. LPCHARACTER ch = CHARACTER_MANAGER::instance().FindByPID(dwPID);
  147. if (ch->GetMapIndex() == 73 || ch->GetMapIndex() == 72) {
  148. if(ch->GetLevel() >= 95) {
  149. ChatPacket(CHAT_TYPE_INFO, "<Blokada>Masz za duzy poziom aby zdobywac tu doswiadczenie!");
  150. return;
  151. }
  152. }
  153. }
  154. {
  155. DWORD dwPID;
  156. LPCHARACTER ch = CHARACTER_MANAGER::instance().FindByPID(dwPID);
  157. if (ch->GetMapIndex() == 217) {
  158. if(ch->GetLevel() >= 110) {
  159. ChatPacket(CHAT_TYPE_INFO, "<Blokada>Masz za duzy poziom aby zdobywac tu doswiadczenie!");
  160. return;
  161. }
  162. }
  163. }
  164. {
  165. DWORD dwPID;
  166. LPCHARACTER ch = CHARACTER_MANAGER::instance().FindByPID(dwPID);
  167. if (ch->GetMapIndex() == 218) {
  168. if(ch->GetLevel() >= 125) {
  169. ChatPacket(CHAT_TYPE_INFO, "<Blokada>Masz za duzy poziom aby zdobywac tu doswiadczenie!");
  170. return;
  171. }
  172. }
  173. }
  174. {
  175. DWORD dwPID;
  176. LPCHARACTER ch = CHARACTER_MANAGER::instance().FindByPID(dwPID);
  177. if (ch->GetMapIndex() == 215) {
  178. if(ch->GetLevel() >= 140) {
  179. ChatPacket(CHAT_TYPE_INFO, "<Blokada>Masz za duzy poziom aby zdobywac tu doswiadczenie!");
  180. return;
  181. }
  182. }
  183. }
  184. {
  185. DWORD dwPID;
  186. LPCHARACTER ch = CHARACTER_MANAGER::instance().FindByPID(dwPID);
  187. if (ch->GetMapIndex() == 216) {
  188. if(ch->GetLevel() >= 150) {
  189. ChatPacket(CHAT_TYPE_INFO, "<Blokada>Masz za duzy poziom aby zdobywac tu doswiadczenie!");
  190. return;
  191. }
  192. }
  193. }
  194. }
  195. break;
  196.  
  197. case POINT_LEVEL_STEP:
  198. if (amount > 0)
  199. {
  200. val = GetPoint(POINT_LEVEL_STEP) + amount;
  201.  
  202. switch (val)
  203. {
  204. case 1:
  205. case 2:
  206. case 3:
  207. //if (GetLevel() < 100) PointChange(POINT_STAT, 1);
  208. if (GetLevel() < 220) PointChange(POINT_STAT, 1);
  209. break;
  210.  
  211. case 4:
  212. {
  213. int iHP = number(JobInitialPoints[GetJob()].hp_per_lv_begin, JobInitialPoints[GetJob()].hp_per_lv_end);
  214. int iSP = number(JobInitialPoints[GetJob()].sp_per_lv_begin, JobInitialPoints[GetJob()].sp_per_lv_end);
  215.  
  216. m_points.iRandomHP += iHP;
  217. m_points.iRandomSP += iSP;
  218.  
  219. if (GetSkillGroup())
  220. {
  221. if (GetLevel() >= 5)
  222. PointChange(POINT_SKILL, 1);
  223.  
  224. if (GetLevel() >= 9)
  225. PointChange(POINT_SUB_SKILL, 1);
  226. }
  227.  
  228. PointChange(POINT_MAX_HP, iHP);
  229. PointChange(POINT_MAX_SP, iSP);
  230. PointChange(POINT_LEVEL, 1, false, true);
  231.  
  232. val = 0;
  233. }
  234. break;
  235. }
  236.  
  237. PointChange(POINT_HP, GetMaxHP() - GetHP());
  238. PointChange(POINT_SP, GetMaxSP() - GetSP());
  239. PointChange(POINT_STAMINA, GetMaxStamina() - GetStamina());
  240.  
  241. SetPoint(POINT_LEVEL_STEP, val);
  242. SetRealPoint(POINT_LEVEL_STEP, val);
  243.  
  244. Save();
  245. }
  246. else
  247. val = GetPoint(POINT_LEVEL_STEP);
  248.  
  249. break;
  250.  
  251. case POINT_HP:
  252. {
  253. if (IsDead() || IsStun())
  254. return;
  255.  
  256. int prev_hp = GetHP();
  257.  
  258. amount = MIN(GetMaxHP() - GetHP(), amount);
  259. SetHP(GetHP() + amount);
  260. val = GetHP();
  261.  
  262. BroadcastTargetPacket();
  263.  
  264. if (GetParty() && IsPC() && val != prev_hp)
  265. GetParty()->SendPartyInfoOneToAll(this);
  266. }
  267. break;
  268.  
  269. case POINT_SP:
  270. {
  271. if (IsDead() || IsStun())
  272. return;
  273.  
  274. amount = MIN(GetMaxSP() - GetSP(), amount);
  275. SetSP(GetSP() + amount);
  276. val = GetSP();
  277. }
  278. break;
  279.  
  280. case POINT_STAMINA:
  281. {
  282. if (IsDead() || IsStun())
  283. return;
  284.  
  285. int prev_val = GetStamina();
  286. amount = MIN(GetMaxStamina() - GetStamina(), amount);
  287. SetStamina(GetStamina() + amount);
  288. val = GetStamina();
  289.  
  290. if (val == 0)
  291. {
  292. // Stamina가 없으니 걷자!
  293. SetNowWalking(true);
  294. }
  295. else if (prev_val == 0)
  296. {
  297. // 없던 스테미나가 생겼으니 이전 모드 복귀
  298. ResetWalking();
  299. }
  300.  
  301. if (amount < 0 && val != 0) // 감소는 보내지않는다.
  302. return;
  303. }
  304. break;
  305.  
  306. case POINT_MAX_HP:
  307. {
  308. SetPoint(type, GetPoint(type) + amount);
  309. int curMaxHP = GetMaxHP();
  310. int hp = GetRealPoint(POINT_MAX_HP);
  311. int add_hp = MIN(3500, hp * GetPoint(POINT_MAX_HP_PCT) / 100);
  312. add_hp += GetPoint(POINT_MAX_HP);
  313. add_hp += GetPoint(POINT_PARTY_TANKER_BONUS);
  314. SetMaxHP(hp + add_hp);
  315. float fRatio = (float)GetMaxHP() / (float)curMaxHP;
  316. PointChange(POINT_HP, GetHP() * fRatio - GetHP());
  317. val = GetMaxHP();
  318. }
  319. break;
  320.  
  321. case POINT_MAX_SP:
  322. {
  323. SetPoint(type, GetPoint(type) + amount);
  324. int curMaxSP = GetMaxSP();
  325. int sp = GetRealPoint(POINT_MAX_SP);
  326. int add_sp = MIN(800, sp * GetPoint(POINT_MAX_SP_PCT) / 100);
  327. add_sp += GetPoint(POINT_MAX_SP);
  328. add_sp += GetPoint(POINT_PARTY_SKILL_MASTER_BONUS);
  329. SetMaxSP(sp + add_sp);
  330. float fRatio = (float)GetMaxSP() / (float)curMaxSP;
  331. PointChange(POINT_SP, GetSP() * fRatio - GetSP());
  332. val = GetMaxSP();
  333. }
  334. break;
  335.  
  336. case POINT_MAX_HP_PCT:
  337. SetPoint(type, GetPoint(type) + amount);
  338. val = GetPoint(type);
  339.  
  340. PointChange(POINT_MAX_HP, 0);
  341. break;
  342.  
  343. case POINT_MAX_SP_PCT:
  344. SetPoint(type, GetPoint(type) + amount);
  345. val = GetPoint(type);
  346.  
  347. PointChange(POINT_MAX_SP, 0);
  348. break;
  349.  
  350. case POINT_MAX_STAMINA:
  351. SetMaxStamina(GetMaxStamina() + amount);
  352. val = GetMaxStamina();
  353. break;
  354.  
  355. case POINT_GOLD:
  356. {
  357. const unsigned long long nTotalMoney = static_cast<unsigned long long>(GetGold()) + static_cast<unsigned long long>(amount);
  358.  
  359. if (GOLD_MAX <= nTotalMoney)
  360. {
  361. sys_err("[OVERFLOW_GOLD] OriGold %d AddedGold %d id %u Name %s ", GetGold(), amount, GetPlayerID(), GetName());
  362. LogManager::instance().CharLog(this, GetGold() + amount, "OVERFLOW_GOLD", "");
  363. return;
  364. }
  365.  
  366. // 청소년보호
  367. if (LC_IsNewCIBN() && amount > 0)
  368. {
  369. if (IsOverTime(OT_NONE))
  370. {
  371. dev_log(LOG_DEB0, "<GOLD_LOG> %s = NONE", GetName());
  372. }
  373. else if (IsOverTime(OT_3HOUR))
  374. {
  375. amount = (amount / 2);
  376. dev_log(LOG_DEB0, "<GOLD_LOG> %s = 3HOUR", GetName());
  377. }
  378. else if (IsOverTime(OT_5HOUR))
  379. {
  380. amount = 0;
  381. dev_log(LOG_DEB0, "<GOLD_LOG> %s = 5HOUR", GetName());
  382. }
  383. }
  384.  
  385. SetGold(GetGold() + amount);
  386. val = GetGold();
  387. }
  388. break;
  389.  
  390. case POINT_SKILL:
  391. case POINT_STAT:
  392. case POINT_SUB_SKILL:
  393. case POINT_STAT_RESET_COUNT:
  394. case POINT_HORSE_SKILL:
  395. SetPoint(type, GetPoint(type) + amount);
  396. val = GetPoint(type);
  397.  
  398. SetRealPoint(type, val);
  399. break;
  400.  
  401. case POINT_DEF_GRADE:
  402. SetPoint(type, GetPoint(type) + amount);
  403. val = GetPoint(type);
  404.  
  405. PointChange(POINT_CLIENT_DEF_GRADE, amount);
  406. break;
  407.  
  408. case POINT_CLIENT_DEF_GRADE:
  409. SetPoint(type, GetPoint(type) + amount);
  410. val = GetPoint(type);
  411. break;
  412.  
  413. case POINT_ST:
  414. case POINT_HT:
  415. case POINT_DX:
  416. case POINT_IQ:
  417. case POINT_HP_REGEN:
  418. case POINT_SP_REGEN:
  419. case POINT_ATT_SPEED:
  420. case POINT_ATT_GRADE:
  421. case POINT_MOV_SPEED:
  422. case POINT_CASTING_SPEED:
  423. case POINT_MAGIC_ATT_GRADE:
  424. case POINT_MAGIC_DEF_GRADE:
  425. case POINT_BOW_DISTANCE:
  426. case POINT_HP_RECOVERY:
  427. case POINT_SP_RECOVERY:
  428.  
  429. case POINT_ATTBONUS_HUMAN: // 42 인간에게 강함
  430. case POINT_ATTBONUS_ANIMAL: // 43 동물에게 데미지 % 증가
  431. case POINT_ATTBONUS_ORC: // 44 웅귀에게 데미지 % 증가
  432. case POINT_ATTBONUS_MILGYO: // 45 밀교에게 데미지 % 증가
  433. case POINT_ATTBONUS_UNDEAD: // 46 시체에게 데미지 % 증가
  434. case POINT_ATTBONUS_DEVIL: // 47 마귀(악마)에게 데미지 % 증가
  435.  
  436. case POINT_ATTBONUS_MONSTER:
  437. case POINT_ATTBONUS_SURA:
  438. case POINT_ATTBONUS_ASSASSIN:
  439. case POINT_ATTBONUS_WARRIOR:
  440. case POINT_ATTBONUS_SHAMAN:
  441.  
  442. case POINT_POISON_PCT:
  443. case POINT_STUN_PCT:
  444. case POINT_SLOW_PCT:
  445.  
  446. case POINT_BLOCK:
  447. case POINT_DODGE:
  448.  
  449. case POINT_CRITICAL_PCT:
  450. case POINT_RESIST_CRITICAL:
  451. case POINT_PENETRATE_PCT:
  452. case POINT_RESIST_PENETRATE:
  453. case POINT_CURSE_PCT:
  454.  
  455. case POINT_STEAL_HP: // 48 생명력 흡수
  456. case POINT_STEAL_SP: // 49 정신력 흡수
  457.  
  458. case POINT_MANA_BURN_PCT: // 50 마나 번
  459. case POINT_DAMAGE_SP_RECOVER: // 51 공격당할 시 정신력 회복 확률
  460. case POINT_RESIST_NORMAL_DAMAGE:
  461. case POINT_RESIST_SWORD:
  462. case POINT_RESIST_TWOHAND:
  463. case POINT_RESIST_DAGGER:
  464. case POINT_RESIST_BELL:
  465. case POINT_RESIST_FAN:
  466. case POINT_RESIST_BOW:
  467. case POINT_RESIST_FIRE:
  468. case POINT_RESIST_ELEC:
  469. case POINT_RESIST_MAGIC:
  470. case POINT_RESIST_WIND:
  471. case POINT_RESIST_ICE:
  472. case POINT_RESIST_EARTH:
  473. case POINT_RESIST_DARK:
  474. case POINT_REFLECT_MELEE: // 67 공격 반사
  475. case POINT_REFLECT_CURSE: // 68 저주 반사
  476. case POINT_POISON_REDUCE: // 69 독데미지 감소
  477. case POINT_KILL_SP_RECOVER: // 70 적 소멸시 MP 회복
  478. case POINT_KILL_HP_RECOVERY: // 75
  479. case POINT_HIT_HP_RECOVERY:
  480. case POINT_HIT_SP_RECOVERY:
  481. case POINT_MANASHIELD:
  482. case POINT_ATT_BONUS:
  483. case POINT_DEF_BONUS:
  484. case POINT_SKILL_DAMAGE_BONUS:
  485. case POINT_NORMAL_HIT_DAMAGE_BONUS:
  486.  
  487. // DEPEND_BONUS_ATTRIBUTES
  488. case POINT_SKILL_DEFEND_BONUS:
  489. case POINT_NORMAL_HIT_DEFEND_BONUS:
  490. SetPoint(type, GetPoint(type) + amount);
  491. val = GetPoint(type);
  492. break;
  493. // END_OF_DEPEND_BONUS_ATTRIBUTES
  494.  
  495. case POINT_PARTY_ATTACKER_BONUS:
  496. case POINT_PARTY_TANKER_BONUS:
  497. case POINT_PARTY_BUFFER_BONUS:
  498. case POINT_PARTY_SKILL_MASTER_BONUS:
  499. case POINT_PARTY_HASTE_BONUS:
  500. case POINT_PARTY_DEFENDER_BONUS:
  501.  
  502. case POINT_RESIST_WARRIOR :
  503. case POINT_RESIST_ASSASSIN :
  504. case POINT_RESIST_SURA :
  505. case POINT_RESIST_SHAMAN :
  506.  
  507. SetPoint(type, GetPoint(type) + amount);
  508. val = GetPoint(type);
  509. break;
  510.  
  511. case POINT_MALL_ATTBONUS:
  512. case POINT_MALL_DEFBONUS:
  513. case POINT_MALL_EXPBONUS:
  514. case POINT_MALL_ITEMBONUS:
  515. case POINT_MALL_GOLDBONUS:
  516. case POINT_MELEE_MAGIC_ATT_BONUS_PER:
  517. if (GetPoint(type) + amount > 100)
  518. {
  519. sys_err("MALL_BONUS exceeded over 100!! point type: %d name: %s amount %d", type, GetName(), amount);
  520. amount = 100 - GetPoint(type);
  521. }
  522.  
  523. SetPoint(type, GetPoint(type) + amount);
  524. val = GetPoint(type);
  525. break;
  526.  
  527. // PC_BANG_ITEM_ADD
  528. case POINT_PC_BANG_EXP_BONUS :
  529. case POINT_PC_BANG_DROP_BONUS :
  530. case POINT_RAMADAN_CANDY_BONUS_EXP:
  531. SetPoint(type, amount);
  532. val = GetPoint(type);
  533. break;
  534. // END_PC_BANG_ITEM_ADD
  535.  
  536. case POINT_EXP_DOUBLE_BONUS: // 71
  537. case POINT_GOLD_DOUBLE_BONUS: // 72
  538. case POINT_ITEM_DROP_BONUS: // 73
  539. case POINT_POTION_BONUS: // 74
  540. if (GetPoint(type) + amount > 100)
  541. {
  542. sys_err("BONUS exceeded over 100!! point type: %d name: %s amount %d", type, GetName(), amount);
  543. amount = 100 - GetPoint(type);
  544. }
  545.  
  546. SetPoint(type, GetPoint(type) + amount);
  547. val = GetPoint(type);
  548. break;
  549.  
  550. case POINT_IMMUNE_STUN: // 76
  551. SetPoint(type, GetPoint(type) + amount);
  552. val = GetPoint(type);
  553. if (val)
  554. {
  555. SET_BIT(m_pointsInstant.dwImmuneFlag, IMMUNE_STUN);
  556. }
  557. else
  558. {
  559. REMOVE_BIT(m_pointsInstant.dwImmuneFlag, IMMUNE_STUN);
  560. }
  561. break;
  562.  
  563. case POINT_IMMUNE_SLOW: // 77
  564. SetPoint(type, GetPoint(type) + amount);
  565. val = GetPoint(type);
  566. if (val)
  567. {
  568. SET_BIT(m_pointsInstant.dwImmuneFlag, IMMUNE_SLOW);
  569. }
  570. else
  571. {
  572. REMOVE_BIT(m_pointsInstant.dwImmuneFlag, IMMUNE_SLOW);
  573. }
  574. break;
  575.  
  576. case POINT_IMMUNE_FALL: // 78
  577. SetPoint(type, GetPoint(type) + amount);
  578. val = GetPoint(type);
  579. if (val)
  580. {
  581. SET_BIT(m_pointsInstant.dwImmuneFlag, IMMUNE_FALL);
  582. }
  583. else
  584. {
  585. REMOVE_BIT(m_pointsInstant.dwImmuneFlag, IMMUNE_FALL);
  586. }
  587. break;
  588.  
  589. case POINT_ATT_GRADE_BONUS:
  590. SetPoint(type, GetPoint(type) + amount);
  591. PointChange(POINT_ATT_GRADE, amount);
  592. val = GetPoint(type);
  593. break;
  594.  
  595. case POINT_DEF_GRADE_BONUS:
  596. SetPoint(type, GetPoint(type) + amount);
  597. PointChange(POINT_DEF_GRADE, amount);
  598. val = GetPoint(type);
  599. break;
  600.  
  601. case POINT_MAGIC_ATT_GRADE_BONUS:
  602. SetPoint(type, GetPoint(type) + amount);
  603. PointChange(POINT_MAGIC_ATT_GRADE, amount);
  604. val = GetPoint(type);
  605. break;
  606.  
  607. case POINT_MAGIC_DEF_GRADE_BONUS:
  608. SetPoint(type, GetPoint(type) + amount);
  609. PointChange(POINT_MAGIC_DEF_GRADE, amount);
  610. val = GetPoint(type);
  611. break;
  612.  
  613. case POINT_VOICE:
  614. case POINT_EMPIRE_POINT:
  615. //sys_err("CHARACTER::PointChange: %s: point cannot be changed. use SetPoint instead (type: %d)", GetName(), type);
  616. val = GetRealPoint(type);
  617. break;
  618.  
  619. case POINT_POLYMORPH:
  620. SetPoint(type, GetPoint(type) + amount);
  621. val = GetPoint(type);
  622. SetPolymorph(val);
  623. break;
  624.  
  625. case POINT_MOUNT:
  626. SetPoint(type, GetPoint(type) + amount);
  627. val = GetPoint(type);
  628. MountVnum(val);
  629. break;
  630.  
  631. case POINT_ENERGY:
  632. case POINT_COSTUME_ATTR_BONUS:
  633. {
  634. int old_val = GetPoint(type);
  635. SetPoint(type, old_val + amount);
  636. val = GetPoint(type);
  637. BuffOnAttr_ValueChange(type, old_val, val);
  638. }
  639. break;
  640.  
  641. default:
  642. sys_err("CHARACTER::PointChange: %s: unknown point change type %d", GetName(), type);
  643. return;
  644. }
  645.  
  646. switch (type)
  647. {
  648. case POINT_LEVEL:
  649. case POINT_ST:
  650. case POINT_DX:
  651. case POINT_IQ:
  652. case POINT_HT:
  653. ComputeBattlePoints();
  654. break;
  655. case POINT_MAX_HP:
  656. case POINT_MAX_SP:
  657. case POINT_MAX_STAMINA:
  658. break;
  659. }
  660.  
  661. if (type == POINT_HP && amount == 0)
  662. return;
  663.  
  664. if (GetDesc())
  665. {
  666. struct packet_point_change pack;
  667.  
  668. pack.header = HEADER_GC_CHARACTER_POINT_CHANGE;
  669. pack.dwVID = m_vid;
  670. pack.type = type;
  671. pack.value = val;
  672.  
  673. if (bAmount)
  674. pack.amount = amount;
  675. else
  676. pack.amount = 0;
  677.  
  678. if (!bBroadcast)
  679. GetDesc()->Packet(&pack, sizeof(struct packet_point_change));
  680. else
  681. PacketAround(&pack, sizeof(pack));
  682. }
  683. }
Advertisement
Add Comment
Please, Sign In to add comment