ExBuffData::ExBuffData(WORD SkillNo, WORD StateNo, WORD forcedLvl, bool bTimed, BuffType aType, exId cId) { UnitAny* pPlayer = D2Funcs.D2CLIENT_GetPlayer(); D2EXASSERT(pPlayer, "%s: UnitAny* not found!", __FUNCTION__) SkillId = SkillNo; StateId = StateNo; SkillLvl = forcedLvl; bTimed = bTimed; SkillLen = 0; SkillExpire = 0; this->aType = aType; controlId = cId; if (SkillId) { if (!forcedLvl) { Skill* pSkill = D2Funcs.D2COMMON_GetSkillById(pPlayer, SkillId, -1); if (pSkill) SkillLvl = D2Funcs.D2COMMON_GetSkillLevel(pPlayer, pSkill, 1); } SkillsTxt *pTxt = &(*D2Vars.D2COMMON_sgptDataTables)->pSkillsTxt[SkillId]; if (pTxt) { SkillLen = isTimed ? (D2Funcs.D2COMMON_EvaluateSkill(pPlayer, pTxt->dwAuraLenCalc, SkillId, SkillLvl) / 25) * 1000 : 0; SkillExpire = GetTickCount() + SkillLen; } } }
ExBuffData::ExBuffData(WORD SkillNo, WORD StateNo, WORD forcedLvl, bool bTimed, BuffType aType) { UnitAny* pPlayer = D2Funcs.D2CLIENT_GetPlayer(); D2EXASSERT(pPlayer, "%s: UnitAny* not found!", __FUNCTION__) SkillId = SkillNo; StateId = StateNo; SkillLvl = forcedLvl; bTimed = bTimed; SkillLen = 0; SkillExpire = 0; this->aType = aType; if (SkillId) { if (!forcedLvl) { Skill* pSkill = D2Funcs.D2COMMON_GetSkillById(pPlayer, SkillId, -1); if (pSkill) SkillLvl = D2Funcs.D2COMMON_GetSkillLevel(pPlayer, pSkill, 1); } SkillsTxt *pTxt = &(*D2Vars.D2COMMON_sgptDataTables)->pSkillsTxt[SkillId]; if (!pTxt) { isTimed = false; D2EXINFO("Unknown Skill Id %d. Check your Skills.Txt", SkillId) } else {
void ExBuffData::update(WORD forcedLvl) { if (SkillId) { UnitAny* pPlayer = D2Funcs.D2CLIENT_GetPlayer(); D2EXASSERT(pPlayer, "%s: UnitAny* not found!", __FUNCTION__) SkillLvl = forcedLvl; if (!forcedLvl) { Skill* pSkill = D2Funcs.D2COMMON_GetSkillById(pPlayer, SkillId, -1); if (pSkill) SkillLvl = D2Funcs.D2COMMON_GetSkillLevel(pPlayer, pSkill, 1); } if (!SkillLvl) return; SkillsTxt *pTxt = &(*D2Vars.D2COMMON_sgptDataTables)->pSkillsTxt[SkillId]; if (pTxt) { SkillLen = isTimed ? (D2Funcs.D2COMMON_EvaluateSkill(pPlayer, pTxt->dwAuraLenCalc, SkillId, SkillLvl) / 25) * 1000 : 0; SkillExpire = GetTickCount() + SkillLen; } } }
BOOL __fastcall ExBuffs::OnSetState(BYTE* aPacket) { if (BuffsEnabled) { p0xa8 *pSetState = (p0xa8*)aPacket; UnitAny* pPlayer = D2Funcs.D2CLIENT_GetPlayer(); D2EXASSERT(pPlayer, "Failed to get Player Unit"); int UnitType = pSetState->UnitType; int UnitID = pSetState->UnitId; if (UnitType != UNIT_PLAYER || UnitID != pPlayer->dwUnitId) { return D2Funcs.D2CLIENT_SetState_I(aPacket); } BYTE StateNo = pSetState->StateNo; exId newid = exnull_t; buff_it buff = FindByStateId(StateNo); if (buff != gBuffs.end()) newid = buff->controlId; switch (StateNo) { case 51: //BC,155 { Skill* pSkill = D2Funcs.D2COMMON_GetSkillById(pPlayer, 155, -1); int lvl = pSkill ? D2Funcs.D2COMMON_GetSkillLevel(pPlayer, pSkill, 1) : BCLvl ? BCLvl : 12; buff_it bo = FindByStateId(32); if (!pSkill && bo != gBuffs.end()) // Try to guess BC lvl by BO lvl { if (ExParty::IsInPartyWithClass(pPlayer, PLAYER_BARBARIAN)) { lvl = bo->SkillLvl - 19; //cause any sane barb put only 1 point in BC } else { lvl = bo->SkillLvl; } } if (buff != gBuffs.end()) { buff->update(lvl); break; } else { newid = gExGUI->add(new ExBuff(gBuffs.size(), ExBuffStateToDC6(StateNo), BUFF_GOOD)); gBuffs.emplace_back(ExBuffData(155, StateNo, lvl, true, BUFF_GOOD, newid)); } } break; case 32: //BO,149 { int val = GetStateStatValue(77, pSetState->Data, pSetState->PacketLen); if (buff != gBuffs.end()) { buff->update(GetSkillLvlByStat(149, 77, val)); break; } else { newid = gExGUI->add(new ExBuff(gBuffs.size(), ExBuffStateToDC6(StateNo), BUFF_GOOD)); gBuffs.emplace_back(ExBuffData(149, StateNo, GetSkillLvlByStat(149, 77, val), true, BUFF_GOOD, newid)); } } break; case 26: //SHOUT,138 { int val = GetStateStatValue(171, pSetState->Data, pSetState->PacketLen); if (buff != gBuffs.end()) { buff->update(GetSkillLvlByStat(138, 171, val)); break; } else { newid = gExGUI->add(new ExBuff(gBuffs.size(), ExBuffStateToDC6(StateNo), BUFF_GOOD)); gBuffs.emplace_back(ExBuffData(138, StateNo, GetSkillLvlByStat(138, 171, val), true, BUFF_GOOD, newid)); } } break; case 9: //AMP, 66 { if (buff != gBuffs.end()) { buff->update(AmpLvl ? AmpLvl : 40); break; } else { newid = gExGUI->add(new ExBuff(gBuffs.size(), ExBuffStateToDC6(StateNo), BUFF_BAD)); gBuffs.emplace_back(ExBuffData(66, StateNo, AmpLvl ? AmpLvl : 40, true, BUFF_BAD, newid)); } } break; case 61: //LR, 91 { int val = GetStateStatValue(39, pSetState->Data, pSetState->PacketLen); if (buff != gBuffs.end()) { buff->update(GetSkillLvlByStat(91, 39, val)); break; } else { newid = gExGUI->add(new ExBuff(gBuffs.size(), ExBuffStateToDC6(StateNo), BUFF_BAD)); gBuffs.emplace_back(ExBuffData(91, StateNo, GetSkillLvlByStat(91, 39, val), true, BUFF_BAD, newid)); } } break; case 16: //ENCH, 52 { int val = GetStateStatValue(119, pSetState->Data, pSetState->PacketLen); if (buff != gBuffs.end()) buff->update(GetSkillLvlByStat(52, 119, val)); else { newid = gExGUI->add(new ExBuff(gBuffs.size(), ExBuffStateToDC6(StateNo), BUFF_GOOD)); gBuffs.emplace_back(ExBuffData(52, StateNo, GetSkillLvlByStat(52, 119, val), true, BUFF_GOOD, newid)); } } break; case 87: //SM, 17 { if (buff != gBuffs.end()) buff->update(SMLvl ? SMLvl : 12); else { newid = gExGUI->add(new ExBuff(gBuffs.size(), ExBuffStateToDC6(StateNo), BUFF_BAD)); gBuffs.emplace_back(ExBuffData(17, StateNo, SMLvl ? SMLvl : 12, true, BUFF_BAD, newid)); } } break; case 101: //HOLYSHIELD, 117 { if (buff != gBuffs.end()) buff->update(0); else { newid = gExGUI->add(new ExBuff(gBuffs.size(), ExBuffStateToDC6(StateNo), BUFF_GOOD)); gBuffs.emplace_back(ExBuffData(117, StateNo, 0, true, BUFF_GOOD, newid)); } } break; case 157: //BOS, 258 { if (buff != gBuffs.end()) { buff->update(0); } else { newid = gExGUI->add(new ExBuff(gBuffs.size(), ExBuffStateToDC6(StateNo), BUFF_GOOD)); gBuffs.emplace_back(ExBuffData(258, StateNo, 0, true, BUFF_GOOD, newid)); } } break; case 159: //FADE, 267 { if (buff != gBuffs.end()) { buff->update(0); } else { newid = gExGUI->add(new ExBuff(gBuffs.size(), ExBuffStateToDC6(StateNo), BUFF_GOOD)); gBuffs.emplace_back(ExBuffData(267, StateNo, 0, true, BUFF_GOOD, newid)); } } break; case 30: //ES, 58 { if (buff == gBuffs.end()) { newid = gExGUI->add(new ExBuff(gBuffs.size(), ExBuffStateToDC6(StateNo), BUFF_GOOD)); gBuffs.emplace_back(ExBuffData(58, StateNo, 0, true, BUFF_GOOD, newid)); } else buff->update(0); } break; case 38: //TS, 57 { if (buff != gBuffs.end()) { buff->update(0); } else { newid = gExGUI->add(new ExBuff(gBuffs.size(), ExBuffStateToDC6(StateNo), BUFF_GOOD)), gBuffs.emplace_back(ExBuffData(57, StateNo, 0, true, BUFF_GOOD, newid)); } } break; case 144: //HURRI, 250 { if (buff != gBuffs.end()) { buff->update(0); break; } else { newid = gExGUI->add(new ExBuff(gBuffs.size(), ExBuffStateToDC6(StateNo), BUFF_GOOD)); gBuffs.emplace_back(ExBuffData(250, StateNo, 0, false, BUFF_GOOD, newid)); } } break; case STATE_CONVICTION: //CONV case STATE_HOLYWINDCOLD: //HF { if (buff == gBuffs.end()) { newid = gExGUI->add(new ExBuff(gBuffs.size(), ExBuffStateToDC6(StateNo), BUFF_BAD)); gBuffs.emplace_back(ExBuffData(0, StateNo, 0, false, BUFF_BAD, newid)); } } break; case STATE_RESISTALL: //SALV case STATE_CLEANSING: //CLEANSING case STATE_STAMINA: //VIGOR case STATE_CONCENTRATION: //CONC case STATE_FANATICISM: //FANA case STATE_MEDITATION: //MEDI case STATE_MIGHT: //MIGHT case STATE_OAKSAGE: //OAK { if (buff == gBuffs.end()) { newid = gExGUI->add(new ExBuff(gBuffs.size(), ExBuffStateToDC6(StateNo), BUFF_AURA)); gBuffs.emplace_back(ExBuffData(0, StateNo, 0, false, BUFF_AURA, newid)); } } break; } buff = FindByStateId(StateNo); if (newid != exnull_t && buff != gBuffs.end() && buff->SkillLvl) { gExGUI->setText(newid, boost::lexical_cast<wstring>(buff->SkillLvl)); } } return D2Funcs.D2CLIENT_SetState_I(aPacket); }