所以我使用的是AzerothCore,我最近刚安装了一个just,它可以工作,但是不能正常工作,我不得不手动安装just,因为时间的变化和代码的改变,尽管现在。
我的问题是,即使我达到一定的速度后获得0.00,它太快&过程不起作用,例如:暗影哀悼武器效果.
有时候,我打了80次公关游戏,在50到80,我想问你们,它有可能锁定到一定数量的攻击计数吗?无论是近战还是远程,由于声音的故障,有时声音会消失,直到我停止攻击,这与我测试过的任何匆忙模式都不一样,无论是实时服务器还是测试服务器……
Hastemod是这样的:
PLAYER.CPP
hasteMod = 2.9;
/* hastemod
if (haveOffhandWeapon())
if (getAttackTimer(OFF_ATTACK) < ATTACK_DISPLAY_DELAY)
setAttackTimer(OFF_ATTACK, ATTACK_DISPLAY_DELAY);
*/
/* hastemod
if (getAttackTimer(BASE_ATTACK) < ATTACK_DISPLAY_DELAY)
setAttackTimer(BASE_ATTACK, ATTACK_DISPLAY_DELAY);
*/
// hastemod begins
void Player::SetAttackTime(WeaponAttackType att, uint32 val) {
switch(att) {
case BASE_ATTACK:
ApplyHasteMod(m_baseRatingValue[CR_HASTE_MELEE],BASE_ATTACK,CR_HASTE_MELEE, val);
break;
case OFF_ATTACK:
ApplyHasteMod(m_baseRatingValue[CR_HASTE_MELEE],OFF_ATTACK,CR_HASTE_MELEE, val);
break;
case RANGED_ATTACK:
ApplyHasteMod(m_baseRatingValue[CR_HASTE_RANGED],RANGED_ATTACK,CR_HASTE_RANGED, val);
break;
default:
SetFloatValue(UNIT_FIELD_BASEATTACKTIME+att,val*m_modAttackSpeedPct[att]);
}
}
void Player::ApplyHasteMod(int16 val, uint32 att, CombatRating cr, float speed) {
float atkSpd = speed * (( 100.0f - ((val / 32.789989f) * hasteMod) ) / 100.0f );
if (atkSpd < 0) atkSpd = 0;
SetFloatValue(UNIT_FIELD_BASEATTACKTIME+att, atkSpd);
}
// hastemod ends
void Player::ApplyRatingMod(CombatRating cr, int32 value, bool apply)
{
m_baseRatingValue[cr]+=(apply ? value : -value);
// explicit affected values
switch (cr)
{
case CR_HASTE_MELEE:
{
Item * mainhand = m_items[EQUIPMENT_SLOT_MAINHAND];
Item * offhand = m_items[EQUIPMENT_SLOT_OFFHAND];
float speed1 = mainhand ? (float)mainhand->GetTemplate()->Delay : 2000.0f;
float speed2 = offhand ? (float)offhand->GetTemplate()->Delay : 2000.0f;
ApplyHasteMod(m_baseRatingValue[cr], BASE_ATTACK, cr, speed1);
ApplyHasteMod(m_baseRatingValue[cr], OFF_ATTACK, cr, speed2);
float RatingChange = value / value;
(RatingChange = 0) ? ApplyPercentModFloatVar(m_modAttackSpeedPct[BASE_ATTACK], RatingChange, !apply) : ApplyPercentModFloatVar(m_modAttackSpeedPct[BASE_ATTACK], -RatingChange, apply);
(RatingChange = 0) ? ApplyPercentModFloatVar(m_modAttackSpeedPct[OFF_ATTACK], RatingChange, !apply) : ApplyPercentModFloatVar(m_modAttackSpeedPct[OFF_ATTACK], -RatingChange, apply);
break;
}
case CR_HASTE_RANGED:
{
Item * ranged = m_items[EQUIPMENT_SLOT_RANGED];
float speed = ranged ? (float)ranged->GetTemplate()->Delay : 2000.0f;
ApplyHasteMod(m_baseRatingValue[cr], RANGED_ATTACK, cr, speed);
float RatingChange = value / value;
(RatingChange = 0) ? ApplyPercentModFloatVar(m_modAttackSpeedPct[RANGED_ATTACK], RatingChange, !apply) : ApplyPercentModFloatVar(m_modAttackSpeedPct[RANGED_ATTACK], -RatingChange, apply);
break;
}
case CR_HASTE_SPELL:
{
ApplyHasteMod(m_baseRatingValue[cr], CR_HASTE_SPELL-1, cr, 1.0f);
break;
}
default:
PLAYER.H
float hasteMod;
public:
float GetHasteMod() const { return hasteMod; }
void SetHasteMod(float val) { hasteMod = val; }
void ApplyHasteMod(int16 val, uint32 att, CombatRating cr, float speed);
void SetAttackTime(WeaponAttackType att, uint32 val);
STATSYSTEM.CPP
void Player::CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float& min_damage, float& max_damage)
{
UnitMods unitMod;
Item *Weapon = NULL;
switch (attType)
{
case BASE_ATTACK:
default:
Weapon = m_items[EQUIPMENT_SLOT_MAINHAND];
unitMod = UNIT_MOD_DAMAGE_MAINHAND;
break;
case OFF_ATTACK:
Weapon = m_items[EQUIPMENT_SLOT_OFFHAND];
unitMod = UNIT_MOD_DAMAGE_OFFHAND;
break;
case RANGED_ATTACK:
Weapon = m_items[EQUIPMENT_SLOT_RANGED];
unitMod = UNIT_MOD_DAMAGE_RANGED;
break;
}
float wep_speed =(!Weapon) ? 2200.00f : Weapon->GetTemplate()->Delay;
float base_value = GetModifierValue(unitMod, BASE_VALUE) + GetTotalAttackPowerValue(attType)/ 14.0f (wep_speed/1000.00f);
float att_speed = GetAPMultiplier(attType,normalized);
float base_pct = GetModifierValue(unitMod, BASE_PCT);
float total_value = GetModifierValue(unitMod, TOTAL_VALUE);
float total_pct = addTotalPct ? GetModifierValue(unitMod, TOTAL_PCT) : 1.0f;
float weapon_mindamage = GetWeaponDamageRange(attType, MINDAMAGE);
float weapon_maxdamage = GetWeaponDamageRange(attType, MAXDAMAGE);
if (lvl > 60)
lvl = 60;
weapon_mindamage = lvl*3.0f*wep_speed/1000;
weapon_maxdamage = lvl*5.0f*wep_speed/1000;
}
else if (!CanUseAttackType(attType)) //check if player not in form but still can't use (disarm case)
{如果你们以前听过或看到过这样的事情,知道该怎么做,我会很高兴的,我花了3天时间,想办法弄清楚.我知道这是有可能的,只是不知道怎么做,或者这个哈斯脱德是否有可能。
发布于 2020-01-06 09:56:10
您应该避免修改主核心的文件(例如Player.cpp、Player.h等)。但是为您的自定义更改创建一个真正的(单独的)模块:
http://www.azerothcore.org/wiki/Create-a-Module
如果您需要实现新的挂钩,那么您应该发送一个PR到主回购。因此,您的核心代码库将始终是干净的(没有自定义更改)。
https://stackoverflow.com/questions/59604357
复制相似问题