Yeah, kinda: I originally stored them as textures, so my POVcorpse had
var texture savedmultiskin[8];
but that went all fucking tits up (as described), so what I do now is store them as strings, i.e. actual text, so I'm not storing the texture maletex4, I'm storing the actual text "deusexcharacters.skins.maletex4", and then when needed, I force the game to go hunt for the texture with that name and load it up, then apply it. So
var string storedskin[8];
and then at the other end:
for(i=0;i<8;i++)
{
tex = texture(dynamicloadobject(POVCorpse.storedskin,class'texture',true));
if(tex != none) //because it might fuck up
carc.multiskins = tex;
}
and so on. It's...not good. If TNM has stuff that works, use that. Totally use that.
tnm's perks
Re: tnm's perks
OK, I got this to work, and it probably has some fluff, but maybe not. Anytime it references "IWRwhatever" (it -was- tnm (for the record), but you'll have to replace it with your own class-name or package. This is gonna turn into a wall-o-text, but hey, as long as the site exists, it could be useful to future reference or generations:
You'll need to add this to your player class:
Create a custom pawn super class, like this:
Create a custom carcass class like this:
Finally, create a custom POVCorpse uc file like this:
Now that you have the capability, you simply need to create generic pawn classes like IWRHumanCivilian which expand IWRPawn. Simply copy paste DX's HumanCivilian, changing the name. Then create basic corpses, one for each of the meshes, extending IWRCarcass like:
And then create your pawns, one for each mesh, extending the custom pawn class, like:
Thank you DDL for pointing me in the right direction.
Problem: no one is fearing the custom carcass. I'll look into it.
Oh nevermind, I needed to put the default properties of IWRCarcass in there which set bEmitCarcass=True. Added in.
Ooo. I can even set their multi-skins to textures named "Pants", "Ponytail", and "Lenses", so I won't have to reference the guide. this is awesome. Thanks guys.
You'll need to add this to your player class:
Code: Select all
// ----------------------------------------------------------------------
// DropItem()
//
// throws an item where you are currently looking
// or places it on your currently highlighted object
// if None is passed in, it drops what's inHand
// ----------------------------------------------------------------------
exec function bool DropItem(optional Inventory inv, optional bool bDrop)
{
local Inventory item;
local Inventory previousItemInHand;
local Vector X, Y, Z, dropVect;
local float size, mult;
local DeusExCarcass carc;
local class<DeusExCarcass> carcClass;
local bool bDropped;
local bool bRemovedFromSlots;
local int itemPosX, itemPosY;
local int i;
bDropped = True;
if (RestrictInput())
return False;
if (inv == None)
{
previousItemInHand = inHand;
item = inHand;
}
else
{
item = inv;
}
if (item != None)
{
GetAxes(Rotation, X, Y, Z);
dropVect = Location + (CollisionRadius + 2*item.CollisionRadius) * X;
dropVect.Z += BaseEyeHeight;
// check to see if we're blocked by terrain
if (!FastTrace(dropVect))
{
ClientMessage(CannotDropHere);
return False;
}
// don't drop it if it's in a strange state
if (item.IsA('DeusExWeapon'))
{
if (!DeusExWeapon(item).IsInState('Idle') && !DeusExWeapon(item).IsInState('Idle2') &&
!DeusExWeapon(item).IsInState('DownWeapon') && !DeusExWeapon(item).IsInState('Reload'))
{
return False;
}
else // make sure the scope/laser are turned off
{
DeusExWeapon(item).ScopeOff();
DeusExWeapon(item).LaserOff();
}
}
// Don't allow active ChargedPickups to be dropped
if ((item.IsA('ChargedPickup')) && (ChargedPickup(item).IsActive()))
{
return False;
}
// don't let us throw away the nanokeyring
if (item.IsA('NanoKeyRing'))
{
return False;
}
// take it out of our hand
if (item == inHand)
PutInHand(None);
// handle throwing pickups that stack
if (item.IsA('DeusExPickup'))
{
// turn it off if it is on
if (DeusExPickup(item).bActive)
DeusExPickup(item).Activate();
DeusExPickup(item).NumCopies--;
UpdateBeltText(item);
if (DeusExPickup(item).NumCopies > 0)
{
// put it back in our hand, but only if it was in our
// hand originally!!!
if (previousItemInHand == item)
PutInHand(previousItemInHand);
item = Spawn(item.Class, Owner);
}
else
{
// Keep track of this so we can undo it
// if necessary
bRemovedFromSlots = True;
itemPosX = item.invPosX;
itemPosY = item.invPosY;
// Remove it from the inventory slot grid
RemoveItemFromSlot(item);
// make sure we have one copy to throw!
DeusExPickup(item).NumCopies = 1;
}
}
else
{
// Keep track of this so we can undo it
// if necessary
bRemovedFromSlots = True;
itemPosX = item.invPosX;
itemPosY = item.invPosY;
// Remove it from the inventory slot grid
RemoveItemFromSlot(item);
}
// if we are highlighting something, try to place the object on the target
if ((FrobTarget != None) && !item.IsA('POVCorpse'))
{
item.Velocity = vect(0,0,0);
// play the correct anim
PlayPickupAnim(FrobTarget.Location);
// try to drop the object about one foot above the target
size = FrobTarget.CollisionRadius - item.CollisionRadius * 2;
dropVect.X = size/2 - FRand() * size;
dropVect.Y = size/2 - FRand() * size;
dropVect.Z = FrobTarget.CollisionHeight + item.CollisionHeight + 16;
if (FastTrace(dropVect))
{
item.DropFrom(FrobTarget.Location + dropVect);
}
else
{
ClientMessage(CannotDropHere);
bDropped = False;
}
}
else
{
// throw velocity is based on augmentation
if (AugmentationSystem != None)
{
mult = AugmentationSystem.GetAugLevelValue(class'AugMuscle');
if (mult == -1.0)
mult = 1.0;
}
if (bDrop)
{
item.Velocity = VRand() * 30;
// play the correct anim
PlayPickupAnim(item.Location);
}
else
{
item.Velocity = Vector(ViewRotation) * mult * 300 + vect(0,0,220) + 40 * VRand();
// play a throw anim
PlayAnim('Attack',,0.1);
}
GetAxes(ViewRotation, X, Y, Z);
dropVect = Location + 0.8 * CollisionRadius * X;
dropVect.Z += BaseEyeHeight;
// if we are a corpse, spawn the actual carcass
if (item.IsA('POVCorpse'))
{
if (POVCorpse(item).carcClassString != "")
{
carcClass = class<DeusExCarcass>(DynamicLoadObject(POVCorpse(item).carcClassString, class'Class'));
if (carcClass != None)
{
carc = Spawn(carcClass);
if (carc != None)
{
carc.Mesh = carc.Mesh2;
carc.KillerAlliance = POVCorpse(item).KillerAlliance;
carc.KillerBindName = POVCorpse(item).KillerBindName;
carc.Alliance = POVCorpse(item).Alliance;
carc.bNotDead = POVCorpse(item).bNotDead;
carc.bEmitCarcass = POVCorpse(item).bEmitCarcass;
carc.CumulativeDamage = POVCorpse(item).CumulativeDamage;
carc.MaxDamage = POVCorpse(item).MaxDamage;
carc.itemName = POVCorpse(item).CorpseItemName;
carc.CarcassName = POVCorpse(item).CarcassName;
carc.Velocity = item.Velocity * 0.5;
item.Velocity = vect(0,0,0);
carc.bHidden = False;
carc.SetPhysics(PHYS_Falling);
carc.SetScaleGlow();
carc.tag = iwrPOVcorpse(item).InheritedTag;
IWRcarcass(carc).givenname = iwrPOVcorpse(item).givenname;
IWRcarcass(carc).givenbindname = iwrPOVcorpse(item).givenbindname;
IWRcarcass(carc).health = iwrPOVcorpse(item).health;
IWRcarcass(carc).bImportant = iwrPOVcorpse(item).bImportant;
for ( i=0;i<8;i++)
carc.multiskins[i] = iwrPOVcorpse(item).InheritedMultiskins[i];
if (carc.SetLocation(dropVect))
{
// must circumvent PutInHand() since it won't allow
// things in hand when you're carrying a corpse
SetInHandPending(None);
item.Destroy();
item = None;
}
else
{
carc.bHidden = True;
carc.Destroy(); //no idea why this wasn't being done.
}
}
}
}
}
else
{
if (FastTrace(dropVect))
{
item.DropFrom(dropVect);
item.bFixedRotationDir = True;
item.RotationRate.Pitch = (32768 - Rand(65536)) * 4.0;
item.RotationRate.Yaw = (32768 - Rand(65536)) * 4.0;
}
}
}
// if we failed to drop it, put it back inHand
if (item != None)
{
if (((inHand == None) || (inHandPending == None)) && (item.Physics != PHYS_Falling))
{
PutInHand(item);
ClientMessage(CannotDropHere);
bDropped = False;
}
else
{
item.Instigator = Self;
}
}
}
else if (CarriedDecoration != None)
{
DropDecoration();
// play a throw anim
PlayAnim('Attack',,0.1);
}
// If the drop failed and we removed the item from the inventory
// grid, then we need to stick it back where it came from so
// the inventory doesn't get fucked up.
if ((bRemovedFromSlots) && (item != None) && (!bDropped))
{
//DEUS_EX AMSD Use the function call for this, helps multiplayer
PlaceItemInSlot(item, itemPosX, itemPosY);
}
return bDropped;
}
Code: Select all
//=============================================================================
// IWRPawn.
//=============================================================================
class IWRPawn extends ScriptedPawn;
// ----------------------------------------------------------------------
// SpawnCarcass()
// ----------------------------------------------------------------------
function transferskins(IWRcarcass carc)
{
local int i;
for(i=0;i<8;i++)
carc.multiskins[i] = multiskins[i];
//paranoia check
carc.skin = skin;
carc.texture = texture;
//additional shit if you really need (uncomment to add)
//carc.drawscale = drawscale;
}
function Carcass SpawnCarcass()
{
local IWRcarcass carc;
local vector loc;
local Inventory item, nextItem;
local FleshFragment chunk;
local int i;
local float size;
// if we really got blown up good, gib us and don't display a carcass
if ((Health < -100) && !IsA('Robot'))
{
size = (CollisionRadius + CollisionHeight) / 2;
if (size > 10.0)
{
for (i=0; i<size/4.0; i++)
{
loc.X = (1-2*FRand()) * CollisionRadius;
loc.Y = (1-2*FRand()) * CollisionRadius;
loc.Z = (1-2*FRand()) * CollisionHeight;
loc += Location;
chunk = spawn(class'FleshFragment', None,, loc);
if (chunk != None)
{
chunk.DrawScale = size / 25;
chunk.SetCollisionSize(chunk.CollisionRadius / chunk.DrawScale, chunk.CollisionHeight / chunk.DrawScale);
chunk.bFixedRotationDir = True;
chunk.RotationRate = RotRand(False);
}
}
}
return None;
}
// spawn the carcass
carc = IWRcarcass(Spawn(CarcassType));
if ( carc != None )
{
if (bStunned)
carc.bNotDead = True;
carc.Initfor(self);
TransferSkins(carc);
// move it down to the floor
loc = Location;
loc.z -= Default.CollisionHeight;
loc.z += carc.Default.CollisionHeight;
carc.SetLocation(loc);
carc.Velocity = Velocity;
carc.Acceleration = Acceleration;
// give the carcass the pawn's inventory if we aren't an animal or robot
if (!IsA('Animal') && !IsA('Robot'))
{
if (Inventory != None)
{
do
{
item = Inventory;
nextItem = item.Inventory;
DeleteInventory(item);
if ((DeusExWeapon(item) != None) && (DeusExWeapon(item).bNativeAttack))
item.Destroy();
else
carc.AddInventory(item);
item = nextItem;
}
until (item == None);
}
}
}
return carc;
}
Code: Select all
class IWRcarcass extends deusexcarcass;
// ----------------------------------------------------------------------
// Frob()
//
// search the body for inventory items and give them to the frobber
// ----------------------------------------------------------------------
var bool bSearched;
var float health;
var string givenname;
var string givenbindname;
var() bool bImportant;
var bool binwater;
var float drowntime;
function Frob(Actor Frobber, Inventory frobWith)
{
local Inventory item, nextItem, startItem;
local Pawn P;
local DeusExWeapon W;
local bool bFoundSomething;
local DeusExPlayer player;
local ammo AmmoType;
local bool bPickedItemUp;
local iwrPOVCorpse corpse;
local DeusExPickup invItem;
local int itemCount;
local int i;
local float stack_z;
//log("DeusExCarcass::Frob()--------------------------------");
// Can we assume only the *PLAYER* would actually be frobbing carci?
player = DeusExPlayer(Frobber);
// No doublefrobbing in multiplayer.
if (bQueuedDestroy)
return;
bFoundSomething = False;
bSearchMsgPrinted = False;
P = Pawn(Frobber);
if (P != None)
{
// Make sure the "Received Items" display is cleared
// DEUS_EX AMSD Don't bother displaying in multiplayer. For propagation
// reasons it is a lot more of a hassle than it is worth.
if ( (player != None) && (Level.NetMode == NM_Standalone) )
DeusExRootWindow(player.rootWindow).hud.receivedItems.RemoveItems();
if (Inventory != None && !bSearched)
{
item = Inventory;
startItem = item;
do
{
// log("===>DeusExCarcass:item="$item );
nextItem = item.Inventory;
bPickedItemUp = False;
if (item.IsA('Ammo'))
{
// Only let the player pick up ammo that's already in a weapon
DeleteInventory(item);
item.Destroy();
item = None;
}
else if ( (item.IsA('DeusExWeapon')) )
{
// Any weapons have their ammo set to a random number of rounds (1-4)
// unless it's a grenade, in which case we only want to dole out one.
// DEUS_EX AMSD In multiplayer, give everything away.
W = DeusExWeapon(item);
// Grenades and LAMs always pickup 1
if (W.IsA('WeaponNanoVirusGrenade') ||
W.IsA('WeaponGasGrenade') ||
W.IsA('WeaponEMPGrenade') ||
W.IsA('WeaponLAM'))
W.PickupAmmoCount = 1;
else if (Level.NetMode == NM_Standalone)
W.PickupAmmoCount = Rand(4) + 1;
}
if (item != None)
{
bFoundSomething = True;
if (item.IsA('NanoKey'))
{
if (player != None)
{
player.PickupNanoKey(NanoKey(item));
AddReceivedItem(player, item, 1);
DeleteInventory(item);
item.Destroy();
item = None;
}
bPickedItemUp = True;
}
else if (item.IsA('Credits')) // I hate special cases
{
if (player != None)
{
AddReceivedItem(player, item, Credits(item).numCredits);
player.Credits += Credits(item).numCredits;
P.ClientMessage(Sprintf(Credits(item).msgCreditsAdded, Credits(item).numCredits));
DeleteInventory(item);
item.Destroy();
item = None;
}
bPickedItemUp = True;
}
else if (item.IsA('DeusExWeapon')) // I *really* hate special cases
{
// Okay, check to see if the player already has this weapon. If so,
// then just give the ammo and not the weapon. Otherwise give
// the weapon normally.
W = DeusExWeapon(player.FindInventoryType(item.Class));
// If the player already has this item in his inventory, piece of cake,
// we just give him the ammo. However, if the Weapon is *not* in the
// player's inventory, first check to see if there's room for it. If so,
// then we'll give it to him normally. If there's *NO* room, then we
// want to give the player the AMMO only (as if the player already had
// the weapon).
if ((W != None) || ((W == None) && (!player.FindInventorySlot(item, True))))
{
// Don't bother with this is there's no ammo
if ((Weapon(item).AmmoType != None) && (Weapon(item).AmmoType.AmmoAmount > 0))
{
AmmoType = Ammo(player.FindInventoryType(Weapon(item).AmmoName));
if ((AmmoType != None) && (AmmoType.AmmoAmount < AmmoType.MaxAmmo))
{
AmmoType.AddAmmo(Weapon(item).PickupAmmoCount);
AddReceivedItem(player, AmmoType, Weapon(item).PickupAmmoCount);
// Update the ammo display on the object belt
player.UpdateAmmoBeltText(AmmoType);
// if this is an illegal ammo type, use the weapon name to print the message
if (AmmoType.PickupViewMesh == Mesh'TestBox')
P.ClientMessage(item.PickupMessage @ item.itemArticle @ item.itemName, 'Pickup');
else
P.ClientMessage(AmmoType.PickupMessage @ AmmoType.itemArticle @ AmmoType.itemName, 'Pickup');
// Mark it as 0 to prevent it from being added twice
Weapon(item).AmmoType.AmmoAmount = 0;
}
}
// Print a message "Cannot pickup blah blah blah" if inventory is full
// and the player can't pickup this weapon, so the player at least knows
// if he empties some inventory he can get something potentially cooler
// than he already has.
if ((W == None) && (!player.FindInventorySlot(item, True)))
{
P.ClientMessage(Sprintf(Player.InventoryFull, item.itemName));
DeleteInventory(item);
stack_z+=4.0;
item.DropFrom(Location+vect(0,0,1)*stack_z+VRand()*CollisionRadius*vect(1,1,0));
}
// Only destroy the weapon if the player already has it.
if (W != None)
{
// Destroy the weapon, baby!
DeleteInventory(item);
item.Destroy();
item = None;
}
bPickedItemUp = True;
}
}
else if (item.IsA('DeusExAmmo'))
{
if (DeusExAmmo(item).AmmoAmount == 0)
bPickedItemUp = True;
}
if (!bPickedItemUp)
{
// Special case if this is a DeusExPickup(), it can have multiple copies
// and the player already has it.
if ((item.IsA('DeusExPickup')) && (DeusExPickup(item).bCanHaveMultipleCopies) && (player.FindInventoryType(item.class) != None))
{
invItem = DeusExPickup(player.FindInventoryType(item.class));
itemCount = DeusExPickup(item).numCopies;
// Make sure the player doesn't have too many copies
if ((invItem.MaxCopies > 0) && (DeusExPickup(item).numCopies + invItem.numCopies > invItem.MaxCopies))
{
// Give the player the max #
if ((invItem.MaxCopies - invItem.numCopies) > 0)
{
itemCount = (invItem.MaxCopies - invItem.numCopies);
DeusExPickup(item).numCopies -= itemCount;
invItem.numCopies = invItem.MaxCopies;
P.ClientMessage(invItem.PickupMessage @ invItem.itemArticle @ invItem.itemName, 'Pickup');
AddReceivedItem(player, invItem, itemCount);
}
else
{
P.ClientMessage(Sprintf(msgCannotPickup, invItem.itemName));
DeleteInventory(item);
stack_z+=4.0;
item.DropFrom(Location+vect(0,0,1)*stack_z+VRand()*CollisionRadius*vect(1,1,0));
}
}
else
{
invItem.numCopies += itemCount;
DeleteInventory(item);
P.ClientMessage(invItem.PickupMessage @ invItem.itemArticle @ invItem.itemName, 'Pickup');
AddReceivedItem(player, invItem, itemCount);
}
}
else
{
if (!player.FindInventorySlot(item, True))
{
P.ClientMessage(Sprintf(Player.InventoryFull, item.itemName));
DeleteInventory(item);
stack_z+=4.0;
item.DropFrom(Location+vect(0,0,1)*stack_z+VRand()*CollisionRadius*vect(1,1,0));
}
// check if the pawn is allowed to pick this up
else if ((P.Inventory == None) || (Level.Game.PickupQuery(P, item)))
{
DeusExPlayer(P).FrobTarget = item;
if (DeusExPlayer(P).HandleItemPickup(Item) != False)
{
DeleteInventory(item);
// DEUS_EX AMSD Belt info isn't always getting cleaned up. Clean it up.
item.bInObjectBelt=False;
item.BeltPos=-1;
item.SpawnCopy(P);
// Show the item received in the ReceivedItems window and also
// display a line in the Log
AddReceivedItem(player, item, 1);
P.ClientMessage(Item.PickupMessage @ Item.itemArticle @ Item.itemName, 'Pickup');
PlaySound(Item.PickupSound);
}
}
else
{
DeleteInventory(item);
item.Destroy();
item = None;
}
}
}
}
item = nextItem;
}
until ((item == None) || (item == startItem));
}
//log(" bFoundSomething = " $ bFoundSomething);
}
if ( !bFoundSomething || bSearched)
{
// if we've already been searched, let the player pick us up
// don't pick up animal carcii
if (!bAnimalCarcass)
{
// DEUS_EX AMSD Since we don't have animations for carrying corpses, and since it has no real use in multiplayer,
// and since the PutInHand propagation doesn't just work, this is work we don't need to do.
// Were you to do it, you'd need to check the respawning issue, destroy the POVcorpse it creates and point to the
// one in inventory (like I did when giving the player starting inventory).
// Smoke39 - if we have nothing OR we've been searched
if ((Inventory == None) && (player != None) && (player.inHand == None) && (Level.NetMode == NM_Standalone))
{
if (!bInvincible)
{
corpse = Spawn(class'iwrPOVCorpse');
if (corpse != None)
{
// destroy the actual carcass and put the fake one
// in the player's hands
corpse.carcClassString = String(Class);
corpse.KillerAlliance = KillerAlliance;
corpse.KillerBindName = KillerBindName;
corpse.Alliance = Alliance;
corpse.bNotDead = bNotDead;
corpse.bEmitCarcass = bEmitCarcass;
corpse.CumulativeDamage = CumulativeDamage;
corpse.MaxDamage = MaxDamage;
corpse.CorpseItemName = itemName;
corpse.CarcassName = CarcassName;
corpse.Frob(player, None);
corpse.SetBase(player);
corpse.health = health;
corpse.givenname = givenname;
corpse.givenbindname = givenbindname;
corpse.bImportant = bImportant;
corpse.InheritedTag = Tag;
for (i = 0;i<8;i++)
corpse.InheritedMultiSkinsStr[i] = ""$Multiskins[i];
corpse.InheritedSkinStr = ""$Skin;
corpse.InheritedTextureStr = ""$Texture;
corpse.bCheckSkins=true;
player.PutInHand(corpse);
bQueuedDestroy=True;
Destroy();
return;
}
}
}
}
}
if (!bFoundSomething)
P.ClientMessage(msgEmpty);
// Smoke39 - record that we've been searched
bSearched = true;
if ((player != None) && (Level.Netmode != NM_Standalone))
{
player.ClientMessage(Sprintf(msgRecharged, 25));
PlaySound(sound'BioElectricHiss', SLOT_None,,, 256);
player.Energy += 25;
if (player.Energy > player.EnergyMax)
player.Energy = player.EnergyMax;
}
//no idea why this is even there in their code Super.Frob(Frobber, frobWith);
if ((Level.Netmode != NM_Standalone) && (Player != None))
{
bQueuedDestroy = true;
Destroy();
}
}
defaultproperties
{
Health=20.000000
bEmitCarcass=True
}
Code: Select all
class iwrPOVcorpse extends povcorpse;
var travel float health;
var travel string givenname;
var travel string givenbindname;
var travel string InheritedMultiSkinsStr[8];
var travel string InheritedTextureStr;
var travel string InheritedSkinStr;
var travel bool bCheckSkins;
var travel bool bImportant;
var travel name InheritedTag;
var bool bTravelUpdated;
var texture InheritedMultiSkins[8];
var texture InheritedTexture;
var texture InheritedSkin;
function Tick(float deltaTime)
{
local int i;
super.Tick(deltaTime);
if(bCheckSkins && !bTravelUpdated)
{
bTravelUpdated=true;
for(i=0;i<8;i++)
InheritedMultiSkins[i]=Texture(DynamicLoadObject(InheritedMultiSkinsStr[i],class'Texture'));
InheritedSkin=Texture(DynamicLoadObject(InheritedSkinStr,class'Texture'));
InheritedTexture=Texture(DynamicLoadObject(InheritedTextureStr,class'Texture'));
}
}
defaultproperties
{
Health=20.000000
}
Code: Select all
//=============================================================================
// GMSuitCarc.
//=============================================================================
class GMSuitCarc extends IWRCarcass;
defaultproperties
{
Mesh2=LodMesh'DeusExCharacters.GM_Suit_CarcassB'
Mesh3=LodMesh'DeusExCharacters.GM_Suit_CarcassC'
Mesh=LodMesh'DeusExCharacters.GM_Suit_Carcass'
MultiSkins(0)=Texture'DeusExCharacters.Skins.ButlerTex0'
MultiSkins(1)=Texture'DeusExCharacters.Skins.PantsTex5'
MultiSkins(2)=Texture'DeusExCharacters.Skins.ButlerTex0'
MultiSkins(3)=Texture'DeusExCharacters.Skins.ButlerTex1'
MultiSkins(4)=Texture'DeusExCharacters.Skins.ButlerTex1'
MultiSkins(5)=Texture'DeusExItems.Skins.GrayMaskTex'
MultiSkins(6)=Texture'DeusExItems.Skins.BlackMaskTex'
MultiSkins(7)=Texture'DeusExItems.Skins.PinkMaskTex'
}
Code: Select all
//=============================================================================
// GMSuit.
//=============================================================================
class GMSuit extends IWRHumanCivilian;
defaultproperties
{
CarcassType=Class'IWR.GMSuitCarc'
WalkingSpeed=0.210000
walkAnimMult=0.750000
GroundSpeed=180.000000
Mesh=LodMesh'DeusExCharacters.GM_Suit'
MultiSkins(0)=Texture'DeusExCharacters.Skins.SecretServiceTex0'
MultiSkins(1)=Texture'DeusExCharacters.Skins.PantsTex5'
MultiSkins(2)=Texture'DeusExCharacters.Skins.SecretServiceTex0'
MultiSkins(3)=Texture'DeusExCharacters.Skins.ButlerTex1'
MultiSkins(4)=Texture'DeusExCharacters.Skins.ButlerTex1'
MultiSkins(5)=Texture'DeusExItems.Skins.GrayMaskTex'
MultiSkins(6)=Texture'DeusExItems.Skins.BlackMaskTex'
MultiSkins(7)=Texture'DeusExItems.Skins.PinkMaskTex'
CollisionRadius=20.000000
CollisionHeight=47.500000
BindName="Whatever"
FamiliarName="What Ever"
UnfamiliarName="What Ever"
}
Problem: no one is fearing the custom carcass. I'll look into it.
Oh nevermind, I needed to put the default properties of IWRCarcass in there which set bEmitCarcass=True. Added in.
Ooo. I can even set their multi-skins to textures named "Pants", "Ponytail", and "Lenses", so I won't have to reference the guide. this is awesome. Thanks guys.
What I do in my other free time:
http://www.youtube.com/watch?v=e3FfPUKuGsQ
http://www.youtube.com/watch?v=e3FfPUKuGsQ