Prepare fixtures

This commit is contained in:
dkanus 2026-07-14 20:27:09 +07:00
commit 9c94356263
6021 changed files with 722805 additions and 22 deletions

View file

@ -0,0 +1,99 @@
//BasicExplosion as part of the GoodKarma package
//Build 1 Beta 4.5 Release
//By: Jonathan Zepp
//A basic explosion
class BasicExplosion extends Emitter;
//#exec OBJ LOAD FILE="..\Textures\ExplosionTex.utx"
//#exec OBJ LOAD FILE="..\Textures\AW-2004Particles.utx"
defaultproperties
{
Begin Object Class=SpriteEmitter Name=SpriteEmitter0
UseColorScale=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
BlendBetweenSubdivisions=True
Acceleration=(Z=100.000000)
ColorScale(0)=(Color=(B=16,G=16,R=16))
ColorScale(1)=(RelativeTime=0.200000,Color=(A=192))
ColorScale(2)=(RelativeTime=0.800000,Color=(A=96))
ColorScale(3)=(RelativeTime=1.000000)
AddLocationFromOtherEmitter=2
StartLocationShape=PTLS_Polar
StartLocationPolarRange=(X=(Max=65536.000000),Y=(Min=16384.000000,Max=16384.000000),Z=(Min=2.000000,Max=2.000000))
StartSpinRange=(X=(Max=1.000000))
SizeScale(0)=(RelativeSize=0.100000)
SizeScale(1)=(RelativeTime=1.000000,RelativeSize=0.200000)
InitialParticlesPerSecond=500.000000
DrawStyle=PTDS_AlphaBlend
Texture=none//Texture'ExplosionTex.Framed.exp2_frames' KFTODO: Replace this
TextureUSubdivisions=4
TextureVSubdivisions=4
LifetimeRange=(Min=0.700000,Max=0.700000)
StartVelocityRadialRange=(Min=-600.000000,Max=-600.000000)
VelocityLossRange=(X=(Min=5.000000,Max=5.000000),Y=(Min=5.000000,Max=5.000000),Z=(Min=3.000000,Max=3.000000))
AddVelocityFromOtherEmitter=2
GetVelocityDirectionFrom=PTVD_AddRadial
End Object
Emitters(0)=SpriteEmitter'GoodKarma.BasicExplosion.SpriteEmitter0'
Begin Object Class=SpriteEmitter Name=SpriteEmitter1
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
BlendBetweenSubdivisions=True
MaxParticles=4
StartLocationShape=PTLS_Polar
SphereRadiusRange=(Min=8.000000,Max=8.000000)
StartLocationPolarRange=(X=(Max=65536.000000),Y=(Min=16384.000000,Max=16384.000000),Z=(Min=2.000000,Max=2.000000))
StartSpinRange=(X=(Max=1.000000))
SizeScale(0)=(RelativeSize=0.040000)
SizeScale(1)=(RelativeTime=0.500000,RelativeSize=0.100000)
SizeScale(2)=(RelativeTime=1.000000,RelativeSize=0.150000)
InitialParticlesPerSecond=500.000000
Texture=none//Texture'ExplosionTex.Framed.we1_frames' KFTODO: Replace this
TextureUSubdivisions=4
TextureVSubdivisions=4
LifetimeRange=(Min=0.600000,Max=0.600000)
StartVelocityRadialRange=(Min=-500.000000,Max=-500.000000)
VelocityLossRange=(X=(Min=2.000000,Max=2.000000),Y=(Min=2.000000,Max=2.000000),Z=(Min=2.000000,Max=2.000000))
GetVelocityDirectionFrom=PTVD_AddRadial
End Object
Emitters(1)=SpriteEmitter'GoodKarma.BasicExplosion.SpriteEmitter1'
Begin Object Class=SpriteEmitter Name=SpriteEmitter2
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
BlendBetweenSubdivisions=True
StartLocationRange=(Z=(Max=50.000000))
StartLocationShape=PTLS_Sphere
SphereRadiusRange=(Min=16.000000,Max=48.000000)
StartSpinRange=(X=(Max=1.000000))
SizeScale(0)=(RelativeSize=0.150000)
SizeScale(1)=(RelativeTime=1.000000,RelativeSize=0.350000)
StartSizeRange=(X=(Min=50.000000))
InitialParticlesPerSecond=5000.000000
Texture=none//Texture'ExplosionTex.Framed.exp1_frames' KFTODO: Replace this
TextureUSubdivisions=2
TextureVSubdivisions=4
LifetimeRange=(Min=0.500000,Max=0.500000)
InitialDelayRange=(Min=0.100000,Max=0.100000)
End Object
Emitters(2)=SpriteEmitter'GoodKarma.BasicExplosion.SpriteEmitter2'
AutoDestroy=True
bNoDelete=False
}

View file

@ -0,0 +1,15 @@
//DamTypeBigPush as part of the GoodKarma package
//Build 1 Beta 4.5 Release
//By: Jonathan Zepp
//A provided damage type for easy use in UnrealEd
class DamTypeBigPush extends DamTypeKick
abstract;
defaultproperties
{
bExtraMomentumZ=False
GibModifier=1.800000
GibPerterbation=1.300000
KDamageImpulse=5000.000000
}

View file

@ -0,0 +1,17 @@
//DamTypeBludgeon as part of the GoodKarma package
//Build 1 Beta 4.5 Release
//By: Jonathan Zepp
//Basic DamageType for any NetKActor
class DamTypeBludgeon extends DamageType
abstract;
defaultproperties
{
DeathString="%o was Bludgeoned to death."
FemaleSuicide="%o beat herself to a pulp."
MaleSuicide="%o beat himself to a pulp."
bExtraMomentumZ=False
GibModifier=1.500000
GibPerterbation=0.650000
}

View file

@ -0,0 +1,15 @@
//DamTypeHugePush as part of the GoodKarma package
//Build 1 Beta 4.5 Release
//By: Jonathan Zepp
//A provided damage type for easy use in UnrealEd
class DamTypeHugePush extends DamTypeKick
abstract;
defaultproperties
{
bExtraMomentumZ=False
GibModifier=2.500000
GibPerterbation=2.000000
KDamageImpulse=10000.000000
}

View file

@ -0,0 +1,16 @@
//DamTypeKick as part of the GoodKarma package
//Build 3b Beta 4.5 Release
//By: Jonathan Zepp
//Basic DamageType for any NetKActor
class DamTypeKick extends DamageType
abstract;
defaultproperties
{
DeathString="%o was kicked to death."
FemaleSuicide="%o kicked herself to a unconsious."
MaleSuicide="%o kicked himself unconsious."
GibPerterbation=0.650000
KDamageImpulse=2550.000000
}

View file

@ -0,0 +1,14 @@
//DamTypeMedPush as part of the GoodKarma package
//Build 1 Beta 4.5 Release
//By: Jonathan Zepp
//A provided damage type for easy use in UnrealEd
class DamTypeMedPush extends DamTypeKick
abstract;
defaultproperties
{
bExtraMomentumZ=False
GibPerterbation=0.700000
KDamageImpulse=2500.000000
}

View file

@ -0,0 +1,17 @@
//DamTypeMegaGib as part of the GoodKarma package
//Build 1 Beta 4.5 Release
//By: Jonathan Zepp
//Basic DamageType for various fans and gory blenders.
class DamTypeMegaGib extends DamageType
abstract;
defaultproperties
{
DeathString="%o was sliced and diced."
FemaleSuicide="%o blenderized herself."
MaleSuicide="%o blenderized himself."
bExtraMomentumZ=False
GibModifier=6.000000
GibPerterbation=1.400000
}

View file

@ -0,0 +1,16 @@
//DamTypePunt as part of the GoodKarma package
//Build 1 Beta 4.5 Release
//By: Jonathan Zepp
class DamTypePunt extends DamageType
abstract;
defaultproperties
{
DeathString="%o was punted to death."
FemaleSuicide="%o punted herself to a unconsious."
MaleSuicide="%o punted himself unconsious."
GibModifier=1.300000
GibPerterbation=1.000000
KDamageImpulse=5000.000000
}

View file

@ -0,0 +1,16 @@
//DamTypeSmallPush as part of the GoodKarma package
//Build 1 Beta 4.5 Release
//By: Jonathan Zepp
//A provided damage type for easy use in UnrealEd
class DamTypeSmallPush extends DamTypeKick
abstract;
defaultproperties
{
bNeverSevers=True
bExtraMomentumZ=False
GibModifier=0.500000
GibPerterbation=0.200000
KDamageImpulse=1400.000000
}

View file

@ -0,0 +1,45 @@
//GKDeathMonitor as part of the GoodKarma package
//Build 4 Beta 4.5 Release
//By: Jonathan Zepp
class GKDeathMonitor extends Actor
placeable;
var() name GoodKarmaActorTag ;
var() byte mode ; //1 for triggers all the time when dead, 0 for triggers once when it first dies
var Actor deathMonitor, temp ;
var class<Actor> GKActor ;
var class<damageType> killDamType ;
var bool wasDead ;
function tick(float DeltaTime)
{
if(deathMonitor != none)
{
if((NetKActor(deathMonitor)).bDead)
{
if(mode == 0 && !wasDead)
TriggerEvent(Event, none, none) ;
else if(mode ==1)
TriggerEvent(Event, none, none) ;
wasDead = true ;
}
else
wasDead = false ;
}
}
function PostBeginPlay()
{
forEach AllActors(GKActor, temp, GoodKarmaActorTag)
deathMonitor = temp ;
}
defaultproperties
{
GKActor=Class'GoodKarma.NetKActor'
bHidden=True
Texture=Texture'GKTextures.ActorSprites.GKDeathMonitor'
DrawScale=1.500000
}

View file

@ -0,0 +1,39 @@
//GKDestroyer as part of the GoodKarma package
//Build 1 Beta 4.5 Release
//By: Jonathan Zepp
class GKDestroyer extends Actor
placeable;
var() name destroyTag ;
var() bool bInstaKill ;
var() int damage ;
var Actor destroyTarget ;
var class<Actor> GKActor ;
var class<damageType> killDamType ;
simulated event Trigger( Actor Other, Pawn EventInstigator )
{
if(!bInstaKill)
{
forEach AllActors(GKActor, destroyTarget, destroyTag)
(NetKActor(destroyTarget)).takeDamage(damage, none, destroyTarget.location, vect(0,0,0), killDamType) ;
}
else
{
forEach AllActors(GKActor, destroyTarget, destroyTag)
(NetKActor(destroyTarget)).die() ;
}
}
defaultproperties
{
DestroyTag="'"
Damage=30
GKActor=Class'GoodKarma.NetKActor'
killDamType=Class'GoodKarma.DamTypeKick'
bHidden=True
Texture=Texture'GKTextures.ActorSprites.GKDestroyer'
DrawScale=1.500000
}

View file

@ -0,0 +1,26 @@
//GKRespawner as part of the GoodKarma package
//Build 3 Beta 4.5 Release
//By: Jonathan Zepp
class GKRespawner extends Actor
placeable;
var() name respawnTag ;
var Actor respawnTarget ;
var class<Actor> GKActor ;
simulated event Trigger( Actor Other, Pawn EventInstigator )
{
forEach AllActors(GKActor, respawnTarget, respawnTag)
(NetKActor(respawnTarget)).respawn() ;
}
defaultproperties
{
respawnTag="'"
GKActor=Class'GoodKarma.NetKActor'
bHidden=True
Texture=Texture'GKTextures.ActorSprites.GKRespawner'
DrawScale=1.500000
}

View file

@ -0,0 +1,29 @@
//GKShover as part of the GoodKarma package
//Build 1 Beta 4.5 Release
//By: Jonathan Zepp
class GKShover extends Actor
placeable;
var() name shoveTag ;
var() class<damageType> shoveDamType ;
var Actor shoveTarget ;
var class<Actor> GKActor ;
simulated event Trigger( Actor Other, Pawn EventInstigator )
{
forEach AllActors(GKActor, shoveTarget, shoveTag)
(NetKActor(shoveTarget)).takeDamage(0, none, shoveTarget.location, vector(rotation), shoveDamType) ;
}
defaultproperties
{
shoveTag="'"
shoveDamType=Class'GoodKarma.DamTypeKick'
GKActor=Class'GoodKarma.NetKActor'
bHidden=True
Texture=Texture'GKTextures.ActorSprites.GKPusher'
DrawScale=1.500000
bDirectional=True
}

View file

@ -0,0 +1,26 @@
//GKWaker as part of the GoodKarma package
//Build 1 Beta 4.5 Release
//By: Jonathan Zepp
class GKWaker extends Actor
placeable;
var() name wakeTag ;
var Actor wakeTarget ;
var class<Actor> GKActor ;
simulated event Trigger( Actor Other, Pawn EventInstigator )
{
forEach AllActors(GKActor, wakeTarget, wakeTag)
(NetKActor(wakeTarget)).KWake() ;
}
defaultproperties
{
wakeTag="'"
GKActor=Class'GoodKarma.NetKActor'
bHidden=True
Texture=Texture'GKTextures.ActorSprites.GKWaker'
DrawScale=1.500000
}

View file

@ -0,0 +1,23 @@
//GK_AS_RoundReset as part of the GoodKarma package
//Build 1 Beta 4.5 Release
//By: Jonathan Zepp
class GK_AS_RoundReset extends Actor
placeable;
var Actor respawnTarget ;
var class<Actor> GKActor ;
simulated event Trigger( Actor Other, Pawn EventInstigator )
{
forEach AllActors(GKActor, respawnTarget)
(NetKActor(respawnTarget)).respawn() ;
}
defaultproperties
{
GKActor=Class'GoodKarma.NetKActor'
bHidden=True
Texture=Texture'GKTextures.ActorSprites.GKASRespawner'
DrawScale=1.500000
}

View file

@ -0,0 +1,740 @@
//NetKActor as part of the GoodKarma package
//Build 134 Beta 4.5 Release
//By: Jonathan Zepp
//Original code based of the LawDogsKActor code available from unreal wiki (Thank You!)
//Though the current version has been SEVERELY modified, and modified some more.
//This is intended to add full server playability, and make karma a universal tool.
//Changes to bot pathing have also been made to put some sense into their empty heads...
class NetKActor extends KActor
placeable;
#exec OBJ LOAD FILE="..\Sounds\WeaponSounds.uax"
//Edit in default properties in UnrealEd
var() bool bBlockedPath ; //Enables Basic bot-pathing
var() bool bCriticalObject ; //Will Always function despite server physics detail (not fully functional)
var() float moveDistance ; //associated with bBlockedPath, how far the object must move for the bots to pass it
var() array<Sound> HitSounds ; //A sound to play on impact
var() byte RelativeImpactVolume ; //The relative sound volume of the hit sound
var() bool bShoveable ; //Can the object be shoved by a player?
var() name BlockedPath ; //The name of the associated blocked path
var() float ShoveModifier; //A multiplier to change how hard the object is shoved
var() bool bPuntable ; //Allows a NetKActor to be punted
var() int requiredPuntStrength ; //A value which must be met by the actor calling the DeclarePunt function for a punt to be accepted
var() bool bEnableSpinProtection ; //Overrides standard karma features to make shoving the object always work properly, not reccomended on all objects, especially long ones, unless they have trouble.
var() float hitSoundRepeatModifier ; //How much more often will hit sounds play?
var(Damage) bool bCollisionDamage ; //Enables damage when colliding with a player/vehicle/thing with health
var(Damage) float DamageSpeed ; //Minimum speed to deal damage
var(Damage) class<DamageType> HitDamageType ; //Damage type associated with bCollisionDamage
var(Damage) float HitDamageScale ; //Relative impact damage modifier
var(Damage) int initialHealth ; //The starting health of an object
var(Damage) int damageAbsorbtionAmount ; //Absorbs this much damage off each hit.
var(Damage) bool limitDamagingClass ; //Only allows the constrained class to deal damage (and push it around)
var(Damage) class<Weapon> DamageConstraintClass ; //The constraint class (only allowed class to damage it)
var(Destruction) int explodeDamage ; //When dieing, how much damage does it deal to its fragments/people near it
var(Destruction) float explodeRadius ; //How close does something have to be to be damaged when dieing
var(Destruction) int explodeForce ; //How hard does it push fragments and other objects when dieing
var(Destruction) bool bDestroyable ; //Does health and damage apply to this object?
var(Destruction) sound DestructionSound ; //Sound played when the object is destroyed
var(Destruction) byte DestructionVolume ; //Volume of the destruction sound
var(Destruction) class <Emitter> DestroyedEffect ; //The effect created when the object is destroyed
var(Destruction) vector EffectOffset ; //Where the effect is in relation to the object when destroyed
var(Destruction) bool bOrientDestructionEffect ; //Does the destruction effect have the same orientation as the hit which killed it?
var(Destruction) float DestroyedMass ; //What the mass is when destroyed
var(Destruction) float DestroyedDamping ; //What the damping is when destroyed
var(Destruction) float DestroyedFriction ; //What the friction is when destroyed
var(Destruction) float DestroyedBuoyancy ; //What the buoyancy is when destroyed
var(Destruction) float DestroyedRestitution ; //What the restitution is when destroyed
var(Destruction) StaticMesh DestroyedStaticMesh ; //The static mesh used for the object after it is destroyed (anything but none enables the 5 destroyed karma changing values)
var(Respawning) float PreRespawnEffectTime ; //How long before the object respawns will the respawn effect play?
var(Respawning) bool bRespawnEffect ; //Will a respawn effect play?
var(Respawning) class<emitter> RespawnEffect ; //The effect spawned when the object respawns
var(Respawning) bool bInactivityReset ; //Will the object reset automatically if moved and then idle?
var(Respawning) float inactivityTimeout ; //How long of idleness will trigger an inactivity Reset?
var(Respawning) sound RespawnSound ; //Sound played when the object is respawned
var(Respawning) byte RespawnVolume ; //Volume of the respawning sound
var(Respawning) float AutoRespawnTime ; //How long after it is destroyed does it wait to respawn on its own (-1 means it dosen't respawn)
//Internal
var vector startLocation ;
var KRigidBodyState KState, KRepState, initialKState;
var bool bPendingPunt, bPendingRespawn, bRespawnEffectPlayed, bInactive, bWaitTillMove, notifyPlayHit, bDead ;
var int StateCount, LastStateCount, Health ;
var actor Punter ;
var float PuntTimeout, respawnClock, inactiveClock, lastShoveTimer, replaySoundClock ;
var rotator startRotation, hitDirection ;
var float initialRest, initialFric, initialMass, initialDampLin, initialDampAng, initialBuoy ;
var StaticMesh initialMesh ;
var byte clientPlay ; //0 for nothing, 1 for death emitters, 2 for respawn emitter
// shadow variables
var Projector Shadow;
var ShadowProjector PlayerShadow;
var globalconfig bool bBlobShadow;
var () bool bKActorShadows;
// ZOMG paint stains!
/*
var (Stains) bool bLeaveStains;
var (Stains) float StainStreakInterval;
var transient float LastStreakTime;
var (Stains) float StainSpeedThreshold;
*/
//var Actor LastTouchedActor;
var vector DieVect;
var vector lasthitlocation;
var pawn lastinstigatedby,LastStander;
replication
{
reliable if(Role == ROLE_Authority)
KRepState, StateCount, bDead, Health, hitDirection, clientPlay ;
reliable if(Role == ROLE_Authority)
clientDeathEmitters, clientRespawnEmitter ,DestroyedEffect;
reliable if(bNetInitial)
startRotation, startLocation ;
}
function PreBeginPlay()
{
startLocation = Location ;
startRotation = Rotation ;
KGetRigidBodyState(initialKState) ;
if(!bCriticalObject && Level.PhysicsDetailLevel == PDL_Low)
SetPhysics(PHYS_None) ;
initialRest = KParams.KRestitution ;
initialFric = KParams.KFriction ;
initialMass = (KarmaParams(KParams)).KMass ;
initialDampLin = (KarmaParams(KParams)).KLinearDamping ;
initialDampAng = (KarmaParams(KParams)).KAngularDamping ;
initialBuoy = (KarmaParams(KParams)).KBuoyancy ;
initialMesh = getObject(StaticMesh) ;
respawn() ;
}
simulated function PostNetBeginPlay()
{
if ( bKActorShadows == true)
{
PlayerShadow = Spawn(class'ShadowProjector',Self,'',Location);
PlayerShadow.ShadowActor = self;
PlayerShadow.bBlobShadow = bBlobShadow;
PlayerShadow.LightDirection = Normal(vect(1,1,3));
PlayerShadow.LightDistance = 320;
PlayerShadow.MaxTraceDistance = 350;
PlayerShadow.InitShadow();
PlayerShadow.bShadowActive = true;
}
// hardcode destruction effect to Material
/*
if (SurfaceType == EST_Metal)
{
DestroyedEffect = class'DoorExplodeMetalStandard';
DestructionSound = Sound'PatchSounds.MetalCrash';
}
else
if (SurfaceType == EST_Wood)
DestroyedEffect = class'DoorExplodeWoodStandard';
else
DestroyedEffect = none;
*/
}
function respawn()
{
setPhysics(PHYS_None) ;
setLocation(StartLocation) ;
setRotation(startRotation) ;
SetStaticMesh(initialMesh) ;
SetPhysics(PHYS_Karma) ;
SetCollision(true, true, true) ;
KSetMass(initialMass) ;
KSetRestitution(initialRest) ;
KSetDampingProps(initialDampLin, initialDampAng) ;
KSetFriction(initialFric) ;
(KarmaParams(KParams)).KBuoyancy = initialBuoy ;
KRepState = initialKState ;
Health = initialHealth ;
bBlockedPath = default.bBlockedPath ;
bPendingPunt = false ;
bHidden = false ;
bPendingRespawn = false ;
if(bRespawnEffect && !bRespawnEffectPlayed)
clientPlay = 2 ;
bRespawnEffectPlayed = false ;
bWaitTillMove = true ;
inactiveClock = -999.0 ;
bDead = false ;
lastShoveTimer = 0.0 ;
if(!((KarmaParams(KParams)).KStartEnabled))
{
KRepState.linVel = KRBVecFromVector(Vect(0,0,0)) ;
KRepState.angVel = KRBVecFromVector(Vect(0,0,0)) ;
}
lastStateCount = StateCount ;
//DEBUG
//log("Respawn at "$Location$" Karma: "$KRBVecToVector(KRepState.Position)) ;
//log(tag$" respawned at "$location$" and should be at "$startLocation) ;
}
function bool declarePunt(Actor newPunter, float maxTimeTo, bool bPriority, int Strength)
{
if(!bPuntable)
return false ;
if(((Punter != none && PuntTimeout <= level.timeSeconds) || Punter == none || bPriority) && Strength > RequiredPuntStrength)
{
Punter = newPunter ;
PuntTimeout = level.timeSeconds + maxTimeTo ;
bInactive = false ;
return true ;
}
return false ;
}
simulated event Bump(Actor Other)
{
local vector Shove;
local int damage ;
local float Speed;
local class<damageType> damageTypeClass ;
// local KFBloodSplatter Streak;
// local vector WallHit, WallNormal;
// local Actor WallActor;
if(Pawn(Other) == None || Other.role != ROLE_Authority)
return ;
if(limitDamagingClass && (Other != DamageConstraintClass))
return ;
if(bShoveable == false)
return ;
if(lastShoveTimer > level.timeSeconds)
return ;
// no spinning wildly when people stand on you!
if (pawn(Other) != none && pawn(Other).Base == self)
{
LastStander = pawn(Other);
return;
}
if(!KIsAwake())
KWake() ;
damageTypeClass = class'DamTypeKick' ;
damage = 3 ;
/*
if (bLeaveStains && Speed > StainSpeedThreshold)
{
StainStreakInterval -= (0.001 * VSize(Velocity));
if (Other != none && Other.bWorldGeometry)
WallActor = Trace(WallHit, WallNormal, Location + 50 * Velocity, Location, false);
//Log(WallActor);
if ( WallActor != None && Level.TimeSeconds > LastStreakTime + StainStreakInterval)
{
Streak= spawn(class 'KFMod.KFBloodSplatter',,,WallHit * (WallNormal + VRand()), rotator(-WallNormal));
if (Streak != none)
Streak.SetRotation(Rotator(Velocity));
LastStreakTime = Level.TimeSeconds;
}
}
*/
/*
if (Other.IsA('KFHumanPawn'))
{
SetPhysics(PHYS_None);
Other.attachtobone(self,'Bone_weapon');
}
*/
if(PuntTimeout >= level.timeSeconds && bPuntable)
{
if(Punter == Other)
{
damageTypeClass = class'DamTypePunt' ;
damage = 9 ;
}
}
else
Punter = None ;
Speed = VSize(Other.Velocity);
Shove = (Normal(Other.Velocity) / (Mass * 0.4)) * ShoveModifier ;
if(Other.Velocity.Z < -90.0)
{
Shove.Z *= 0.5 ;
Shove.X *= 0.8 ;
Shove.Y *= 0.8 ;
}
if(IsInWater(Other))
{
Shove.Z *= 0.75 ;
Shove.X *= 0.5 ;
Shove.Y *= 0.5 ;
}
if(shove.z == 0.0)
shove.z = (1.6 / Mass) * 0.4 * ShoveModifier;
if(bEnableSpinProtection)
TakeDamage(damage, Pawn(Other), vect(0,0,0), Shove, damageTypeClass) ;
else
TakeDamage(damage, Pawn(Other), location, Shove, damageTypeClass) ;
lastShoveTimer = level.timeSeconds + 0.1 ;
}
simulated event RanInto(Actor Other)
{
local vector Momentum;
local float Speed;
// if (Other.bWorldGeometry)
// LastTouchedActor = Other;
if(bCollisionDamage && Other != None && lastShoveTimer <= level.timeSeconds)
{
if ((Pawn(Other) == None) || (Vehicle(Other) != None) || Other == Instigator || Other.Role != ROLE_Authority)
return;
Speed = VSize(Velocity) ;
//log(Velocity) ;
if (Speed > DamageSpeed)
{
Momentum += Speed * 0.25 * Other.Mass * Normal(Velocity cross vect(0,0,1));
Other.TakeDamage(int(Speed * 0.045 * HitDamageScale), Instigator, Other.Location, Momentum, HitDamageType);
if(HitSounds.length != 0)
notifyPlayHit = true ;
//DEBUG
//log(Tag$" injured "$Other.Tag$" dealing "$(int(Speed * 0.048 * HitDamageScale))$" Damage!") ;
Velocity.z = Velocity.z * 0.45 ;
if((Speed * 0.045 * HitDamageScale) >= 70)
TakeDamage(3, instigator, Location, ((Velocity * -0.85) / (Mass + 1)), class'GoodKarma.DamTypeKick') ;
else
TakeDamage(7, instigator, Location, ((Velocity * -0.65) / (Mass + 1)), class'GoodKarma.DamTypeKick') ;
}
else if(Pawn(Other) != None)
TakeDamage(4, instigator, Location, (Velocity * -1.03), class'GoodKarma.DamTypeKick') ;
lastShoveTimer = level.TimeSeconds + 0.07 ;
//log(Velocity) ;
}
//DEBUG
//log(Tag$" is now moving at "$Velocity) ;
}
function TakeDamage( int Damage, Pawn InstigatedBy, Vector Hitlocation, Vector Momentum, class<DamageType> damageType, optional int HitIndex)
{
local vector ApplyImpulse;
local Actor A;
if(limitDamagingClass && (instigatedBy.Weapon != DamageConstraintClass))
return ;
lasthitlocation = hitlocation;
lastinstigatedby = instigatedBy;
// When shot, trigger self.
TriggerEvent(Event, A, instigatedBy);
Damage = Damage - DamageAbsorbtionAmount ;
if(Damage < 0)
Damage = 0 ;
Health = Health - Damage ;
if(Health <= 0 && bDestroyable && !bPendingRespawn)
die() ;
if(damageType.default.KDamageImpulse > 0)
{
if(VSize(momentum) < 0.001)
{
return;
}
ApplyImpulse = Normal(momentum) * damageType.default.KDamageImpulse;
//DEBUG
//log("********************") ;
//log(ApplyImpulse) ;
KAddImpulse(ApplyImpulse, hitlocation) ;
}
hitDirection = rotator(momentum) ;
//DEBUG
//log("TakeDamage") ;
}
function bool IsInWater(Actor Other)
{
local PhysicsVolume V;
ForEach Other.TouchingActors(class'PhysicsVolume',V)
{
if(V.bWaterVolume == true)
return true ;
}
return false;
}
simulated function KImpact(actor other, vector pos, vector impactVel, vector impactNorm)
{
Super.KImpact(Other,pos,impactVel,impactNorm);
if (VSize(Velocity) != 0)
{
if(HitSounds.length != 0 )
playServerHit();
}
}
simulated function Tick(float Delta)
{
local pawn Stander;
if(clientPlay != 0)
{
switch(clientPlay)
{
case 1: clientDeathEmitters() ;
break ;
case 2: clientRespawnEmitter() ;
break ;
default:log("clientPlay invalid value") ;
}
clientPlay = 0 ;
}
PackState();
if(bPendingRespawn && respawnClock <= level.timeSeconds)
respawn() ;
if(bPendingRespawn && bRespawnEffect && !bRespawnEffectPlayed && (level.timeSeconds >= (respawnClock - PreRespawnEffectTime)))
{
clientPlay = 2 ;
playServerSoundRespawn() ;
bRespawnEffectPlayed = true ;
}
if(bPendingDelete)
{
die() ;
bPendingDelete = false ;
}
if(bInactive && bInactivityReset && !bWaitTillMove)
{
if(inactiveClock == -999.0)
inactiveClock = inactivityTimeout + level.timeSeconds ;
else if(inactiveClock <= level.timeSeconds)
{
//DEBUG
//log(tag$" is pending inactivity respawn") ;
bPendingRespawn = true ;
respawnClock = level.TimeSeconds + 1.5 ;
inactiveClock = -999.0 ;
}
}
// If someone's standing on me, i can't go flying.
if (VSize(Velocity) != 0)
{
foreach BasedActors( class 'pawn',Stander)
{
if (Stander != none)
{
//Log("I'm being stood on. Halting movement");
Velocity = vect(0,0,0);
}
}
}
// No super speeding objects
if (Mass >= 0.5 && VSize(Velocity) > 100)
Velocity *= 0.5;
}
//Pack current state to be replicated
function PackState()
{
local bool bChanged;
if(!KIsAwake())
return;
KGetRigidBodyState(KState);
bChanged = false ;
bChanged = bChanged || VSize(KRBVecToVector(KState.Position) - KRBVecToVector(KRepState.Position)) > 2.5;
bChanged = bChanged || VSize(KRBVecToVector(KState.LinVel) - KRBVecToVector(KRepState.LinVel)) > 0.5;
bChanged = bChanged || VSize(KRBVecToVector(KState.AngVel) - KRBVecToVector(KRepState.AngVel)) > 0.5;
if(bChanged)
{
KRepState = KState;
StateCount++;
if(bBlockedPath && stateCount > 1) //Does it need to trigger the blocked path?
{
if(VSize(startLocation - KRBVecToVector(KRepState.Position)) > moveDistance)
{
bBlockedPath=false ;
TriggerEvent(BlockedPath, self, None) ; //DO IT!
//DEBUG
log(Tag$" is "$VSize(startLocation - KRBVecToVector(KRepState.Position))$" units from its original position!") ;
}
}
bInactive = false ;
bWaitTillMove = false ;
}
else
{
bInactive = true ;
return;
}
}
simulated event PostNetReceive()
{
if(StateCount == LastStateCount)
return;
}
simulated event bool KUpdateState(out KRigidBodyState newState)
{
if(StateCount == LastStateCount)
return false;
newState = KRepState;
lastStateCount = StateCount ;
return true;
}
/*
simulated function UsedBy( Pawn user )
{
Log("I was just used...and I liked it");
if (KFHumanPawn(user) != none)
{
SetPhysics(PHYS_None);
user.AttachToBone( self, 'Bone_weapon' );
}
}
*/
simulated function Die()
{
DieVect = lasthitlocation-lastinstigatedBy.location;
//DEBUG
//log("Die at "$location) ;
bDead = true ;
if(bDestroyable)
{
playServerSoundDestroy() ;
if ( EffectIsRelevant(Location,false) )
spawn(DestroyedEffect,,,Location,rotator(DieVect) );
ClientDeathEmitters();
//DestroyedFX();
HurtRadius(explodeDamage ,explodeRadius, class'DamTypeKick', explodeForce, Location) ;
if(DestroyedStaticMesh == none)
{
bHidden = true ;
SetPhysics(PHYS_None) ;
SetCollision(false, false, false) ;
Health = 0 ;
Punter = none ;
bPendingPunt = false ;
}
else
{
KWake() ;
SetStaticMesh(DestroyedStaticMesh) ;
KSetMass(DestroyedMass) ;
KSetRestitution(DestroyedRestitution) ;
KSetDampingProps(DestroyedDamping, DestroyedDamping) ;
KSetFriction(DestroyedFriction) ;
(KarmaParams(KParams)).KBuoyancy = DestroyedBuoyancy ;
Health = 1 ;
}
}
else
{
bHidden = true ;
SetPhysics(PHYS_None) ;
SetCollision(false, false, false) ;
Health = 0 ;
Punter = none ;
bPendingPunt = false ;
}
if(AutoRespawnTime != -1)
{
bPendingRespawn = true ;
respawnClock = level.timeseconds + AutoRespawnTime ;
bInactive = false ;
}
clientPlay = 1 ;
}
function playServerSoundDestroy()
{
PlaySound(DestructionSound, SLOT_None, DestructionVolume) ;
//log("Server-SoundDestroy") ;
}
function playServerSoundRespawn()
{
PlaySound(RespawnSound, SLOT_None, RespawnVolume) ;
//log("Server-SoundRespawn") ;
}
function playServerHit()
{
local int a ;
local float b ;
if(replaySoundClock <= level.TimeSeconds)
{
a = Rand(HitSounds.length) ;
b = rand(4) * 0.1 ;
PlaySound(HitSounds[a] , SLOT_None, RelativeImpactVolume);
notifyPlayHit = false ;
replaySoundClock = level.timeSeconds + ((0.55 + b) * hitSoundRepeatModifier) ;
}
//log("Server-SoundHit") ;
}
simulated event FellOutOfWorld(eKillZType KillType)
{Die() ;}
function StaticMesh getObject(StaticMesh A)
{ return A ;}
simulated function ClientDeathEmitters()
{
if(level.NetMode != NM_DedicatedServer)
return ;
if(bOrientDestructionEffect)
Spawn(DestroyedEffect,,,Location + EffectOffset, hitDirection) ;
else
Spawn(DestroyedEffect,,,Location + EffectOffset) ;
//log("Client-EmittersDestroy") ;
}
simulated function ClientRespawnEmitter()
{
if(level.NetMode != NM_DedicatedServer)
return ;
Spawn(RespawnEffect,,,startLocation + EffectOffset) ;
//log("Client-EmittersRespawn") ;
}
defaultproperties
{
bKActorShadows = true
bBlockedPath=True
moveDistance=50.000000
RelativeImpactVolume=127
bShoveable=True
ShoveModifier=1.500000
hitSoundRepeatModifier=1.000000
bCollisionDamage=True
DamageSpeed=100.000000 //600
HitDamageType=Class'GoodKarma.DamTypeBludgeon'
HitDamageScale=1.000000
initialHealth=100
damageAbsorbtionAmount=25
explodeRadius=15.000000
bDestroyable=True
DestructionVolume=200
bOrientDestructionEffect=True
DestroyedMass=0.500000
DestroyedDamping=1.000000
DestroyedFriction=0.700000
DestroyedBuoyancy=0.300000
DestroyedRestitution=0.100000
PreRespawnEffectTime=1.000000
inactivityTimeout=15.000000
RespawnSound=none//Sound'GameSounds.Combo.ComboActivated' KFTODO: Replace this
RespawnVolume=180
AutoRespawnTime=-1.000000
bRespawnEffectPlayed=True
bWaitTillMove=True
bdead=True
LastStateCount=-1
inactiveClock=-999.000000
StaticMesh=StaticMesh'GKStaticMeshes.basicShapes.BasicCube'
bUseDynamicLights=True
RemoteRole=ROLE_SimulatedProxy
bNetNotify=True
Begin Object Class=KarmaParams Name=KarmaParams0
KMass=0.500000
bHighDetailOnly=False
bClientOnly=False
KFriction=0.500000
KRestitution=0.200000
KImpactThreshold=1.000000
End Object
KParams=KarmaParams'GoodKarma.NetKActor.KarmaParams0'
bEnableSpinProtection = true
//HitSounds(0) = Sound'PatchSounds.MetalCrash'
bHardAttach=True
bDetailAttachment = true
}

View file

@ -0,0 +1,21 @@
// A NetKActor with real time shadows....
class ShadowNetKActor extends NetKActor;
// shadow decal
simulated function PostBeginPlay()
{
PlayerShadow = Spawn(class'ShadowProjector',Self,'',Location);
PlayerShadow.ShadowActor = self;
PlayerShadow.bBlobShadow = bBlobShadow;
PlayerShadow.LightDirection = Normal(vect(1,1,3));
PlayerShadow.LightDistance = 320;
PlayerShadow.MaxTraceDistance = 350;
PlayerShadow.InitShadow();
PlayerShadow.bShadowActive = true;
}
defaultproperties
{
}

View file

@ -0,0 +1,36 @@
//SoccerBallTwo as part of the GoodKarma package
//Build 8 Beta 4.5 Release
//By: Jonathan Zepp
//A basic demo of the beta 3 capabilities and new functionality for beta 4
#exec OBJ LOAD FILE=..\textures\HumanoidArchitecture.utx
class SoccerBallTwo extends NetKActor
placeable;
defaultproperties
{
bBlockedPath=False
bCriticalObject=True
HitSounds(0)=none//Sound'ONSVehicleSounds-S.CollisionSounds.VehicleCollision05' KFTODO: Replace this?
RelativeImpactVolume=240
ShoveModifier=1.400000
DamageSpeed=550.000000
HitDamageScale=0.700000
StaticMesh=StaticMesh'GKStaticMeshes.basicShapes.BasicSphere'
DrawScale=0.800000
Skins(0)=none//Texture'HumanoidArchitecture.Bases.bas06snowHA' KFTODO: Replace this
bUnlit=True
Begin Object Class=KarmaParams Name=SoccerBallKarma
KMass=0.200000
KLinearDamping=0.150000
KAngularDamping=0.100000
KBuoyancy=1.800000
bHighDetailOnly=False
bDoSafetime=True
KFriction=0.250000
KRestitution=0.750000
End Object
KParams=KarmaParams'GoodKarma.SoccerBallTwo.SoccerBallKarma'
}

View file

@ -0,0 +1,24 @@
<html>
<head><title>Index of /kf_sources/GoodKarma/Classes/</title></head>
<body>
<h1>Index of /kf_sources/GoodKarma/Classes/</h1><hr><pre><a href="../">../</a>
<a href="BasicExplosion.uc">BasicExplosion.uc</a> 06-Oct-2019 10:27 4358
<a href="DamTypeBigPush.uc">DamTypeBigPush.uc</a> 06-Oct-2019 10:27 356
<a href="DamTypeBludgeon.uc">DamTypeBludgeon.uc</a> 06-Oct-2019 10:27 455
<a href="DamTypeHugePush.uc">DamTypeHugePush.uc</a> 06-Oct-2019 10:27 359
<a href="DamTypeKick.uc">DamTypeKick.uc</a> 06-Oct-2019 10:27 433
<a href="DamTypeMedPush.uc">DamTypeMedPush.uc</a> 06-Oct-2019 10:27 329
<a href="DamTypeMegaGib.uc">DamTypeMegaGib.uc</a> 06-Oct-2019 10:27 462
<a href="DamTypePunt.uc">DamTypePunt.uc</a> 06-Oct-2019 10:27 421
<a href="DamTypeSmallPush.uc">DamTypeSmallPush.uc</a> 06-Oct-2019 10:27 384
<a href="GKDeathMonitor.uc">GKDeathMonitor.uc</a> 06-Oct-2019 10:27 1136
<a href="GKDestroyer.uc">GKDestroyer.uc</a> 06-Oct-2019 10:27 986
<a href="GKRespawner.uc">GKRespawner.uc</a> 06-Oct-2019 10:27 598
<a href="GKShover.uc">GKShover.uc</a> 06-Oct-2019 10:27 753
<a href="GKWaker.uc">GKWaker.uc</a> 06-Oct-2019 10:27 566
<a href="GK_AS_RoundReset.uc">GK_AS_RoundReset.uc</a> 06-Oct-2019 10:27 550
<a href="NetKActor.uc">NetKActor.uc</a> 06-Oct-2019 10:27 23721
<a href="ShadowNetKActor.uc">ShadowNetKActor.uc</a> 06-Oct-2019 10:27 537
<a href="SoccerBallTwo.uc">SoccerBallTwo.uc</a> 06-Oct-2019 10:27 1183
</pre><hr></body>
</html>