• Рекомендуем зарегистрироваться для просмотра контента и скачивания файлов!

Объединение персональных скинов в один пакет

denfil777

Патриарх
Команда форума
Регистрация
12 Янв 2024
Сообщения
76
Реакции
10
Баллы
8
Удобно когда все персональные скины лежат в 1 пакете и управляются 1 мутатором
Ибо проблему большого количества пакетов/мутаторов вы все помните, я надеюсь)

Собственно вот
Все скины складируются в один пакет. Мутатор управляет сразу всеми скинами

Настройки:

VipSkinsList=(PlayerName="Мистер Фостер",PlayerID="76561111111111111",Skin="VipSkinsMut.SPMRFoster")

Ну в общем то всё тут понятно
Полный путь к скину прописывается в Skin
ID игрока прописывается в PlayerID
А в PlayerName можете писать что угодно. Это поле добавлено просто для удобства, чтобы ясно что это за человек тут с этим ID

Код с комментариями:

Код:
class VipSkinsMut extends Mutator Config(VipSkinsMut);

struct VipSkinsStruct
{
    var config string PlayerName;    //в коде не используется. добавлена только для удобства работы с ини файлом
    var config string PlayerID;        //ID игрока
    var config string Skin;            //скин игрока
};
var config array<VipSkinsStruct> VipSkinsList;
var array<PlayerController> PendingPlayers;

//Создаём инишник и добавляем наши вип скины в массив AvailableChars. Если не добавим - не сможем получить к ним доступа
function PostBeginPlay()
{
    SaveConfig();
    AddAvailableVipSkins();
}
//Здесь и добавляем. При этом следим, чтобы один и тот же скин не был добавлен больше 1 раза
function AddAvailableVipSkins()
{
    local int i,N;
    for(i=0;i<VipSkinsList.Length;i++)
    {
        N=Class'KFGameType'.Default.AvailableChars.Length;
        if(!SkinAlreadyAdded(VipSkinsList.Skin))
            Class'KFGameType'.Default.AvailableChars[N] = VipSkinsList.Skin;
    }
}
//Тут вот и проверяем есть ли уже такой скин в массиве или нет
function bool SkinAlreadyAdded(string Skin)
{
    local int i;
    for(i=0;i<Class'KFGameType'.Default.AvailableChars.Length;i++)
    {
        if(Class'KFGameType'.Default.AvailableChars~=Skin)
            return true;
    }
    return false;
}

//Отлавливаем всех игроков при заходе на сервер (контроллеры ловим)
function bool CheckReplacement(Actor Other, out byte bSuperRelevant)
{
    if(PlayerController(Other)!=None)
    {
        PendingPlayers[PendingPlayers.Length] = PlayerController(Other);
        SetTimer(0.1,false);
    }
    return true;
}
//Прошла 0.1 секунда и переменные контроллера инициализированы. Можем с ними работать
//Собственно тут мы и пытаемся нацепить скин на игрока
function Timer()
{
    local int i;
    for(i=0;i<PendingPlayers.Length;i++)
    {
        if(PendingPlayers!=None)
            TryToPutSkinOn(PendingPlayers);
    }
    PendingPlayers.Length = 0;
}
//Проверяем - есть ли игрок в вип списке и если есть - ставим ему его скин
function TryToPutSkinOn(PlayerController PC)
{
    local int i;
    local string hash;
    hash=PC.GetPlayerIDHash();
    for(i=0;i<VipSkinsList.Length;i++)
    {
        if(VipSkinsList.PlayerID~=hash)
            PC.SetPawnClass("",VipSkinsList.Skin);
    }
}

defaultproperties
{
    VipSkinsList(0)=(Skin="VipSkinsMut.SPMRFoster",PlayerID="76561111111111111",PlayerName="Мистер Фостер")
    VipSkinsList(1)=(Skin="VipSkinsMut.SPMRsFoster",PlayerID="76562222222222222",PlayerName="Миссис Фостер")
    VipSkinsList(2)=(Skin="VipSkinsMut.SPMRFoster",PlayerID="76563333333333333",PlayerName="И опять Мистер Фостер")
    bAddToServerPackages=True
    GroupName="KF-VipSkins"
    FriendlyName="VipSkinsMut"
    Description="VipSkinsMut"
    bAlwaysRelevant=True
}

Ссылка 1 или Ссылка 2
VipSkinsMut.VipSkinsMut

Кроме самого мутатора я кинул в пакет 2 как бы персональных скина - VipSkinsMut.SPMRFoster и VipSkinsMut.SPMRsFoster
Соответственно это стим панк мистер и миссис Фостеры
Просто чтобы комфортнее было начинать работу с мутатором

Ну то есть какая последовательность действий
Берёте свой мутатор со скином, копируете Mod составляющую (То есть всё кроме мутатора) и правите пути, если надо на VipSkinsMut.

Замечание. Для тех, кто использует удалённую базу.

Поправьте период срабатывания таймера. Сейчас там стоит 0.1 - вам этого может не хватить и скин не поменяется.
Напишите так, например


Код:
SetTimer(1.0,false);

Замечание2. Для тех, кто принудительно выставляет Custom скины игрокам (bForceCustomChars=true)

Поправьте строчку в

Код:
TryToPutSkinOn
вместо


Код:
PC.SetPawnClass("",VipSkinsList.Skin);

напишите

Код:
PC.PlayerReplicationInfo.SetCharacterName(VipList.Skin);

Автор Flame.
 
Последнее редактирование:
Сверху Снизу