rott/kf_sources/KFMod/Classes/SPECIES_KFMaleHuman.uc
2026-07-14 20:27:09 +07:00

316 lines
9.3 KiB
Ucode

class SPECIES_KFMaleHuman extends KFSpeciesType
abstract;
enum EBoneRotType
{
BRot_Yaw,
BRot_Roll,
BRot_Pitch
};
var() name FeetBones[2],TorsoBones[2],KneeBones[2],IdleAnimationName;
var() EBoneRotType TorseRotType,KneeRotType;
var() int MaxTorsoTurn,MaxKneeTurn;
var() float FootZHeightMod;
var string AgentWilkesTeamSkinNames[2];
var string CorporalLewisTeamSkinNames[2];
var string DJScullyTeamSkinNames[2];
var string DrGaryGloverTeamSkinNames[2];
var string FoundryWorkerAldridgeTeamSkinNames[2];
var string LieutenantMastersonTeamSkinNames[2];
var string PoliceConstableBriarTeamSkinNames[2];
var string PoliceSergeantDavinTeamSkinNames[2];
var string PrivateSchniederTeamSkinNames[2];
var string SergeantPowersTeamSkinNames[2];
var class <SeveredAppendage> DetachedArmClass; // class of detached arm to spawn for this species
var class <SeveredAppendage> DetachedLegClass; // class of detached arm to spawn for this species
var bool bRandomizedVoice;
static function string GetVoiceType( bool bIsFemale, LevelInfo Level )
{
return default.MaleVoice;
}
static function LoadResources(xUtil.PlayerRecord rec, LevelInfo Level, PlayerReplicationInfo PRI, int TeamNum)
{
local string VoiceType, SkelName;
local Material NewBodySkin, NewFaceSkin;
local class<VoicePack> VoiceClass;
local mesh customskel;
if ( (Level.NetMode != NM_DedicatedServer) && class'DeathMatch'.default.bForceDefaultCharacter )
return;
DynamicLoadObject(rec.MeshName,class'Mesh');
if ( (Level.NetMode != NM_DedicatedServer) && (rec.Skeleton != "") )
customskel = mesh(DynamicLoadObject(rec.Skeleton,class'Mesh'));
SkelName = Default.MaleSkeleton;
DynamicLoadObject(Default.MaleSoundGroup, class'Class');
if ( Level.NetMode == NM_DedicatedServer )
{
if ( rec.VoiceClassName != "" )
{
VoiceClass = class<VoicePack>(DynamicLoadObject(rec.VoiceClassName, class'Class'));
}
else
{
VoiceClass = class<VoicePack>(DynamicLoadObject(default.MaleVoice, class'Class'));
}
if ( PRI != None )
PRI.VoiceType = VoiceClass;
return;
}
if ( rec.Sex ~= "Female" )
{
if ( rec.VoiceClassName != "" )
{
VoiceType = rec.VoiceClassName;
VoiceClass = class<VoicePack>(DynamicLoadObject(VoiceType,class'Class'));
}
if ( VoiceClass == None )
{
VoiceType = default.FemaleVoice;
class<VoicePack>(DynamicLoadObject(VoiceType,class'Class'));
}
}
else
{
if ( bool(Level.ConsoleCommand("get ini:Engine.Engine.AudioDevice LowQualitySound")) )
{
VoiceType = Level.DefaultMalePlayerVoice;
VoiceClass = class<VoicePack>(DynamicLoadObject(VoiceType,class'Class'));
}
else if ( rec.VoiceClassName != "" )
{
VoiceType = rec.VoiceClassName;
VoiceClass = class<VoicePack>(DynamicLoadObject(VoiceType,class'Class'));
}
if ( VoiceClass == None )
{
VoiceType = default.MaleVoice;
class<VoicePack>(DynamicLoadObject(VoiceType,class'Class'));
}
}
if ( (CustomSkel == None) && (SkelName != "") )
DynamicLoadObject(SkelName,class'Mesh');
NewFaceSkin = Material(DynamicLoadObject(rec.FaceSkinName, class'Material'));
if ( TeamNum == 255 && Level.GRI != none && Level.GRI.bForceTeamSkins )
TeamNum = Default.DMTeam;
if ( (TeamNum == 0 || TeamNum == 1) && (Level.GRI == none || !Level.GRI.bNoTeamSkins) )
{
if ( rec.DefaultName == "Sergeant_Powers" )
{
NewBodySkin = Material(DynamicLoadObject(default.SergeantPowersTeamSkinNames[TeamNum], class'Material',true));
}
if ( NewBodySkin == None )
{
log("TeamSkin not found "$NewBodySkin);
NewBodySkin = Material(DynamicLoadObject(rec.BodySkinName, class'Material'));
}
}
else
NewBodySkin = Material(DynamicLoadObject(rec.BodySkinName, class'Material'));
Level.AddPrecacheMaterial(NewBodySkin);
Level.AddPrecacheMaterial(NewFaceSkin);
Level.AddPrecacheMaterial(rec.Portrait);
}
// Modified this function so we could use pawns instead of xpawns
static function bool Setup(Pawn P, xUtil.PlayerRecord rec)
{
local mesh NewMesh, customskel;
local string VoiceType, SkelName;
local class<VoicePack> VoiceClass;
local int TeamNum, i,j;
local XPawn XP;
// Cast the pawn to an XPawn
XP = XPawn(P);
if ( XP == none )
{
log("SpeciesType setup error.");
return false;
}
if ( XP.bAlreadySetup )
{
// make sure correct teamskin
if ( XP.Level.NetMode == NM_Client )
{
if ( (XP.PlayerReplicationInfo != None) && (XP.PlayerReplicationInfo.Team != None) )
TeamNum = XP.PlayerReplicationInfo.Team.TeamIndex;
else if ( (XP.DrivenVehicle != None) && (XP.DrivenVehicle.PlayerReplicationInfo != None) && (XP.DrivenVehicle.PlayerReplicationInfo.Team != None) )
TeamNum = XP.DrivenVehicle.PlayerReplicationInfo.Team.TeamIndex;
if ( XP.TeamSkin == TeamNum )
return true;
SetTeamSkin(XP,rec,TeamNum);
}
return true;
}
NewMesh = Mesh(DynamicLoadObject(rec.MeshName,class'Mesh'));
if ( NewMesh == None )
{
log("Failed to load player mesh "$rec.MeshName);
return false;
}
XP.bAlreadySetup = true;
XP.LinkMesh(NewMesh);
XP.AssignInitialPose();
XP.bIsFemale = ( rec.Sex ~= "Female" );
if ( XP.PlayerReplicationInfo != None )
XP.PlayerReplicationInfo.bIsFemale = XP.bIsFemale;
if ( (XP.Level.NetMode != NM_DedicatedServer) && (rec.Skeleton != "") )
customskel = mesh(DynamicLoadObject(rec.Skeleton,class'Mesh'));
if ( XP.bIsFemale )
{
SkelName = Default.FemaleSkeleton;
if ( XP.Level.bLowSoundDetail )
XP.SoundGroupClass = class<xPawnSoundGroup>(DynamicLoadObject("XGame.xJuggFemaleSoundGroup", class'Class'));
else
XP.SoundGroupClass = class<xPawnSoundGroup>(DynamicLoadObject(Default.FemaleSoundGroup, class'Class'));
}
else
{
SkelName = Default.MaleSkeleton;
if ( XP.Level.bLowSoundDetail )
XP.SoundGroupClass = class<xPawnSoundGroup>(DynamicLoadObject("XGame.xJuggMaleSoundGroup", class'Class'));
else
XP.SoundGroupClass = class<xPawnSoundGroup>(DynamicLoadObject(Default.MaleSoundGroup, class'Class'));
}
if ( XP.Level.NetMode != NM_DedicatedServer )
{
if ( CustomSkel != None )
XP.SkeletonMesh = CustomSkel;
else if ( SkelName != "" )
XP.SkeletonMesh = mesh(DynamicLoadObject(SkelName,class'Mesh'));
TeamNum = 255;
if ( (XP.PlayerReplicationInfo != None) && (XP.PlayerReplicationInfo.Team != None) )
TeamNum = XP.PlayerReplicationInfo.Team.TeamIndex;
else if ( (XP.DrivenVehicle != None) && (XP.DrivenVehicle.PlayerReplicationInfo != None) && (XP.DrivenVehicle.PlayerReplicationInfo.Team != None) )
TeamNum = XP.DrivenVehicle.PlayerReplicationInfo.Team.TeamIndex;
else if ( (XP.Level.GRI != None) && XP.Level.GRI.bForceTeamSkins )
TeamNum = Default.DMTeam;
SetTeamSkin(XP,rec,TeamNum);
if ( rec.UseSpecular && (XP.Level.DetailMode!=DM_Low) )
{
// ifndef _RO_
//XP.HighDetailOverlay = Material'UT2004Weapons.WeaponShader';
// Xan hack
if ( Rec.BodySkinName ~= "UT2004PlayerSkins.XanMk3V2_Body" )
XP.Skins[2] = Material(DynamicLoadObject("UT2004PlayerSkins.XanMk3V2_abdomen", class'Material'));
}
}
if ( rec.VoiceClassName != "" )
{
VoiceType = rec.VoiceClassName;
}
else
{
VoiceType = default.MaleVoice;
}
VoiceClass = class<VoicePack>(DynamicLoadObject(VoiceType, class'Class'));
if ( XP.PlayerReplicationInfo != None )
XP.PlayerReplicationInfo.VoiceType = VoiceClass;
XP.VoiceClass = class<TeamVoicePack>(VoiceClass);
XP.VoiceType = VoiceType;
// add unique taunts
for ( i=0; i<16; i++ )
{
if ( Default.TauntAnims[i] != '' )
{
j = XP.TauntAnims.Length;
XP.TauntAnims[j] = Default.TauntAnims[i];
XP.TauntAnimNames[j] = Default.TauntAnimNames[i];
if ( j == 15 )
break;
}
}
return true;
}
static function SetTeamSkin(xPawn P, xUtil.PlayerRecord rec, int TeamNum)
{
local Material NewBodySkin, NewFaceSkin;
NewFaceSkin = Material(DynamicLoadObject(rec.FaceSkinName, class'Material'));
P.TeamSkin = TeamNum;
P.bClearWeaponOffsets = rec.ZeroWeaponOffsets;
if ( (TeamNum == 0 || TeamNum == 1) && ((P.Level.GRI == None) || !P.Level.GRI.bNoTeamSkins) )
{
if ( rec.DefaultName == "Sergeant_Powers" )
{
NewBodySkin = Material(DynamicLoadObject(default.SergeantPowersTeamSkinNames[TeamNum], class'Material',true));
}
if ( NewBodySkin == None )
{
log("TeamSkin not found "$rec.DefaultName);
NewBodySkin = Material(DynamicLoadObject(rec.BodySkinName, class'Material'));
}
P.Skins[0] = NewBodySkin;
}
else
P.Skins[0] = Material(DynamicLoadObject(rec.BodySkinName, class'Material'));
P.Skins[1] = NewFaceSkin;
}
defaultproperties
{
MaleVoice="KFMod.KFVoicePack"
FemaleVoice="KFMod.KFVoicePack"
//GibGroup="xEffects.xPawnGibGroup" KFTODO: Replaceme
MaleRagSkelName="British_Soldier1"
FemaleRagSkelName="Female2"
FemaleSkeleton="HumanFemaleA.Skeleton_Female"
MaleSkeleton="HumanMaleA.SkeletonMale"
MaleSoundGroup="KFmod.KFMaleSoundGroup"
FemaleSoundGroup="KFmod.KFMaleSoundGroup"
MaxTorsoTurn=-20000
MaxKneeTurn=22000
FeetBones(0)="Bip01 L Foot"
FeetBones(1)="Bip01 R Foot"
TorsoBones(0)="Bip01 L Calf"
TorsoBones(1)="Bip01 R Calf"
KneeBones(0)="Bip01 L Thigh"
KneeBones(1)="Bip01 R Thigh"
IdleAnimationName="Idle_Rest"
FootZHeightMod=-1
DetachedArmClass=class'SeveredArmSoldier'
DetachedLegClass=class'SeveredLegSoldier'
}