Will you allow me to make my own replacement mod using your skins as an alternative if you decide to do IsA checks? Honestly I'm going to anyway once you release these works of art but it would be nice if I got your OK
![Wink ;)](./images/smilies/wink.gif)
Moderator: ahaigh01
This is the only way I would agree to use a mutator. If subclasses of scripted pawns did not display the new skin (or displayed my skins over a custom skin), then I would prefer modifying UnrealShare and UnrealI.though, your modifications will only work for the classic named monsters, if you really wanted to make exact checks, you could check multiskins, skin, and texture/mesh to figure out what a custom pawn is using, this way a subclass of iceskaarj would get the proper iceskaarj updated textures assuming it is not already using a custom skin.
I cannot strongly enough suggesting having a private conversation with any of a number of the good content developers here and letting one of them do the mod for you that does the replacement. There is no reason at all to consider the above as a possible solution.I would prefer modifying UnrealShare and UnrealI.
UEngine was made with these types of changes to be possible via simple mutators, it's just they will need to be done carefully to not have unintended consequences.
Don't let super high quality work get mired in an improper rollout like DieHard's did. Your work could all happen smoothly but you'll need to take the time to have it done correctly. Oh, and don't deeply overthink the larger effort of this project. Servers will love using new skins but I would suggest you release just them for now. I'm looking forward to these but my interest in reskinning other things (like gibs, etc) falls way off.
It's not that your work isn't great. For me it's more that changing too much of the game starts to remove the reason I still play it. It's the same reason I don't use DieHard's fantastic work too. I expect the game to look a certain way, changing too much of that creates an 'uncanny valley' for me that weirdly removes some of the pleasure of playing.
I ran a L4D2 server that had a custom Unreal map set on it. You can see these in several YT vids of gameplay. Certain sections of Unreal maps are very carefully remade and look stunning in the Source engine. It also feels totally wrong because the detail is so high and the textures so clean and crisp.
Anyway, just the ramblings of a puritan player.
This will work in both games.Are you making this mutator for 227 or UT99? Or will it be both?
Code: Select all
var enum ESlot
{
S_Skin,
S_MultiSkins
} Slot;
struct STex
{
var() texture Old;
var() string New;
};
struct SData
{
var() mesh Mesh;
var() ESlot Slot;
var() STex Tex[16];
};
var() SData Data[64];
function bool CheckReplacement(Actor Other, out byte bSuperRelevant)
{
local int i, j;
for (i = 0; i < ArrayCount(Data); i++)
{
if (Data[i].Tex[0].New == "")
return true;
if (Other.Mesh == Data[i].Mesh)
{
for (j = 0; j < ArrayCount(Data[0].Tex); j++)
{
if (Data[i].Tex[j].New == "")
break;
switch (Data[i].Slot)
{
case S_Skin:
if (Other.Skin == Data[i].Tex[j].Old)
Other.Skin = texture(DynamicLoadObject(Data[i].Tex[j].New, Class'Texture'));
break;
case S_MultiSkins:
Other.MultiSkins[1] = texture(DynamicLoadObject(Data[i].Tex[j].New, Class'Texture'));
break;
}
}
}
}
return true;
}
defaultproperties
{
Data(0)=(Mesh=LodMesh'UnrealShare.Skaarjw',Slot=S_Skin,Tex(0)=(Old=None,New="Ancient.Base.GRENMRBL"),Tex(1)=(Old=Texture'UnrealI.Skins.Skaarjw3',New="Ancient.Base.A_bs4"))
Data(1)=(Mesh=LodMesh'UnrealI.Pupae1',Slot=S_MultiSkins,Tex(0)=(Old=None,New="Ancient.Base.Crunchyd"))
}
Code: Select all
enum ESlot
{
S_Skin,
S_MultiSkins
};
struct STex
{
var texture Old[8];
var string New[8];
};
struct SData
{
var mesh Mesh;
var ESlot Slot;
var STex Tex[16];
};
var SData Data[64];
function bool CheckReplacement(Actor Other, out byte bSuperRelevant)
{
local int i, j, m;
local bool TexBreak;
for (i = 0; i < ArrayCount(Data); i++)
{
if (Data[i].Mesh == None)
return true;
if (Other.Mesh == Data[i].Mesh)
{
for (j = 0; j < ArrayCount(Data[0].Tex); j++)
{
If (Data[i].Slot == S_Skin)
{
if (Data[i].Tex[j].New[0] != "")
{
if (Other.Skin == Data[i].Tex[j].Old[0])
Other.Skin = texture(DynamicLoadObject(Data[i].Tex[j].New[0], Class'Texture'));
}
else
break;
}
else if (Data[i].Slot == S_MultiSkins)
{
if (TexBreak)
break;
TexBreak = True;
for (m = 0; m < 8; m++)
{
if (Data[i].Tex[j].New[m] != "")
{
if (Other.MultiSkins[m] == Data[i].Tex[j].Old[m])
Other.MultiSkins[m] = texture(DynamicLoadObject(Data[i].Tex[j].New[m], Class'Texture'));
TexBreak = False;
}
}
}
}
}
}
return true;
}
function PreBeginPlay()
{
Data[0].Mesh = LodMesh'UnrealShare.Skaarjw';
Data[0].Slot = S_Skin;
Data[0].Tex[0].Old[0] = None;
Data[0].Tex[0].New[0] = "Ancient.Base.GRENMRBL";
Data[0].Tex[1].Old[0] = Texture'UnrealI.Skins.Skaarjw3';
Data[0].Tex[1].New[0] = "Ancient.Base.A_bs4";
Data[1].Mesh = LodMesh'UnrealI.Pupae1';
Data[1].Slot = S_MultiSkins;
Data[1].Tex[0].Old[1] = None;
Data[1].Tex[0].New[1] = "Ancient.Base.Crunchyd";
Data[2].Mesh = LodMesh'UnrealI.KrallM';
Data[2].Slot = S_Skin;
Data[2].Tex[0].Old[0] = None;
Data[2].Tex[0].New[0] = "Ancient.Base.BRIXGBAS";
Data[2].Tex[1].Old[0] = Texture'UnrealI.Skins.ekrall';
Data[2].Tex[1].New[0] = "Ancient.Base.CRUNCHYB";
}
Code: Select all
enum ESlot
{
S_Skin,
S_MultiSkins
};
struct STex
{
var texture Old[8];
var string New[8];
};
struct SData
{
var mesh Mesh;
var ESlot Slot;
var STex Tex[16];
};
var SData Data[64];
function bool CheckReplacement(Actor Other, out byte bSuperRelevant)
{
local int i, j, m;
local bool TexBreak;
if (Other.Mesh == None)
return true;
for (i = 0; i < ArrayCount(Data); i++)
{
if (Data[i].Mesh == None)
return true;
if (Other.Mesh == Data[i].Mesh)
{
for (j = 0; j < ArrayCount(Data[0].Tex); j++)
{
if (Data[i].Slot == S_Skin)
{
if (Data[i].Tex[j].New[0] != "")
{
if (Other.Skin == Data[i].Tex[j].Old[0])
Other.Skin = texture(DynamicLoadObject(Data[i].Tex[j].New[0], Class'Texture'));
}
else
break;
}
else if (Data[i].Slot == S_MultiSkins)
{
TexBreak = True;
for (m = 0; m < 8; m++)
{
if (Data[i].Tex[j].New[m] != "")
{
if (Other.MultiSkins[m] == Data[i].Tex[j].Old[m])
Other.MultiSkins[m] = texture(DynamicLoadObject(Data[i].Tex[j].New[m], Class'Texture'));
TexBreak = False;
}
}
if (TexBreak)
break;
}
}
}
}
return true;
}
function PreBeginPlay()
{
Data[0].Mesh = LodMesh'UnrealShare.Skaarjw';
Data[0].Slot = S_Skin;
//SkaarjWarrior
Data[0].Tex[0].Old[0] = None;
Data[0].Tex[0].New[0] = "Ancient.Base.GRENMRBL";
//IceSkaarj
Data[0].Tex[1].Old[0] = Texture'UnrealI.Skins.Skaarjw3';
Data[0].Tex[1].New[0] = "Ancient.Base.A_bs4";
Data[1].Mesh = LodMesh'UnrealI.Pupae1';
Data[1].Slot = S_MultiSkins;
//Pupae
Data[1].Tex[0].Old[1] = None;
Data[1].Tex[0].New[1] = "Ancient.Base.Crunchyd";
Data[2].Mesh = LodMesh'UnrealI.KrallM';
Data[2].Slot = S_Skin;
//Krall
Data[2].Tex[0].Old[0] = None;
Data[2].Tex[0].New[0] = "Ancient.Base.BRIXGBAS";
//KrallElite
Data[2].Tex[1].Old[0] = Texture'UnrealI.Skins.ekrall';
Data[2].Tex[1].New[0] = "Ancient.Base.CRUNCHYB";
}
Code: Select all
if (Other.Mesh == None)
return true;
Code: Select all
if ((!Other.IsA('ScriptedPawn') && !Other.IsA('Carcass')) || Other.Mesh == None)
return true;
On the contrary, I find it quite interesting. I suffer from a condition which can make typing fluctuatively difficult, which is why I haven't commented as much as I would otherwise.I guess people have lost interest in this project, since my Warlord and Mercenary skins got no comments. :P
Funny enough, I used all the same highlights from the original skin. I think even the original skin looks cell shaded, but it is difficult to notice with the low quality. I'm not sure how I can fix it without messing with the faithfulness!I think my only particular complaint (?) would be that parts of the titan skin look a bit cell shaded.
Don't worry, I'm not discouraged. I have worked on many projects over the years, so I know what to expect when it comes to community input. My statement in my last post was sarcasm, hence my ":P" emoticon. You are indeed correct about your point on criticism, and I probably should have stated when I first opened this thread that I am, in fact, looking for people to point out any flaws with these skins. A few compliments here and there is nice, but I do not expect flattery. Of course, I might not be willing to fix/change all the flaws that people mention, but I do take every opinion in to consideration. After skinning for hours, it is easy for me to miss simple issues/flaws. So far, I think I've taken action on almost every bit of criticism received in this thread.I see the cell shading now that you mention it but I don't think I would have noticed it myself. They look good, I'd leave them.
Don't get discouraged either at project support dropping off. It happens all the time on longer term work, especially if people can't get hold of it as you go. It doesn't mean the interest is waning, it's just that you can only comment so many times "good job" before you start to feel like a cheerleader.
Interestingly if you had rephrased the original post and said something like "Only criticism is allowed in this thread" and asked people only to point out things they disliked in such a way that they didn't need to fear appearing unsupportive...You'd probably get a ton of usable feedback (if your ego can deal with it, it's not a way for everyone). I've often thought of doing this to see how it might pan out. UnrealSP does a good job of this way of gathering opinion. The mappers there are really tough on new material but it's not overly harsh, just honest and often raw. Might work well here too.
The Titan skin is 4096x4096. It looks very detailed in the game, at least for me!I am also watching with interest.
The Titan skin has always bugged me most because of the size of the model, so theoretically needs to be one of the biggest skins we need (especially if you use a the MegaTitan or other bigger version).
Haha, I might create a 256x256 skin for those last. We will see. :D...so when is the Hires fly or biterfish being dealt with