109 lines
3.0 KiB
Ucode
109 lines
3.0 KiB
Ucode
Class Ext_PerkRhythmPerkBase extends Ext_PerkBase;
|
|
|
|
var byte HeadShotComboCount,MaxRhythmCombo;
|
|
var float RhythmComboDmg;
|
|
var private const float HeadShotCountdownIntervall;
|
|
|
|
simulated function ModifyDamageGiven(out int InDamage, optional Actor DamageCauser, optional KFPawn_Monster MyKFPM, optional KFPlayerController DamageInstigator, optional class<KFDamageType> DamageType, optional int HitZoneIdx)
|
|
{
|
|
Super.ModifyDamageGiven(InDamage,DamageCauser,MyKFPM,DamageInstigator,DamageType,HitZoneIdx);
|
|
if (RhythmComboDmg>0 && BasePerk==None || (DamageType!=None && DamageType.Default.ModifierPerkList.Find(BasePerk)>=0) || IsWeaponOnPerk(KFWeapon(DamageCauser)))
|
|
InDamage *= (1.f+RhythmComboDmg);
|
|
}
|
|
|
|
final function SetMaxRhythm(byte MaxCombo)
|
|
{
|
|
MaxRhythmCombo = MaxCombo;
|
|
}
|
|
|
|
final function ResetRhythm()
|
|
{
|
|
MaxRhythmCombo = 0;
|
|
HeadShotComboCount = 0;
|
|
RhythmComboDmg = 0;
|
|
HeadShotMessage(0,true,1);
|
|
}
|
|
|
|
function SubstractHeadShotCombo()
|
|
{
|
|
if (HeadShotComboCount > 0)
|
|
UpdateDmgScale(false);
|
|
else
|
|
ClearTimer(nameOf(SubstractHeadShotCombo));
|
|
}
|
|
|
|
final function UpdateDmgScale(bool bUp)
|
|
{
|
|
if (bUp)
|
|
{
|
|
HeadShotComboCount = Min(HeadShotComboCount+1,MaxRhythmCombo);
|
|
HeadShotMessage(HeadShotComboCount,false,MaxRhythmCombo);
|
|
SetTimer(HeadShotCountdownIntervall, true, nameOf(SubstractHeadShotCombo));
|
|
}
|
|
else if (HeadShotComboCount>0)
|
|
{
|
|
--HeadShotComboCount;
|
|
HeadShotMessage(HeadShotComboCount,true,MaxRhythmCombo);
|
|
}
|
|
else return;
|
|
RhythmComboDmg = HeadShotComboCount*0.075;
|
|
}
|
|
|
|
function UpdatePerkHeadShots(ImpactInfo Impact, class<DamageType> DamageType, int NumHit)
|
|
{
|
|
local int HitZoneIdx;
|
|
local KFPawn_Monster KFPM;
|
|
|
|
if (MaxRhythmCombo<=0)
|
|
return;
|
|
KFPM = KFPawn_Monster(Impact.HitActor);
|
|
if (KFPM==none || KFPM.GetTeamNum()==0)
|
|
return;
|
|
|
|
HitZoneIdx = KFPM.HitZones.Find('ZoneName', Impact.HitInfo.BoneName);
|
|
if (HitZoneIdx == HZI_Head && KFPM.IsAliveAndWell())
|
|
{
|
|
if (class<KFDamageType>(DamageType)!=None && (class<KFDamageType>(DamageType).Default.ModifierPerkList.Find(BasePerk)>=0))
|
|
UpdateDmgScale(true);
|
|
}
|
|
}
|
|
|
|
reliable client function HeadShotMessage(byte HeadShotNum, bool bMissed, byte MaxHits)
|
|
{
|
|
local AkEvent TempAkEvent;
|
|
local KFPlayerController PC;
|
|
|
|
PC = KFPlayerController(PlayerOwner);
|
|
if (PC==none || PC.MyGFxHUD==none)
|
|
{
|
|
return;
|
|
}
|
|
|
|
PC.MyGFxHUD.RhythmCounterWidget.SetInt("count", HeadShotNum);
|
|
PC.MyGFxHUD.RhythmCounterWidget.SetBonusPercentage(float(HeadShotNum) / float(MaxHits));
|
|
|
|
if (HeadshotNum==0)
|
|
TempAkEvent = AkEvent'WW_UI_PlayerCharacter.Play_R_Method_Reset';
|
|
else if (HeadShotNum<MaxHits)
|
|
{
|
|
if (!bMissed)
|
|
{
|
|
//PC.ClientSpawnCameraLensEffect(class'KFCameraLensEmit_RackemHeadShot');
|
|
TempAkEvent = AkEvent'WW_UI_PlayerCharacter.Play_R_Method_Hit';
|
|
}
|
|
}
|
|
else if (!bMissed)
|
|
{
|
|
//PC.ClientSpawnCameraLensEffect(class'KFCameraLensEmit_RackemHeadShotPing');
|
|
TempAkEvent = AkEvent'WW_UI_PlayerCharacter.Play_R_Method_Top';
|
|
HeadshotNum = 6;
|
|
}
|
|
|
|
if (TempAkEvent != none)
|
|
PC.PlayRMEffect(TempAkEvent, 'R_Method', HeadshotNum);
|
|
}
|
|
|
|
defaultproperties
|
|
{
|
|
HeadShotCountdownIntervall=2.f
|
|
} |