Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void CHARACTER::PointChange(BYTE type, unsigned long long amount, bool bAmount, bool bBroadcast)
- {
- unsigned long long val = 0;
- //sys_log(0, "PointChange %d %d | %d -> %d cHP %d mHP %d", type, amount, GetPoint(type), GetPoint(type)+amount, GetHP(), GetMaxHP());
- switch (type)
- {
- case POINT_NONE:
- return;
- case POINT_LEVEL:
- if ((GetLevel() + amount) > gPlayerMaxLevel)
- return;
- SetLevel(GetLevel() + amount);
- val = GetLevel();
- sys_log(0, "LEVELUP: %s %d NEXT EXP %d", GetName(), GetLevel(), GetNextExp());
- PointChange(POINT_NEXT_EXP, GetNextExp(), false);
- if (amount)
- {
- quest::CQuestManager::instance().LevelUp(GetPlayerID());
- LogManager::instance().LevelLog(this, val, GetRealPoint(POINT_PLAYTIME) + (get_dword_time() - m_dwPlayStartTime) / 60000);
- if (GetGuild())
- {
- GetGuild()->LevelChange(GetPlayerID(), GetLevel());
- }
- if (GetParty())
- {
- GetParty()->RequestSetMemberLevel(GetPlayerID(), GetLevel());
- }
- }
- break;
- case POINT_NEXT_EXP:
- val = GetNextExp();
- bAmount = false; // 무조건 bAmount는 false 여야 한다.
- break;
- case POINT_EXP:
- {
- DWORD exp = GetExp();
- DWORD next_exp = GetNextExp();
- // 청소년보호
- if (LC_IsNewCIBN())
- {
- if (IsOverTime(OT_NONE))
- {
- dev_log(LOG_DEB0, "<EXP_LOG> %s = NONE", GetName());
- }
- else if (IsOverTime(OT_3HOUR))
- {
- amount = (amount / 2);
- dev_log(LOG_DEB0, "<EXP_LOG> %s = 3HOUR", GetName());
- }
- else if (IsOverTime(OT_5HOUR))
- {
- amount = 0;
- dev_log(LOG_DEB0, "<EXP_LOG> %s = 5HOUR", GetName());
- }
- }
- // exp가 0 이하로 가지 않도록 한다
- if (amount < 0 && exp < -amount)
- {
- sys_log(1, "%s AMOUNT < 0 %d, CUR EXP: %d", GetName(), -amount, exp);
- amount = -exp;
- SetExp(exp + amount);
- val = GetExp();
- }
- else
- {
- if (gPlayerMaxLevel <= GetLevel())
- return;
- if (block_exp)
- {
- return;
- }
- if (test_server)
- ChatPacket(CHAT_TYPE_INFO, "You have gained %d exp.", amount);
- DWORD iExpBalance = 0;
- // 레벨 업!
- if (exp + amount >= next_exp)
- {
- iExpBalance = (exp + amount) - next_exp;
- amount = next_exp - exp;
- SetExp(0);
- exp = next_exp;
- }
- else
- {
- SetExp(exp + amount);
- exp = GetExp();
- }
- DWORD q = DWORD(next_exp / 4.0f);
- int iLevStep = GetRealPoint(POINT_LEVEL_STEP);
- // iLevStep이 4 이상이면 레벨이 올랐어야 하므로 여기에 올 수 없는 값이다.
- if (iLevStep >= 4)
- {
- sys_err("%s LEVEL_STEP bigger than 4! (%d)", GetName(), iLevStep);
- iLevStep = 4;
- }
- if (exp >= next_exp && iLevStep < 4)
- {
- for (int i = 0; i < 4 - iLevStep; ++i)
- PointChange(POINT_LEVEL_STEP, 1, false, true);
- }
- else if (exp >= q * 3 && iLevStep < 3)
- {
- for (int i = 0; i < 3 - iLevStep; ++i)
- PointChange(POINT_LEVEL_STEP, 1, false, true);
- }
- else if (exp >= q * 2 && iLevStep < 2)
- {
- for (int i = 0; i < 2 - iLevStep; ++i)
- PointChange(POINT_LEVEL_STEP, 1, false, true);
- }
- else if (exp >= q && iLevStep < 1)
- PointChange(POINT_LEVEL_STEP, 1);
- if (iExpBalance)
- {
- PointChange(POINT_EXP, iExpBalance);
- }
- val = GetExp();
- }
- {
- DWORD dwPID;
- LPCHARACTER ch = CHARACTER_MANAGER::instance().FindByPID(dwPID);
- if (ch->GetMapIndex() == 73 || ch->GetMapIndex() == 72) {
- if(ch->GetLevel() >= 95) {
- ChatPacket(CHAT_TYPE_INFO, "<Blokada>Masz za duzy poziom aby zdobywac tu doswiadczenie!");
- return;
- }
- }
- }
- {
- DWORD dwPID;
- LPCHARACTER ch = CHARACTER_MANAGER::instance().FindByPID(dwPID);
- if (ch->GetMapIndex() == 217) {
- if(ch->GetLevel() >= 110) {
- ChatPacket(CHAT_TYPE_INFO, "<Blokada>Masz za duzy poziom aby zdobywac tu doswiadczenie!");
- return;
- }
- }
- }
- {
- DWORD dwPID;
- LPCHARACTER ch = CHARACTER_MANAGER::instance().FindByPID(dwPID);
- if (ch->GetMapIndex() == 218) {
- if(ch->GetLevel() >= 125) {
- ChatPacket(CHAT_TYPE_INFO, "<Blokada>Masz za duzy poziom aby zdobywac tu doswiadczenie!");
- return;
- }
- }
- }
- {
- DWORD dwPID;
- LPCHARACTER ch = CHARACTER_MANAGER::instance().FindByPID(dwPID);
- if (ch->GetMapIndex() == 215) {
- if(ch->GetLevel() >= 140) {
- ChatPacket(CHAT_TYPE_INFO, "<Blokada>Masz za duzy poziom aby zdobywac tu doswiadczenie!");
- return;
- }
- }
- }
- {
- DWORD dwPID;
- LPCHARACTER ch = CHARACTER_MANAGER::instance().FindByPID(dwPID);
- if (ch->GetMapIndex() == 216) {
- if(ch->GetLevel() >= 150) {
- ChatPacket(CHAT_TYPE_INFO, "<Blokada>Masz za duzy poziom aby zdobywac tu doswiadczenie!");
- return;
- }
- }
- }
- }
- break;
- case POINT_LEVEL_STEP:
- if (amount > 0)
- {
- val = GetPoint(POINT_LEVEL_STEP) + amount;
- switch (val)
- {
- case 1:
- case 2:
- case 3:
- //if (GetLevel() < 100) PointChange(POINT_STAT, 1);
- if (GetLevel() < 220) PointChange(POINT_STAT, 1);
- break;
- case 4:
- {
- int iHP = number(JobInitialPoints[GetJob()].hp_per_lv_begin, JobInitialPoints[GetJob()].hp_per_lv_end);
- int iSP = number(JobInitialPoints[GetJob()].sp_per_lv_begin, JobInitialPoints[GetJob()].sp_per_lv_end);
- m_points.iRandomHP += iHP;
- m_points.iRandomSP += iSP;
- if (GetSkillGroup())
- {
- if (GetLevel() >= 5)
- PointChange(POINT_SKILL, 1);
- if (GetLevel() >= 9)
- PointChange(POINT_SUB_SKILL, 1);
- }
- PointChange(POINT_MAX_HP, iHP);
- PointChange(POINT_MAX_SP, iSP);
- PointChange(POINT_LEVEL, 1, false, true);
- val = 0;
- }
- break;
- }
- PointChange(POINT_HP, GetMaxHP() - GetHP());
- PointChange(POINT_SP, GetMaxSP() - GetSP());
- PointChange(POINT_STAMINA, GetMaxStamina() - GetStamina());
- SetPoint(POINT_LEVEL_STEP, val);
- SetRealPoint(POINT_LEVEL_STEP, val);
- Save();
- }
- else
- val = GetPoint(POINT_LEVEL_STEP);
- break;
- case POINT_HP:
- {
- if (IsDead() || IsStun())
- return;
- int prev_hp = GetHP();
- amount = MIN(GetMaxHP() - GetHP(), amount);
- SetHP(GetHP() + amount);
- val = GetHP();
- BroadcastTargetPacket();
- if (GetParty() && IsPC() && val != prev_hp)
- GetParty()->SendPartyInfoOneToAll(this);
- }
- break;
- case POINT_SP:
- {
- if (IsDead() || IsStun())
- return;
- amount = MIN(GetMaxSP() - GetSP(), amount);
- SetSP(GetSP() + amount);
- val = GetSP();
- }
- break;
- case POINT_STAMINA:
- {
- if (IsDead() || IsStun())
- return;
- int prev_val = GetStamina();
- amount = MIN(GetMaxStamina() - GetStamina(), amount);
- SetStamina(GetStamina() + amount);
- val = GetStamina();
- if (val == 0)
- {
- // Stamina가 없으니 걷자!
- SetNowWalking(true);
- }
- else if (prev_val == 0)
- {
- // 없던 스테미나가 생겼으니 이전 모드 복귀
- ResetWalking();
- }
- if (amount < 0 && val != 0) // 감소는 보내지않는다.
- return;
- }
- break;
- case POINT_MAX_HP:
- {
- SetPoint(type, GetPoint(type) + amount);
- int curMaxHP = GetMaxHP();
- int hp = GetRealPoint(POINT_MAX_HP);
- int add_hp = MIN(3500, hp * GetPoint(POINT_MAX_HP_PCT) / 100);
- add_hp += GetPoint(POINT_MAX_HP);
- add_hp += GetPoint(POINT_PARTY_TANKER_BONUS);
- SetMaxHP(hp + add_hp);
- float fRatio = (float)GetMaxHP() / (float)curMaxHP;
- PointChange(POINT_HP, GetHP() * fRatio - GetHP());
- val = GetMaxHP();
- }
- break;
- case POINT_MAX_SP:
- {
- SetPoint(type, GetPoint(type) + amount);
- int curMaxSP = GetMaxSP();
- int sp = GetRealPoint(POINT_MAX_SP);
- int add_sp = MIN(800, sp * GetPoint(POINT_MAX_SP_PCT) / 100);
- add_sp += GetPoint(POINT_MAX_SP);
- add_sp += GetPoint(POINT_PARTY_SKILL_MASTER_BONUS);
- SetMaxSP(sp + add_sp);
- float fRatio = (float)GetMaxSP() / (float)curMaxSP;
- PointChange(POINT_SP, GetSP() * fRatio - GetSP());
- val = GetMaxSP();
- }
- break;
- case POINT_MAX_HP_PCT:
- SetPoint(type, GetPoint(type) + amount);
- val = GetPoint(type);
- PointChange(POINT_MAX_HP, 0);
- break;
- case POINT_MAX_SP_PCT:
- SetPoint(type, GetPoint(type) + amount);
- val = GetPoint(type);
- PointChange(POINT_MAX_SP, 0);
- break;
- case POINT_MAX_STAMINA:
- SetMaxStamina(GetMaxStamina() + amount);
- val = GetMaxStamina();
- break;
- case POINT_GOLD:
- {
- const unsigned long long nTotalMoney = static_cast<unsigned long long>(GetGold()) + static_cast<unsigned long long>(amount);
- if (GOLD_MAX <= nTotalMoney)
- {
- sys_err("[OVERFLOW_GOLD] OriGold %d AddedGold %d id %u Name %s ", GetGold(), amount, GetPlayerID(), GetName());
- LogManager::instance().CharLog(this, GetGold() + amount, "OVERFLOW_GOLD", "");
- return;
- }
- // 청소년보호
- if (LC_IsNewCIBN() && amount > 0)
- {
- if (IsOverTime(OT_NONE))
- {
- dev_log(LOG_DEB0, "<GOLD_LOG> %s = NONE", GetName());
- }
- else if (IsOverTime(OT_3HOUR))
- {
- amount = (amount / 2);
- dev_log(LOG_DEB0, "<GOLD_LOG> %s = 3HOUR", GetName());
- }
- else if (IsOverTime(OT_5HOUR))
- {
- amount = 0;
- dev_log(LOG_DEB0, "<GOLD_LOG> %s = 5HOUR", GetName());
- }
- }
- SetGold(GetGold() + amount);
- val = GetGold();
- }
- break;
- case POINT_SKILL:
- case POINT_STAT:
- case POINT_SUB_SKILL:
- case POINT_STAT_RESET_COUNT:
- case POINT_HORSE_SKILL:
- SetPoint(type, GetPoint(type) + amount);
- val = GetPoint(type);
- SetRealPoint(type, val);
- break;
- case POINT_DEF_GRADE:
- SetPoint(type, GetPoint(type) + amount);
- val = GetPoint(type);
- PointChange(POINT_CLIENT_DEF_GRADE, amount);
- break;
- case POINT_CLIENT_DEF_GRADE:
- SetPoint(type, GetPoint(type) + amount);
- val = GetPoint(type);
- break;
- case POINT_ST:
- case POINT_HT:
- case POINT_DX:
- case POINT_IQ:
- case POINT_HP_REGEN:
- case POINT_SP_REGEN:
- case POINT_ATT_SPEED:
- case POINT_ATT_GRADE:
- case POINT_MOV_SPEED:
- case POINT_CASTING_SPEED:
- case POINT_MAGIC_ATT_GRADE:
- case POINT_MAGIC_DEF_GRADE:
- case POINT_BOW_DISTANCE:
- case POINT_HP_RECOVERY:
- case POINT_SP_RECOVERY:
- case POINT_ATTBONUS_HUMAN: // 42 인간에게 강함
- case POINT_ATTBONUS_ANIMAL: // 43 동물에게 데미지 % 증가
- case POINT_ATTBONUS_ORC: // 44 웅귀에게 데미지 % 증가
- case POINT_ATTBONUS_MILGYO: // 45 밀교에게 데미지 % 증가
- case POINT_ATTBONUS_UNDEAD: // 46 시체에게 데미지 % 증가
- case POINT_ATTBONUS_DEVIL: // 47 마귀(악마)에게 데미지 % 증가
- case POINT_ATTBONUS_MONSTER:
- case POINT_ATTBONUS_SURA:
- case POINT_ATTBONUS_ASSASSIN:
- case POINT_ATTBONUS_WARRIOR:
- case POINT_ATTBONUS_SHAMAN:
- case POINT_POISON_PCT:
- case POINT_STUN_PCT:
- case POINT_SLOW_PCT:
- case POINT_BLOCK:
- case POINT_DODGE:
- case POINT_CRITICAL_PCT:
- case POINT_RESIST_CRITICAL:
- case POINT_PENETRATE_PCT:
- case POINT_RESIST_PENETRATE:
- case POINT_CURSE_PCT:
- case POINT_STEAL_HP: // 48 생명력 흡수
- case POINT_STEAL_SP: // 49 정신력 흡수
- case POINT_MANA_BURN_PCT: // 50 마나 번
- case POINT_DAMAGE_SP_RECOVER: // 51 공격당할 시 정신력 회복 확률
- case POINT_RESIST_NORMAL_DAMAGE:
- case POINT_RESIST_SWORD:
- case POINT_RESIST_TWOHAND:
- case POINT_RESIST_DAGGER:
- case POINT_RESIST_BELL:
- case POINT_RESIST_FAN:
- case POINT_RESIST_BOW:
- case POINT_RESIST_FIRE:
- case POINT_RESIST_ELEC:
- case POINT_RESIST_MAGIC:
- case POINT_RESIST_WIND:
- case POINT_RESIST_ICE:
- case POINT_RESIST_EARTH:
- case POINT_RESIST_DARK:
- case POINT_REFLECT_MELEE: // 67 공격 반사
- case POINT_REFLECT_CURSE: // 68 저주 반사
- case POINT_POISON_REDUCE: // 69 독데미지 감소
- case POINT_KILL_SP_RECOVER: // 70 적 소멸시 MP 회복
- case POINT_KILL_HP_RECOVERY: // 75
- case POINT_HIT_HP_RECOVERY:
- case POINT_HIT_SP_RECOVERY:
- case POINT_MANASHIELD:
- case POINT_ATT_BONUS:
- case POINT_DEF_BONUS:
- case POINT_SKILL_DAMAGE_BONUS:
- case POINT_NORMAL_HIT_DAMAGE_BONUS:
- // DEPEND_BONUS_ATTRIBUTES
- case POINT_SKILL_DEFEND_BONUS:
- case POINT_NORMAL_HIT_DEFEND_BONUS:
- SetPoint(type, GetPoint(type) + amount);
- val = GetPoint(type);
- break;
- // END_OF_DEPEND_BONUS_ATTRIBUTES
- case POINT_PARTY_ATTACKER_BONUS:
- case POINT_PARTY_TANKER_BONUS:
- case POINT_PARTY_BUFFER_BONUS:
- case POINT_PARTY_SKILL_MASTER_BONUS:
- case POINT_PARTY_HASTE_BONUS:
- case POINT_PARTY_DEFENDER_BONUS:
- case POINT_RESIST_WARRIOR :
- case POINT_RESIST_ASSASSIN :
- case POINT_RESIST_SURA :
- case POINT_RESIST_SHAMAN :
- SetPoint(type, GetPoint(type) + amount);
- val = GetPoint(type);
- break;
- case POINT_MALL_ATTBONUS:
- case POINT_MALL_DEFBONUS:
- case POINT_MALL_EXPBONUS:
- case POINT_MALL_ITEMBONUS:
- case POINT_MALL_GOLDBONUS:
- case POINT_MELEE_MAGIC_ATT_BONUS_PER:
- if (GetPoint(type) + amount > 100)
- {
- sys_err("MALL_BONUS exceeded over 100!! point type: %d name: %s amount %d", type, GetName(), amount);
- amount = 100 - GetPoint(type);
- }
- SetPoint(type, GetPoint(type) + amount);
- val = GetPoint(type);
- break;
- // PC_BANG_ITEM_ADD
- case POINT_PC_BANG_EXP_BONUS :
- case POINT_PC_BANG_DROP_BONUS :
- case POINT_RAMADAN_CANDY_BONUS_EXP:
- SetPoint(type, amount);
- val = GetPoint(type);
- break;
- // END_PC_BANG_ITEM_ADD
- case POINT_EXP_DOUBLE_BONUS: // 71
- case POINT_GOLD_DOUBLE_BONUS: // 72
- case POINT_ITEM_DROP_BONUS: // 73
- case POINT_POTION_BONUS: // 74
- if (GetPoint(type) + amount > 100)
- {
- sys_err("BONUS exceeded over 100!! point type: %d name: %s amount %d", type, GetName(), amount);
- amount = 100 - GetPoint(type);
- }
- SetPoint(type, GetPoint(type) + amount);
- val = GetPoint(type);
- break;
- case POINT_IMMUNE_STUN: // 76
- SetPoint(type, GetPoint(type) + amount);
- val = GetPoint(type);
- if (val)
- {
- SET_BIT(m_pointsInstant.dwImmuneFlag, IMMUNE_STUN);
- }
- else
- {
- REMOVE_BIT(m_pointsInstant.dwImmuneFlag, IMMUNE_STUN);
- }
- break;
- case POINT_IMMUNE_SLOW: // 77
- SetPoint(type, GetPoint(type) + amount);
- val = GetPoint(type);
- if (val)
- {
- SET_BIT(m_pointsInstant.dwImmuneFlag, IMMUNE_SLOW);
- }
- else
- {
- REMOVE_BIT(m_pointsInstant.dwImmuneFlag, IMMUNE_SLOW);
- }
- break;
- case POINT_IMMUNE_FALL: // 78
- SetPoint(type, GetPoint(type) + amount);
- val = GetPoint(type);
- if (val)
- {
- SET_BIT(m_pointsInstant.dwImmuneFlag, IMMUNE_FALL);
- }
- else
- {
- REMOVE_BIT(m_pointsInstant.dwImmuneFlag, IMMUNE_FALL);
- }
- break;
- case POINT_ATT_GRADE_BONUS:
- SetPoint(type, GetPoint(type) + amount);
- PointChange(POINT_ATT_GRADE, amount);
- val = GetPoint(type);
- break;
- case POINT_DEF_GRADE_BONUS:
- SetPoint(type, GetPoint(type) + amount);
- PointChange(POINT_DEF_GRADE, amount);
- val = GetPoint(type);
- break;
- case POINT_MAGIC_ATT_GRADE_BONUS:
- SetPoint(type, GetPoint(type) + amount);
- PointChange(POINT_MAGIC_ATT_GRADE, amount);
- val = GetPoint(type);
- break;
- case POINT_MAGIC_DEF_GRADE_BONUS:
- SetPoint(type, GetPoint(type) + amount);
- PointChange(POINT_MAGIC_DEF_GRADE, amount);
- val = GetPoint(type);
- break;
- case POINT_VOICE:
- case POINT_EMPIRE_POINT:
- //sys_err("CHARACTER::PointChange: %s: point cannot be changed. use SetPoint instead (type: %d)", GetName(), type);
- val = GetRealPoint(type);
- break;
- case POINT_POLYMORPH:
- SetPoint(type, GetPoint(type) + amount);
- val = GetPoint(type);
- SetPolymorph(val);
- break;
- case POINT_MOUNT:
- SetPoint(type, GetPoint(type) + amount);
- val = GetPoint(type);
- MountVnum(val);
- break;
- case POINT_ENERGY:
- case POINT_COSTUME_ATTR_BONUS:
- {
- int old_val = GetPoint(type);
- SetPoint(type, old_val + amount);
- val = GetPoint(type);
- BuffOnAttr_ValueChange(type, old_val, val);
- }
- break;
- default:
- sys_err("CHARACTER::PointChange: %s: unknown point change type %d", GetName(), type);
- return;
- }
- switch (type)
- {
- case POINT_LEVEL:
- case POINT_ST:
- case POINT_DX:
- case POINT_IQ:
- case POINT_HT:
- ComputeBattlePoints();
- break;
- case POINT_MAX_HP:
- case POINT_MAX_SP:
- case POINT_MAX_STAMINA:
- break;
- }
- if (type == POINT_HP && amount == 0)
- return;
- if (GetDesc())
- {
- struct packet_point_change pack;
- pack.header = HEADER_GC_CHARACTER_POINT_CHANGE;
- pack.dwVID = m_vid;
- pack.type = type;
- pack.value = val;
- if (bAmount)
- pack.amount = amount;
- else
- pack.amount = 0;
- if (!bBroadcast)
- GetDesc()->Packet(&pack, sizeof(struct packet_point_change));
- else
- PacketAround(&pack, sizeof(pack));
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment