[SOURCE FILES]Unreal Basic Skeletal Character[227i]

Maps, mods and resources ported from or to Unreal.
Must run in UT99 or with Oldskool Amp'd.
Unreal 227 only projects are "Off-Topic"
User avatar
Rikia
Experienced
Posts: 118
Joined: Thu Jan 07, 2021 12:50 pm
Personal rank: Masterful
Location: Planet Na-Pali, Bluff Eversmoking

[SOURCE FILES]Unreal Basic Skeletal Character[227i]

Post by Rikia »

SteadZ and me decided to share usable resources for Unreal skinmakers, who want to port human characters from other different games!

This is a basic Skeletal Model files with UT99 skeleton and animations. SteadZ fixed animation files for making them usable.

Gamebanana Link: https://gamebanana.com/skins/186725

Model is taken from: viewtopic.php?f=13&t=14355

Credits:
SteadZ - Coding
Rikia - Rigging
Last edited by Rikia on Mon Feb 01, 2021 11:19 am, edited 17 times in total.
User avatar
SteadZ
Average
Posts: 67
Joined: Mon Mar 10, 2014 11:19 pm
Personal rank: 1337
Location: Scotland
Contact:

Re: Which file is responsible to skeletal player class

Post by SteadZ »

Are you using the OldUnreal patch 227? Skeletal meshes aren't supported on lower versions of Unreal. I'm guessing you're also using SkeletalChars package as a base somehow, but Unreal's implementation of Skeletal Meshes is slightly different from UT's. Would be easier to get an idea of what you're doing wrong if you shared the code for the class(es) you're trying to import :)

~SZ
"The problem with dreams is... you never know when you're gonna wake up"

Image
User avatar
Rikia
Experienced
Posts: 118
Joined: Thu Jan 07, 2021 12:50 pm
Personal rank: Masterful
Location: Planet Na-Pali, Bluff Eversmoking

Re: Which file is responsible to skeletal player class

Post by Rikia »

SteadZ wrote: Mon Jan 25, 2021 8:55 pm Are you using the OldUnreal patch 227? Skeletal meshes aren't supported on lower versions of Unreal. I'm guessing you're also using SkeletalChars package as a base somehow, but Unreal's implementation of Skeletal Meshes is slightly different from UT's. Would be easier to get an idea of what you're doing wrong if you shared the code for the class(es) you're trying to import :)

~SZ
I use 227i.

ONIKonokoFsrv.uc

Code: Select all

//=============================================================================
// ONI KonokoFsrv.
//=============================================================================
class ONIKonokoFsrv extends SkeletalPlayer;

#exec MESH MODELIMPORT MESH=KonokoFsrv MODELFILE=models\KonokoFsrv.PSK LODSTYLE=12
#exec MESH ORIGIN MESH=KonokoFsrv X=0 Y=0 Z=135 YAW=192

#exec MESH WEAPONATTACH MESH=KonokoFsrv BONE="Bip01 R Hand"
#exec MESH WEAPONPOSITION MESH=KonokoFsrv YAW=0 PITCH=0 ROLL=128 X=1.0 Y=0.0 Z=0.0

#exec MESHMAP SCALE MESHMAP=KonokoFsrv X=0.3125 Y=0.3125 Z=0.3125
#exec MESH DEFAULTANIM MESH=KonokoFsrv ANIM=SoldierAnim

//#exec TEXTURE IMPORT NAME=KonokoFsrvDoll FILE=TEXTURES\KonokoFsrvSDoll.PCX GROUP="Icons" MIPS=OFF
//#exec TEXTURE IMPORT NAME=KonokoFsrvBelt FILE=TEXTURES\KonokoFsrvSBelt.PCX GROUP="Icons" MIPS=OFF

static function SetMultiSkin(Actor SkinActor, string SkinName, string FaceName, byte TeamNum)
{
  local string MeshName, SkinItem, SkinPackage;

  MeshName = SkinActor.GetItemName(string(SkinActor.Mesh));

  SkinItem = SkinActor.GetItemName(SkinName);
  SkinPackage = Left(SkinName, Len(SkinName) - Len(SkinItem));

  if(SkinPackage == "")
  {
    SkinPackage="KonokoFsrvSkins.";
    SkinName=SkinPackage$SkinName;
  }

  if( TeamNum != 255 )
  {
    if(!SetSkinElement(SkinActor, 0, SkinName$"1T_"$String(TeamNum), default.DefaultSkinName$"1T_"$String(TeamNum)))
    {
      if(!SetSkinElement(SkinActor, 0, SkinName$"1", default.DefaultSkinName$"1"))
      {
        SetSkinElement(SkinActor, 0, default.DefaultSkinName$"1T_"$String(TeamNum), default.DefaultSkinName$"1T_"$String(TeamNum));
        SkinName=default.DefaultSkinName;
      }
    }
    SetSkinElement(SkinActor, 1, SkinName$"2T_"$String(TeamNum), SkinName$"2T_"$String(TeamNum));
    SetSkinElement(SkinActor, 2, SkinName$"3T_"$String(TeamNum), SkinName$"3T_"$String(TeamNum));
    SetSkinElement(SkinActor, 3, SkinName$"4T_"$String(TeamNum), SkinName$"4T_"$String(TeamNum));
  }
  else
  {
    if(!SetSkinElement(SkinActor, 0, SkinName$"1", default.DefaultSkinName))
      SkinName=default.DefaultSkinName;

    SetSkinElement(SkinActor, 1, SkinName$"2", SkinName$"2");
    SetSkinElement(SkinActor, 2, SkinName$"3", SkinName$"3");
    SetSkinElement(SkinActor, 3, SkinName$"4", SkinName$"4");
  }

  if( Pawn(SkinActor) != None )
    Pawn(SkinActor).PlayerReplicationInfo.TalkTexture = Texture(DynamicLoadObject(SkinName$"3Face", class'Texture'));
}

defaultproperties
{
   DefaultSkinName="KonokoFsrvSkins.KonF"
   DefaultPackage="KonokoFsrvSkins."
   SelectionMesh="ONIKonokoFsrv.KonokoFsrv"
   Mesh=SkeletalMesh'ONIKonokoFsrv.KonokoFsrv'
   MenuName="ONI KonokoFsrv"
}
ONIKonokoFsrvBot

Code: Select all

//=============================================================================
// ONIKonokoFsrv Bot.
//=============================================================================
class ONIKonokoFsrvBot extends SkeletalBot;

static function SetMultiSkin(Actor SkinActor, string SkinName, string FaceName, byte TeamNum)
{
  local string MeshName, SkinItem, SkinPackage;

  MeshName = SkinActor.GetItemName(string(SkinActor.Mesh));

  SkinItem = SkinActor.GetItemName(SkinName);
  SkinPackage = Left(SkinName, Len(SkinName) - Len(SkinItem));

  if(SkinPackage == "")
  {
    SkinPackage="KonokoFsrvSkins.";
    SkinName=SkinPackage$SkinName;
  }

  if( TeamNum != 255 )
  {
    if(!SetSkinElement(SkinActor, 0, SkinName$"1T_"$String(TeamNum), ""))
    {
      if(!SetSkinElement(SkinActor, 0, SkinName$"1", ""))
      {
        SetSkinElement(SkinActor, 0, "KonokoFsrvSkins.KonF1T_"$String(TeamNum), "KonokoFsrvSkins.KonF1");
        SkinName="KonokoFsrvSkins.KonF";
      }
    }
    SetSkinElement(SkinActor, 1, SkinName$"2T_"$String(TeamNum), SkinName$"2");
    SetSkinElement(SkinActor, 2, SkinName$"3T_"$String(TeamNum), SkinName$"3");
    SetSkinElement(SkinActor, 3, SkinName$"4T_"$String(TeamNum), SkinName$"4");
  }
  else
  {
    if(!SetSkinElement(SkinActor, 0, SkinName$"1", "KonokoFsrvSkins.KonF1"))
      SkinName="KonokoFsrvSkins.KonF";

    SetSkinElement(SkinActor, 1, SkinName$"2", "");
    SetSkinElement(SkinActor, 2, SkinName$"3", "");
    SetSkinElement(SkinActor, 3, SkinName$"4", "");
  }

  if( Pawn(SkinActor) != None )
    Pawn(SkinActor).PlayerReplicationInfo.TalkTexture = Texture(DynamicLoadObject(SkinName$"3Face", class'Texture'));
}

defaultproperties
{
   DefaultSkinName="KonokoFsrvSkins.KonF"
   DefaultPackage="KonokoFsrvSkins."
   SelectionMesh="ONIKonokoFsrv.KonokoFsrv"
   Mesh=SkeletalMesh'ONIKonokoFsrv.KonokoFsrv'
   MenuName="ONI KonokoFsrv"
}

SelectONIKonokoFsrv

Code: Select all

//=============================================================================
// Select ONI KonokoFsrv.
//=============================================================================
class SelectONIKonokoFsrv extends SelectionDude;

#exec ANIM IMPORT ANIM=KonokoFsrvSelectAnim ANIMFILE=models\KonokoFsrvSelect.PSA COMPRESS=0.5 IMPORTSEQS=0
#exec ANIM SEQUENCE ANIM=KonokoFsrvSelectAnim SEQ=All STARTFRAME=0 NUMFRAMES=48 RATE=15
#exec ANIM SEQUENCE ANIM=KonokoFsrvSelectAnim SEQ=Breath3 STARTFRAME=0 NUMFRAMES=26 RATE=15
#exec ANIM SEQUENCE ANIM=KonokoFsrvSelectAnim SEQ=Breath2 STARTFRAME=26 NUMFRAMES=31 RATE=15
#exec ANIM SEQUENCE ANIM=KonokoFsrvSelectAnim SEQ=Breath1 STARTFRAME=57 NUMFRAMES=31 RATE=15

#exec MESH MODELIMPORT MESH=SelectionKonokoFsrv MODELFILE=models\KonokoFsrv.PSK LODSTYLE=12
#exec MESH ORIGIN MESH=SelectionKonokoFsrv X=0 Y=0 Z=135 YAW=192
#exec MESHMAP SCALE MESHMAP=SelectionKonokoFsrv X=0.3125 Y=0.3125 Z=0.3125
#exec MESH DEFAULTANIM MESH=SelectionKonokoFsrv ANIM=KonokoFsrvSelectAnim

defaultproperties
{
}

The backup folder. The using folder has no "Unreal" text in the name.
aaaaaaaa3.png
Last edited by Rikia on Tue Jan 26, 2021 6:12 pm, edited 3 times in total.
User avatar
EvilGrins
Godlike
Posts: 9690
Joined: Thu Jun 30, 2011 8:12 pm
Personal rank: God of Fudge
Location: Palo Alto, CA
Contact:

Re: Which file is responsible to skeletal player class

Post by EvilGrins »

Most of the U1 characters are a single texture, with the exception of those with team colors but the average UT character is at least 4 textures, also with more for team colors.

Porting characters from U1 to UT is apparently doable, but i'm not sure how well that works in reverse.
http://unreal-games.livejournal.com/
Image
medor wrote:Replace Skaarj with EvilGrins :mrgreen:
Smilies · viewtopic.php?f=8&t=13758
User avatar
OjitroC
Godlike
Posts: 3613
Joined: Sat Sep 12, 2015 8:46 pm

Re: Which file is responsible to skeletal player class

Post by OjitroC »

EvilGrins wrote: Tue Jan 26, 2021 3:32 am Porting characters from U1 to UT is apparently doable, but i'm not sure how well that works in reverse.
Several UT custom models have been ported to Unreal and these can be found on the Snipers Paradise website. I'm not sure though if any of these are skeletal models.

The problem the OP has is that there is no (for example) SkeletalPlayer class in Unreal because there is no SkeletalChars class and so it can't be subclassed. A different method of implementing skeletal players in Unreal needs to be used but I have no idea what that might be.
User avatar
papercoffee
Godlike
Posts: 10447
Joined: Wed Jul 15, 2009 11:36 am
Personal rank: coffee addicted !!!
Location: Cologne, the city with the big cathedral.
Contact:

Re: Which file is responsible to skeletal player class

Post by papercoffee »

Rikia wrote: Mon Jan 25, 2021 9:01 pm...
I have edited your post for better readability.
User avatar
Rikia
Experienced
Posts: 118
Joined: Thu Jan 07, 2021 12:50 pm
Personal rank: Masterful
Location: Planet Na-Pali, Bluff Eversmoking

Re: Which file is responsible to skeletal player class

Post by Rikia »

I succesfully compiled the model and classes, but I'm unable to select the model in player setup.
The log file does not show any warnings about that.

.int files

Code: Select all

[Public]
Object=(Name=ONIKonokoFsrv.ONIKonokoFsrvBot,Class=Class,MetaClass=BotPack.Bot,Description="ONI KonokoFsrv")
Object=(Name=ONIKonokoFsrv.ONIKonokoFsrv,Class=Class,MetaClass=BotPack.TournamentPlayer,Description="ONI KonokoFsrv")
Object=(Name=ONIKonokoFsrv.ONIKonokoFsrv,Class=Texture,Description="ONI KonokoFsrv")
Object=(Name=BotPack.VoiceFemaleTwo,Class=Class,MetaClass=BotPack.VoiceMale,Description="Female TwoM")

Code: Select all

[public]
Object=(Name=KonokoFsrvSkins.KonF0,Class=Texture,Description="ONI KonokoFsrv")
Object=(Name=KonokoFsrvSkins.KonF1t_0,Class=Texture)
Object=(Name=KonokoFsrvSkins.KonF1t_1,Class=Texture)
Object=(Name=KonokoFsrvSkins.KonF1t_2,Class=Texture)
Object=(Name=KonokoFsrvSkins.KonF1t_3,Class=Texture)
Object=(Name=KonokoFsrvSkins.KonF1,Class=Texture,Description="ONI KonokoFsrv")
Object=(Name=KonokoFsrvSkins.KonF2t_0,Class=Texture)
Object=(Name=KonokoFsrvSkins.KonF2t_1,Class=Texture)
Object=(Name=KonokoFsrvSkins.KonF2t_2,Class=Texture)
Object=(Name=KonokoFsrvSkins.KonF2t_3,Class=Texture)
Object=(Name=KonokoFsrvSkins.KonF3Face,Class=Texture,Description="ONI KonokoFsrv")
Last edited by Rikia on Thu Apr 14, 2022 8:39 pm, edited 1 time in total.
User avatar
Rikia
Experienced
Posts: 118
Joined: Thu Jan 07, 2021 12:50 pm
Personal rank: Masterful
Location: Planet Na-Pali, Bluff Eversmoking

Re: Which file is responsible to skeletal player class

Post by Rikia »

I recompiled .psa file with UnPSA Tool and re-exported .psk file with MilkShape3D.
Then I united skeletal player and bot classes with my character classes.
After, I compiled everything with Umake and got "0 warnings".

The animations did not even compile into .u file, because the file is too small(with anims it must have weight near 2mb, while it's only near 100 kb).

And I have no options to import .psk, .psa files into editor.

But the more scarier, I'm getting this, when I'm trying to open my compiled .u package:
pffffffffffffffffffffff.png
pffffffffffffffffffffff.png (16.77 KiB) Viewed 1437 times
The code I have:

Player's class ".uc"

Code: Select all

class ONIKonokoFsrv extends Male
	abstract;

function PlayDying(name DamageType, vector HitLoc)
{
	BaseEyeHeight = Default.BaseEyeHeight;
	PlayDyingSound();
			
	if ( DamageType == 'Suicided' )
	{
		PlayAnim('Dead8',, 0.1);
		return;
	}

	// check for head hit
	if ( (DamageType == 'Decapitated') && !class'GameInfo'.Default.bLowGore )
	{
		PlayDecap();
		return;
	}

	if ( FRand() < 0.15 )
	{
		PlayAnim('Dead2',,0.1);
		return;
	}

	// check for big hit
	if ( (Velocity.Z > 250) && (FRand() < 0.75) )
	{
		if ( FRand() < 0.5 )
			PlayAnim('Dead1',,0.1);
		else
			PlayAnim('Dead11',, 0.1);
		return;
	}

	// check for repeater death
	if ( (Health > -10) && ((DamageType == 'shot') || (DamageType == 'zapped')) )
	{
		PlayAnim('Dead9',, 0.1);
		return;
	}
		
	if ( (HitLoc.Z - Location.Z > 0.7 * CollisionHeight) && !class'GameInfo'.Default.bLowGore )
	{
		if ( FRand() < 0.5 )
			PlayDecap();
		else
			PlayAnim('Dead7',, 0.1);
		return;
	}
	
	if ( Region.Zone.bWaterZone || (FRand() < 0.5) ) //then hit in front or back
		PlayAnim('Dead3',, 0.1);
	else
		PlayAnim('Dead8',, 0.1);
}

function PlayDecap()
{
	PlayAnim('Dead4',, 0.1);
}

function PlayGutHit(float tweentime)
{
	if ( (AnimSequence == 'GutHit') || (AnimSequence == 'Dead2') )
	{
		if (FRand() < 0.5)
			TweenAnim('LeftHit', tweentime);
		else
			TweenAnim('RightHit', tweentime);
	}
	else if ( FRand() < 0.6 )
		TweenAnim('GutHit', tweentime);
	else
		TweenAnim('Dead8', tweentime);

}

function PlayHeadHit(float tweentime)
{
	if ( (AnimSequence == 'HeadHit') || (AnimSequence == 'Dead7') )
		TweenAnim('GutHit', tweentime);
	else if ( FRand() < 0.6 )
		TweenAnim('HeadHit', tweentime);
	else
		TweenAnim('Dead7', tweentime);
}

function PlayLeftHit(float tweentime)
{
	if ( (AnimSequence == 'LeftHit') || (AnimSequence == 'Dead9') )
		TweenAnim('GutHit', tweentime);
	else if ( FRand() < 0.6 )
		TweenAnim('LeftHit', tweentime);
	else 
		TweenAnim('Dead9', tweentime);
}

function PlayRightHit(float tweentime)
{
	if ( (AnimSequence == 'RightHit') || (AnimSequence == 'Dead1') )
		TweenAnim('GutHit', tweentime);
	else if ( FRand() < 0.6 )
		TweenAnim('RightHit', tweentime);
	else
		TweenAnim('Dead1', tweentime);
}

#exec MESH MODELIMPORT MESH=KonokoFsrv MODELFILE=Models/KonokoFsrv.psk
#exec MESH LODPARAMS MESH=KonokoFsrv HYSTERESIS=0.00 STRENGTH=0.01 MINVERTS=10.00 MORPH=0.30 ZDISP=0.00
#exec MESH ORIGIN MESH=KonokoFsrv X=0 Y=0 Z=0 YAW=0 PITCH=0 ROLL=0
#exec ANIM IMPORT ANIM=SoldierAnim ANIMFILE=Models/SoldierAnim.psa COMPRESS=1
#exec MESHMAP SCALE MESHMAP=KonokoFsrv X=1.0 Y=1.0 Z=1.0

#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=Breath1L STARTFRAME=0 NUMFRAMES=24 RATE=24
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=Breath2L STARTFRAME=24 NUMFRAMES=24 RATE=24
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=CockGun STARTFRAME=48 NUMFRAMES=14 RATE=14
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=CockGunL STARTFRAME=62 NUMFRAMES=29 RATE=29
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=DeathEnd STARTFRAME=91 NUMFRAMES=1 RATE=1
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=DeathEnd3 STARTFRAME=92 NUMFRAMES=1 RATE=1
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=Duck STARTFRAME=93 NUMFRAMES=24 RATE=24
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=DuckWlkL STARTFRAME=117 NUMFRAMES=24 RATE=24
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=DuckWlkS STARTFRAME=141 NUMFRAMES=24 RATE=24
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=GutHit STARTFRAME=165 NUMFRAMES=1 RATE=1
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=HeadHit STARTFRAME=166 NUMFRAMES=1 RATE=1
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=JumpLgFr STARTFRAME=167 NUMFRAMES=1 RATE=1
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=Look STARTFRAME=168 NUMFRAMES=22 RATE=22
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=StillFrRp STARTFRAME=190 NUMFRAMES=11 RATE=11
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=StillLgFr STARTFRAME=201 NUMFRAMES=12 RATE=12
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=StillSmFr STARTFRAME=213 NUMFRAMES=12 RATE=12
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=AimDnLg STARTFRAME=225 NUMFRAMES=1 RATE=1
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=AimUpSm STARTFRAME=226 NUMFRAMES=1 RATE=1
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=AimDnSm STARTFRAME=227 NUMFRAMES=1 RATE=1
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=Fighter STARTFRAME=228 NUMFRAMES=1 RATE=1
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=TurnLg STARTFRAME=229 NUMFRAMES=3 RATE=3
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=TurnSm STARTFRAME=232 NUMFRAMES=5 RATE=5
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=Flip STARTFRAME=237 NUMFRAMES=19 RATE=19
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=LeftHit STARTFRAME=256 NUMFRAMES=1 RATE=1
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=RightHit STARTFRAME=257 NUMFRAMES=1 RATE=1
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=SwimLg STARTFRAME=258 NUMFRAMES=18 RATE=18
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=SwimSm STARTFRAME=276 NUMFRAMES=18 RATE=18
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=TreadLg STARTFRAME=294 NUMFRAMES=18 RATE=18
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=TreadSm STARTFRAME=312 NUMFRAMES=18 RATE=18
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=Wave STARTFRAME=330 NUMFRAMES=21 RATE=21
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=Thrust STARTFRAME=351 NUMFRAMES=54 RATE=54
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=Taunt1 STARTFRAME=405 NUMFRAMES=22 RATE=22
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=Victory1 STARTFRAME=427 NUMFRAMES=21 RATE=21
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=DeathEnd2 STARTFRAME=448 NUMFRAMES=1 RATE=1
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=Chat2 STARTFRAME=449 NUMFRAMES=41 RATE=41
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=Chat1 STARTFRAME=490 NUMFRAMES=40 RATE=40
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=Dead1 STARTFRAME=530 NUMFRAMES=20 RATE=20
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=Dead2 STARTFRAME=550 NUMFRAMES=17 RATE=17
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=Dead3 STARTFRAME=567 NUMFRAMES=22 RATE=22
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=Dead4 STARTFRAME=589 NUMFRAMES=20 RATE=20
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=Dead5 STARTFRAME=609 NUMFRAMES=29 RATE=29
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=Dead7 STARTFRAME=638 NUMFRAMES=29 RATE=29
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=Dead8 STARTFRAME=667 NUMFRAMES=29 RATE=29
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=Dead9 STARTFRAME=696 NUMFRAMES=12 RATE=12
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=Dead9B STARTFRAME=708 NUMFRAMES=24 RATE=24
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=Breath1 STARTFRAME=732 NUMFRAMES=25 RATE=25
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=Breath2 STARTFRAME=757 NUMFRAMES=21 RATE=21
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=WalkLg STARTFRAME=778 NUMFRAMES=24 RATE=24
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=WalkLgFr STARTFRAME=802 NUMFRAMES=24 RATE=24
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=WalkSm STARTFRAME=826 NUMFRAMES=24 RATE=24
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=WalkSmFr STARTFRAME=850 NUMFRAMES=24 RATE=24
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=RunLg STARTFRAME=874 NUMFRAMES=18 RATE=18
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=RunLgFr STARTFRAME=892 NUMFRAMES=18 RATE=18
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=RunSm STARTFRAME=910 NUMFRAMES=18 RATE=18
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=RunSmFr STARTFRAME=928 NUMFRAMES=18 RATE=18
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=StrafeL STARTFRAME=946 NUMFRAMES=18 RATE=18
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=StrafeR STARTFRAME=964 NUMFRAMES=18 RATE=18
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=BackRun STARTFRAME=982 NUMFRAMES=18 RATE=18
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=AimUpLg STARTFRAME=1000 NUMFRAMES=1 RATE=1
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=Dead11 STARTFRAME=1001 NUMFRAMES=26 RATE=26
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=DodgeB STARTFRAME=1027 NUMFRAMES=1 RATE=1
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=DodgeF STARTFRAME=1028 NUMFRAMES=1 RATE=1
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=DodgeL STARTFRAME=1029 NUMFRAMES=1 RATE=1
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=DodgeR STARTFRAME=1030 NUMFRAMES=1 RATE=1
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=JumpSmFr STARTFRAME=1031 NUMFRAMES=1 RATE=1
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=LandLgFr STARTFRAME=1032 NUMFRAMES=1 RATE=1
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=LandSmFr STARTFRAME=1033 NUMFRAMES=1 RATE=1
#exec ANIM SEQUENCE ANIM=SoldierAnim SEQ=Challenge STARTFRAME=1034 NUMFRAMES=43 RATE=43
#exec ANIM DIGEST ANIM=SoldierAnim
#exec MESH DEFAULTANIM MESH=KonokoFsrv ANIM=SoldierAnim

// *** ANIMATION NOTIFIES ***
#exec ANIM DIGEST ANIM=SoldierAnim VERBOSE

#exec ANIM NOTIFY ANIM=SoldierAnim SEQ=RunLG TIME=0.25 FUNCTION=PlayFootStep
#exec ANIM NOTIFY ANIM=SoldierAnim SEQ=RunLG TIME=0.75 FUNCTION=PlayFootStep
#exec ANIM NOTIFY ANIM=SoldierAnim SEQ=RunLGFR TIME=0.25 FUNCTION=PlayFootStep
#exec ANIM NOTIFY ANIM=SoldierAnim SEQ=RunLGFR TIME=0.75 FUNCTION=PlayFootStep
#exec ANIM NOTIFY ANIM=SoldierAnim SEQ=RunSM TIME=0.25 FUNCTION=PlayFootStep
#exec ANIM NOTIFY ANIM=SoldierAnim SEQ=RunSM TIME=0.75 FUNCTION=PlayFootStep
#exec ANIM NOTIFY ANIM=SoldierAnim SEQ=RunSMFR TIME=0.25 FUNCTION=PlayFootStep
#exec ANIM NOTIFY ANIM=SoldierAnim SEQ=RunSMFR TIME=0.75 FUNCTION=PlayFootStep
#exec ANIM NOTIFY ANIM=SoldierAnim SEQ=StrafeL TIME=0.25 FUNCTION=PlayFootStep
#exec ANIM NOTIFY ANIM=SoldierAnim SEQ=StrafeL TIME=0.75 FUNCTION=PlayFootStep
#exec ANIM NOTIFY ANIM=SoldierAnim SEQ=StrafeR TIME=0.25 FUNCTION=PlayFootStep
#exec ANIM NOTIFY ANIM=SoldierAnim SEQ=StrafeR TIME=0.75 FUNCTION=PlayFootStep
#exec ANIM NOTIFY ANIM=SoldierAnim SEQ=BackRun TIME=0.25 FUNCTION=PlayFootStep
#exec ANIM NOTIFY ANIM=SoldierAnim SEQ=BackRun TIME=0.75 FUNCTION=PlayFootStep
#exec ANIM NOTIFY ANIM=SoldierAnim SEQ=Dead1 TIME=0.7 FUNCTION=LandThump
#exec ANIM NOTIFY ANIM=SoldierAnim SEQ=Dead2 TIME=0.9 FUNCTION=LandThump
#exec ANIM NOTIFY ANIM=SoldierAnim SEQ=Dead3 TIME=0.45 FUNCTION=LandThump
#exec ANIM NOTIFY ANIM=SoldierAnim SEQ=Dead4 TIME=0.6 FUNCTION=LandThump
#exec ANIM NOTIFY ANIM=SoldierAnim SEQ=Dead7 TIME=0.7 FUNCTION=LandThump
#exec ANIM NOTIFY ANIM=SoldierAnim SEQ=Dead8 TIME=0.7 FUNCTION=LandThump
#exec ANIM NOTIFY ANIM=SoldierAnim SEQ=Dead9B TIME=0.8 FUNCTION=LandThump
#exec ANIM NOTIFY ANIM=SoldierAnim SEQ=Dead11 TIME=0.57 FUNCTION=LandThump
#exec ANIM NOTIFY ANIM=SoldierAnim SEQ=Challenge TIME=0.35 FUNCTION=PlayLoudStep

//#exec TEXTURE IMPORT NAME=KonokoFsrvDoll FILE=TEXTURES\KonokoFsrvSDoll.PCX GROUP="Icons" MIPS=OFF
//#exec TEXTURE IMPORT NAME=KonokoFsrvBelt FILE=TEXTURES\KonokoFsrvSBelt.PCX GROUP="Icons" MIPS=OFF

defaultproperties
{
				Skin=Texture'KonokoFsrvSkins.KonF'
				MenuName="ONI KonokoFsrv"
				Mesh=SkeletalMesh'ONIKonokoFsrv.KonokoFsrv'
				CarcassType=Class'UnrealShare.HumanCarcass'
}
Bot's class ".uc"

Code: Select all

class ONIKonokoFsrvBot extends HumanBot
	abstract;

function PlayVictoryDance()
{
	local float decision;

	decision = FRand();

	if ( decision < 0.4 )
		PlayAnim('Victory1',0.7, 0.2);
	else if ( decision < 0.7 )
		PlayAnim('Thrust',0.7, 0.2);
	else
		PlayAnim('Taunt1',0.7, 0.2);
}

function PlayDying(name DamageType, vector HitLoc)
{
	BaseEyeHeight = Default.BaseEyeHeight;
	PlayDyingSound();
			
	if ( DamageType == 'Suicided' )
	{
		PlayAnim('Dead8',, 0.1);
		return;
	}

	// check for head hit
	if ( (DamageType == 'Decapitated') && !Level.Game.bVeryLowGore )
	{
		PlayDecap();
		return;
	}

	if ( FRand() < 0.15 )
	{
		PlayAnim('Dead2',,0.1);
		return;
	}

	// check for big hit
	if ( (Velocity.Z > 250) && (FRand() < 0.75) )
	{
		if ( FRand() < 0.5 )
			PlayAnim('Dead1',,0.1);
		else
			PlayAnim('Dead11',, 0.1);
		return;
	}

	// check for repeater death
	if ( (Health > -10) && ((DamageType == 'shot') || (DamageType == 'zapped')) )
	{
		PlayAnim('Dead9',, 0.1);
		return;
	}
		
	if ( (HitLoc.Z - Location.Z > 0.7 * CollisionHeight) && !Level.Game.bVeryLowGore )
	{
		if ( FRand() < 0.5 )
			PlayDecap();
		else
			PlayAnim('Dead7',, 0.1);
		return;
	}
	
	if ( Region.Zone.bWaterZone || (FRand() < 0.5) ) //then hit in front or back
		PlayAnim('Dead3',, 0.1);
	else
		PlayAnim('Dead8',, 0.1);
}

function PlayDecap()
{
	PlayAnim('Dead4',, 0.1);
}

function PlayGutHit(float tweentime)
{
	if ( (AnimSequence == 'GutHit') || (AnimSequence == 'Dead2') )
	{
		if (FRand() < 0.5)
			TweenAnim('LeftHit', tweentime);
		else
			TweenAnim('RightHit', tweentime);
	}
	else if ( FRand() < 0.6 )
		TweenAnim('GutHit', tweentime);
	else
		TweenAnim('Dead8', tweentime);

}

function PlayHeadHit(float tweentime)
{
	if ( (AnimSequence == 'HeadHit') || (AnimSequence == 'Dead7') )
		TweenAnim('GutHit', tweentime);
	else if ( FRand() < 0.6 )
		TweenAnim('HeadHit', tweentime);
	else
		TweenAnim('Dead7', tweentime);
}

function PlayLeftHit(float tweentime)
{
	if ( (AnimSequence == 'LeftHit') || (AnimSequence == 'Dead9') )
		TweenAnim('GutHit', tweentime);
	else if ( FRand() < 0.6 )
		TweenAnim('LeftHit', tweentime);
	else 
		TweenAnim('Dead9', tweentime);
}

function PlayRightHit(float tweentime)
{
	if ( (AnimSequence == 'RightHit') || (AnimSequence == 'Dead1') )
		TweenAnim('GutHit', tweentime);
	else if ( FRand() < 0.6 )
		TweenAnim('RightHit', tweentime);
	else
		TweenAnim('Dead1', tweentime);
}

defaultproperties
{
				Skin=Texture'KonokoFsrvSkins.KonF'
				MenuName="ONI KonokoFsrv"
				Mesh=SkeletalMesh'ONIKonokoFsrv.KonokoFsrv'
				CarcassType=Class'UnrealShare.HumanCarcass'
}
User avatar
Rikia
Experienced
Posts: 118
Joined: Thu Jan 07, 2021 12:50 pm
Personal rank: Masterful
Location: Planet Na-Pali, Bluff Eversmoking

Re: [EXPERIMENTAL][WIP]Unreal Basic Skeletal Character

Post by Rikia »

Screenshots for now:
unknown (1).png
20210128212311_1.jpg
Death animation glitch(but it's common bug, even for a skeletal character in UT99)
unknown.png
Normal model sizes and lilliput collision
20210128204036_1.jpg
User avatar
OjitroC
Godlike
Posts: 3613
Joined: Sat Sep 12, 2015 8:46 pm

Re: [EXPERIMENTAL][WIP]Unreal Basic Skeletal Character

Post by OjitroC »

Rikia wrote: Mon Jan 25, 2021 8:33 pm -Player carcass is not working for now, this means your body will just disappear after death
I don't really know but - if you summon the carcass in-game, it appears and it's standing up - so the OniKonokoFsrvCarcass class does work, though not when she is killed in-game.

I may be totally wrong but you have 'AnimSequence="Dead1"' in the script. Perhaps this is being 'read' as the 'Dead1' anim sequence of the model which has 10 or 12 anims rather than a single one. What if you replace that 'Dead1' with one of the DeadEnd anims in the model as these have only one animation?

More generally, you could use the hit/death etc sounds from your KonokoSounds.uax rather than the default female sounds - this would make her sound a bit more like 'her'.
User avatar
Rikia
Experienced
Posts: 118
Joined: Thu Jan 07, 2021 12:50 pm
Personal rank: Masterful
Location: Planet Na-Pali, Bluff Eversmoking

Re: [EXPERIMENTAL][WIP]Unreal Basic Skeletal Character

Post by Rikia »

OjitroC wrote: Thu Jan 28, 2021 8:28 pm
Rikia wrote: Mon Jan 25, 2021 8:33 pm -Player carcass is not working for now, this means your body will just disappear after death
I don't really know but - if you summon the carcass in-game, it appears and it's standing up - so the OniKonokoFsrvCarcass class does work, though not when she is killed in-game.
The bot carcass works instead of the player's one.
OjitroC wrote: Thu Jan 28, 2021 8:28 pm I may be totally wrong but you have 'AnimSequence="Dead1"' in the script. Perhaps this is being 'read' as the 'Dead1' anim sequence of the model which has 10 or 12 anims rather than a single one. What if you replace that 'Dead1' with one of the DeadEnd anims in the model as these have only one animation?
You mean a death animation glitch that also was in UT99?
OjitroC wrote: Thu Jan 28, 2021 8:28 pm More generally, you could use the hit/death etc sounds from your KonokoSounds.uax rather than the default female sounds - this would make her sound a bit more like 'her'.
Are the UT2004 sound packages compatible with Unreal?

---------------------------------------------------------------------
There are 4 hours before the game will be 20!
User avatar
OjitroC
Godlike
Posts: 3613
Joined: Sat Sep 12, 2015 8:46 pm

Re: [EXPERIMENTAL][WIP]Unreal Basic Skeletal Character

Post by OjitroC »

Rikia wrote: Thu Jan 28, 2021 8:49 pm
OjitroC wrote: Thu Jan 28, 2021 8:28 pm I may be totally wrong but you have 'AnimSequence="Dead1"' in the script. Perhaps this is being 'read' as the 'Dead1' anim sequence of the model which has 10 or 12 anims rather than a single one. What if you replace that 'Dead1' with one of the DeadEnd anims in the model as these have only one animation?
You mean a death animation glitch that also was in UT99?
No - I was suggesting to change the AnimSequence in the default properties of the Carcass but I tried it and it didn't work, so you can ignore my comment there.

Rikia wrote: Thu Jan 28, 2021 8:49 pm Are the UT2004 sound packages compatible with Unreal?
Should be as the uax just contains .wav files that are useable by UT and Unreal. You can just import the wav files into the model's .u file if you want - probably better than assigning sounds from the uax as it means you don't have to distribute the uax (particularly when you probably won't use all the sounds in the uax).
User avatar
Rikia
Experienced
Posts: 118
Joined: Thu Jan 07, 2021 12:50 pm
Personal rank: Masterful
Location: Planet Na-Pali, Bluff Eversmoking

Re: [SOURCE FILES]Unreal Basic Skeletal Character[227i]

Post by Rikia »

Actual Screenshots:
1.jpg
2.jpg
3.jpg
4.jpg
User avatar
Rikia
Experienced
Posts: 118
Joined: Thu Jan 07, 2021 12:50 pm
Personal rank: Masterful
Location: Planet Na-Pali, Bluff Eversmoking

Re: [SOURCE FILES]Unreal Basic Skeletal Character[227i]

Post by Rikia »

Important things that I discovered:

1. You musn't edit your .ini file while you installing custom model/skin(that's feature of 227i patch)
2. If you are gonna compile a new model, you must remove "EditPackages= * " of your older model from your .ini file

That's because when packages are selected, UCC/UMake scan everything of them. If your new model has same content, for example, animations, which has your older model, then these animations will not be imported into your new model and you wouldn't get it work properly.
User avatar
Rikia
Experienced
Posts: 118
Joined: Thu Jan 07, 2021 12:50 pm
Personal rank: Masterful
Location: Planet Na-Pali, Bluff Eversmoking

Re: [SOURCE FILES]Unreal Basic Skeletal Character[227i]

Post by Rikia »

New model port made on this base:
g1.jpg
https://gamebanana.com/skins/186893
Post Reply