Welcome, guest! Login / Register - Why register?
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
Your Name: Code Language: