Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so just use oauth login instead. :)
Paste
Pasted as C# by ownly ( 3 years ago )
module LetThereBeBlood
@wrapMethod(DamageManager)
public final static func PostProcess(hitEvent: ref<gameHitEvent>) -> Void
{
let puppet: ref<NPCPuppet>;
let puppetPos: Vector4;
let npcType: gamedataNPCType;
let splatterTransform: WorldTransform;
let orientation: EulerAngles = new EulerAngles(0.00, 0.00, 0.00);
let splatterResource: FxResource;
let spawnPos: Vector4;
let tempAngle = 0.00;
let impactHeft = 0.00;
let temp = 0.00;
let tempX = 0.00;
let tempY = 0.00;
let tempZ = 0.00;
let rec: ref<Attack_GameEffect_Record>;
let splatterSpawns: Float;
let maxHealth = 1.00;
let damage = 1.00;
let attackType: gamedataAttackType;
if IsDefined(hitEvent) && IsDefined(hitEvent.attackData) {
puppet = hitEvent.target as NPCPuppet;
npcType = puppet.GetRecord().CharacterType().Type();
if !(Equals(npcType, gamedataNPCType.Android) || Equals(npcType, gamedataNPCType.Drone) || Equals(npcType, gamedataNPCType.Mech) || AIActionHelper.CheckAbility(puppet, TweakDBInterface.GetGameplayAbilityRecord(t"Ability.IsMechanical")))
{
damage = hitEvent.attackComputed.GetAttackValue(gamedataDamageType.Physical);
rec = hitEvent.attackData.GetAttackDefinition().GetRecord() as Attack_GameEffect_Record;
if Equals(rec.AttackTag(), n"Bleeding")
{
if RandF() < 0.33
{
splatterResource = puppet.GetFxResourceByKey(n"ragdollWallSplatter");
puppetPos = puppet.GetWorldPosition();
spawnPos = puppetPos + new Vector4(RandRangeF(-0.10,0.10), RandRangeF(-0.10,0.10), 0.20, 0.00);
WorldTransform.SetPosition(splatterTransform, spawnPos);
orientation = new EulerAngles(0.00,0.00,0.00);
WorldTransform.SetOrientationEuler(splatterTransform, orientation);
GameInstance.GetFxSystem(puppet.GetGame()).SpawnEffect(splatterResource, splatterTransform, true);
}
}
else if damage > 0.00 && !Equals(rec.AttackTag(), n"Bleeding")
{
attackType = hitEvent.attackData.GetAttackType();
maxHealth = GameInstance.GetStatsSystem(hitEvent.target.GetGame()).GetStatValue(Cast<StatsObjectID>(hitEvent.target.GetEntityID()), gamedataStatType.Health);
splatterSpawns = MinF(7.50,7.00*damage/maxHealth+RandF()*0.50);
if !ScriptedPuppet.IsAlive(puppet)
{
splatterSpawns = 1.00;
//liteversion?: splatterSpawns = RandRangeF(-0.50, 0.50)
}
if Equals(attackType, gamedataAttackType.Melee) || Equals(attackType, gamedataAttackType.QuickMelee)
{
splatterSpawns *= 2.25;
}
else if Equals(attackType, gamedataAttackType.StrongMelee)
{
splatterSpawns *= 3.00;
}
//Log(ToString(damage)+" damage, HP: "+ToString(GameInstance.GetStatPoolsSystem(hitEvent.target.GetGame()).GetStatPoolValue(Cast<StatsObjectID>(hitEvent.target.GetEntityID()), gamedataStatPoolType.Health, false)) +" / "+ToString(maxHealth)+" - alive: "+ToString(ScriptedPuppet.IsAlive(puppet))+" splatters: "+ToString(splatterSpawns));
splatterResource = puppet.GetFxResourceByKey(n"ragdollWallSplatter");
// puppet.GetFxResourceByKey(n"deviceLinkDefault")
puppetPos = puppet.GetWorldPosition();
let playerrot: EulerAngles = Vector4.ToRotation(Quaternion.GetForward(hitEvent.attackData.GetInstigator().GetWorldOrientation()));
Log(ToString(playerrot));
tempAngle = 360.00-Vector4.Heading(hitEvent.hitDirection); // fixing that 270° equals east
Log(ToString(tempAngle));
tempX = SinF((tempAngle/360.00+0.00)*2.00*Pi())*1.20;
tempY = SinF((tempAngle/360.00+0.75)*2.00*Pi())*-1.20; // north is positive
orientation = Vector4.ToRotation(hitEvent.hitDirection);
if AttackData.IsMelee(hitEvent.attackData.GetAttackType()) {
temp = PowF(RandRangeF(0.01,1.10),0.6); // high chance to use my custom values
Log(ToString((hitEvent.attackData.GetAttackDefinition().GetRecord() as Attack_Melee_Record).AttackDirection().Direction().Type()));
Log(ToString(temp));
switch (hitEvent.attackData.GetAttackDefinition().GetRecord() as Attack_Melee_Record).AttackDirection().Direction().Type() {
case gamedataMeleeAttackDirection.Center:
orientation.Pitch = orientation.Pitch*(1.00-temp) + RandRangeF(-45.00,45.00)*temp;
break;
case gamedataMeleeAttackDirection.DownToUp:
orientation.Pitch = orientation.Pitch*(1.00-temp) + RandRangeF(80.00,110.00)*temp;
tempZ = 1.25; //if the pitch is low, it uses puppetPos anyway which this doesn't affect
break;
case gamedataMeleeAttackDirection.UpToDown:
orientation.Pitch = orientation.Pitch*(1.00-temp) + RandRangeF(-20.00,20.00)*temp;
break;
case gamedataMeleeAttackDirection.LeftDownToRightUp:
orientation.Pitch = orientation.Pitch*(1.00-temp) + RandRangeF(90.00,110.00)*temp;
tempZ = 1.25;
break;
case gamedataMeleeAttackDirection.RightDownToLeftUp:
orientation.Pitch = orientation.Pitch*(1.00-temp) + RandRangeF(90.00,110.00)*temp;
tempZ = 1.25;
break;
case gamedataMeleeAttackDirection.LeftToRight:
orientation.Pitch = orientation.Pitch*(1.00-temp) + RandRangeF(50.00,90.00)*temp;
tempZ = 0.80;
break;
case gamedataMeleeAttackDirection.RightToLeft:
orientation.Pitch = orientation.Pitch*(1.00-temp) + RandRangeF(50.00,90.00)*temp;
tempZ = 0.80;
break;
case gamedataMeleeAttackDirection.LeftUpToRightDown:
orientation.Pitch = orientation.Pitch*(1.00-temp) + RandRangeF(20.00,45.00)*temp;
break;
case gamedataMeleeAttackDirection.RightUpToLeftDown:
orientation.Pitch = orientation.Pitch*(1.00-temp) + RandRangeF(20.00,45.00)*temp;
break;
}
}
tempAngle = RandRangeF(0.20,1.15);
orientation.Pitch *= tempAngle;
tempZ = MaxF(hitEvent.hitPosition.Z, puppetPos.Z + tempZ)-hitEvent.hitPosition.Z; //adding this to hitposition.Z
tempZ *= tempAngle;
Log(ToString(orientation));
temp = MinF(1.00,AbsF(orientation.Pitch)/90.00); // is this a wall splatter?
impactHeft = RandRangeF(-0.60,0.80);
if impactHeft < 0.00
{
//orientation.Yaw = orientation.Yaw + 180.00;
orientation.Pitch *= -1.00;
tempX *= -1.00;
tempY *= -1.00;
impactHeft = AbsF(impactHeft);
}
if orientation.Pitch > 45.00
{
impactHeft = PowF(impactHeft,0.4);
}
else
{
impactHeft = PowF(impactHeft,0.7);
}
Log(ToString(orientation));
spawnPos =
(
(hitEvent.hitPosition + new Vector4(0.00, 0.00, tempZ, 0.00))*new Vector4(0.50, 0.50, temp, 0.50)
+ puppetPos * new Vector4(0.50, 0.50, 1.00-temp, 0.50)
)
+ new Vector4(impactHeft*tempX+RandRangeF(-0.10,0.10), impactHeft*tempY+RandRangeF(-0.10,0.10), 0.00, 0.00);
Log(ToString(hitEvent.hitPosition));
Log(ToString(puppetPos));
Log(ToString(spawnPos));
Log(ToString(tempAngle));
WorldTransform.SetPosition(splatterTransform, spawnPos);
WorldTransform.SetOrientationEuler(splatterTransform, orientation);
GameInstance.GetFxSystem(puppet.GetGame()).SpawnEffect(splatterResource, splatterTransform, true);
GameInstance.GetFxSystem(puppet.GetGame()).SpawnEffect(puppet.GetFxResourceByKey(n"deviceLinkDefault"), splatterTransform, true);
if hitEvent.attackData.HasFlag(hitFlag.Nonlethal) || Equals(hitEvent.attackData.GetAttackType(), gamedataAttackType.Hack)
{
}
else
{
if RandF() < splatterSpawns/5.00
{
//1x additional ground splatter
spawnPos = hitEvent.hitPosition + new Vector4(RandRangeF(-0.50,0.50), RandRangeF(-0.50,0.50), 0.02, 0.00);
WorldTransform.SetPosition(splatterTransform, spawnPos);
orientation = new EulerAngles(0.00,0.00,0.00);
WorldTransform.SetOrientationEuler(splatterTransform, orientation);
GameInstance.GetFxSystem(puppet.GetGame()).SpawnEffect(splatterResource, splatterTransform, true);
}
//surrounding splatters
while (splatterSpawns > 0.00)
{
tempAngle = 360.00 - Vector4.Heading(hitEvent.hitDirection) + RandRangeF(-405.00, 405.00); // 1/3 higher chance in cone behind enemy
orientation = new EulerAngles(90.00+RandRangeF(-10.00, 10.00),360.00-tempAngle,0.00);
WorldTransform.SetOrientationEuler(splatterTransform, orientation);
tempX = SinF((tempAngle/360.00+0.00)*2.00*Pi())*1.10;
tempY = SinF((tempAngle/360.00+0.75)*2.00*Pi())*-1.10;
spawnPos = hitEvent.hitPosition + new Vector4(RandRangeF(tempX*0.10,tempX),RandRangeF(tempY*0.10,tempY),RandRangeF(0.10, 0.40),0.00);
WorldTransform.SetPosition(splatterTransform, spawnPos);
GameInstance.GetFxSystem(puppet.GetGame()).SpawnEffect(splatterResource, splatterTransform, true);
//Log(ToString(hitEvent.hitPosition)+" "+ToString(Vector4.Heading(hitEvent.hitDirection))+" "+ToString(spawnPos)+" "+ToString(orientation));
splatterSpawns -=1.00;
}
}
}
}
}
wrappedMethod(hitEvent);
}
Revise this Paste
Parent: 124511
Children: 124518