Для добавления сообщения войдите или зарегистрируйтесь.
  • Главная
  • Форум
  • Новости
  • Заявки
  • Онлайн TV
[ Новые сообщения · Участники · Правила форума · RSS ]
  • Страница 1 из 1
  • 1
Форум » Killing floor » Игровое редактирование » Модификация ServerPerks. (Изменение мутатора.)
Модификация ServerPerks.
zOyBiRg
Дата: Суббота, 28.04.2012, 00:53 | Сообщение # 1
kok-s aka zOyBiRg
Награды: 4 +
Сообщений: 976
Замечания: ±
85
Администратор
Разбираем и модифицируем ServerPerks


Как вшить оружие в ServerPerks
Пусть у нас есть мутатор NewWeapons и мы хотим перекинуть какое-нибудь оружие из него в ServerPerks.

Декомпилируем NewWeapons, берём файлы относящиеся к оружию, копируем их в папку с файлами ServerPerks (пусть для простоты ServerPerks декомпилируется в одну папку, как и было до 5.10 версии)

В новых файлах заменяем все ссылки NewWeapons.* на ServerPerks.*
Всевозможные NewWeapons.WeaponPickup заменяем на ServerPerks.WeaponPickup и тому подобное

После этого спокойно прописываем оружие в нужный SRVet* (например, оружие снайпера в SRVetSharpshooter и т.д)
В общем то всё

Во время компиляции ServerPerks желательно удалить пакет NewWeapons.u
Чтобы сразу было ясно - остались не поправленные ссылки или нет


Бонусы
Каждый перк имеет свой .uc файл. Например у коммандоса - это SRVetCommando.uc. Что бы правильно прописать бонусы нужно знать семантику классов
Я взял в пример АК47

Как привязать бонус к оружию (увеличение патронов в рожке)

Находим функцию GetMagCapacityMod - там видим пример кода.
AK47AssaultRifle(Other) != none - на какое оружие действует
if ( KFPRI.ClientVeteranSkillLevel == 1 ) - на каком уровне действует
return 1.10; - на сколько идёт увеличение патронов в рожке


Как привязать бонус к оружию (увеличение переносимых патронов)

Находим функцию AddExtraAmmoFor - там видим пример кода.
AmmoType == class'AK47Ammo' - на какое оружие действует
if ( KFPRI.ClientVeteranSkillLevel == 1 ) - на каком уровне действует
return 1.10; - на сколько идёт увеличение переносимых патронов


Как привязать бонус к оружию (увеличение подбираемых патронов из ящиков)

Находим функцию GetAmmoPickupMod - там видим пример кода.
AK47Ammo(Other) != none - на какое оружие действует
if ( KFPRI.ClientVeteranSkillLevel == 1 ) - на каком уровне действует
return 1.10; - на сколько идёт увеличение подбираемых патронов из ящиков


Как привязать бонус к оружию (увеличение урона от оружия)

Находим функцию AddDamage - там видим пример кода.
DmgType == class'DamTypeAK47AssaultRifle' - на какое оружие действует
if ( KFPRI.ClientVeteranSkillLevel == 0 ) - на каком уровне действует
return float(InDamage) * 1.05; - на сколько идёт увеличение урона
return float(InDamage) * (1.00 + (0.10 * float(Min(KFPRI.ClientVeteranSkillLevel, 5)))); - формула увеличения урона


Как привязать бонус к оружию (скидка на оружие)

Находим функцию GetCostScaling - там видим пример кода.
Item == class'AK47Pickup' - на какое оружие действует


Как привязать бонус к оружию (скидка на патроны)

Находим функцию GetAmmoCostScaling - там видим пример кода.
Item == class'AK47Pickup' - на какое оружие действует
return FMax(0.25 - (0.03 * float(KFPRI.ClientVeteranSkillLevel)),0.01f); - формула скидки на патроны


Индивидуальность - это не просто набор уникальных скинов, оружия или мутаторов. Это своя атмосфера, стиль, который можно создать только в результате напряженной умственной деятельности © Freddy
Fene4k@
Дата: Среда, 16.05.2012, 16:17 | Сообщение # 2
Награды: +
Сообщений:
Замечания: ±
Для всех желающих избавиться от КАТЕГОРИЙ оружия в магазине на сп5 советую сделать это действие

ВСЕ ВЫПОЛНЯЙТЕ ПО ОЧЕРЕДИ

Файл ServerPerksMut.uc:

функция PostBeginPlay():
Убираем позагрузку категорий из конфига. Ищем:

for( i=0; i<TraderInventory.Length; i++ )
{
S = TraderInventory[i];
j = InStr(S,":");
if( j>0 )
{
Cat = Min(int(Left(S,j)),WeaponCategories.Length-1);
S = Mid(S,j+1);
}
else Cat = 0;
P = class<Pickup>(DynamicLoadObject(S,Class'Class'));
if( P!=None )
{
LoadInventory[LoadInventory.Length] = P;
LoadInvCategory[LoadInvCategory.Length] = Cat;
if( P.Outer.Name!='KFMod' )
ServerPcks[ServerPcks.Length] = P.Outer.Name;
}
}

заменяем на:

for( i=0; i<TraderInventory.Length; i++ )
{
S = TraderInventory[i];
Cat=0;
P = class<Pickup>(DynamicLoadObject(S,Class'Class'));
if( P!=None )
{
LoadInventory[LoadInventory.Length] = P;
LoadInvCategory[LoadInvCategory.Length] = Cat;
if( P.Outer.Name!='KFMod' )
ServerPcks[ServerPcks.Length] = P.Outer.Name;
}
}

*примечание: в настройках TraderInventory должен содержать ТОЛЬКО класс оружия, номера категории быть не должно

Удаляем/коментируем:
if( WeaponCategories.Length==0 )
{
WeaponCategories.Length = 1;
WeaponCategories[0] = "All";
}

Далее просто избавляемя от всех упоминаний о категориях:
функция SetupRepLink( ClientPerkRepLink R )
удаляем/коментируем:

R.ShopCategories = WeaponCategories;
R.ShopInventory[i].CatNum = LoadInvCategory[i];

функция FillPlayInfo(PlayInfo PlayInfo):
удаляем/коментируем:

PlayInfo.AddSetting(default.ServerPerksGroup,"WeaponCategories","Weapon categories",1,1,"Text","42",,,True);

функция GetDescriptionText(string PropName):
удаляем/коментируем:

case "WeaponCategories": return "Weapon category names.";

Удаляем переменную WeaponCategories, правим стандартные свойства.

Файл SRBuyMenuSaleListBox.uc:
удаляем/коментируем функцию GetSelectedBuyable()

Файл SRBuyMenuSaleList.uc:
удаляем/коментируем функцию GetSelectedBuyable()

Ищем:

final function SetCategoryNum( int N )
{
if( ActiveCategory==N )
ActiveCategory = -1;
else ActiveCategory = N;
SelectionOffset = (N+1);
UpdateForSaleBuyables();
Index = N;
}

заменяем на:
final function SetCategoryNum( int N );

Функция UpdateForSaleBuyables()

Ищем:

if ( ForSalePickup==None || ActiveCategory!=KFLR.ShopInventory[j].CatNum
|| class<KFWeapon>(ForSalePickup.default.InventoryType).default.bKFNeverThrow
|| IsInInventory(ForSalePickup) )
continue;

Заменяем на:

if ( ForSalePickup==None || class<KFWeapon>(ForSalePickup.default.InventoryType).default.bKFNeverThrow
|| IsInInventory(ForSalePickup) )
continue;

Заменяем функцию DrawInvItem(Canvas Canvas, int CurIndex, float X, float Y, float Width, float Height, bool bSelected, bool bPending) на более стандартный вариант с подменой KFGameType на ClientPerkRepLink:

function DrawInvItem(Canvas Canvas, int CurIndex, float X, float Y, float Width, float Height, bool bSelected, bool bPending)
{
local float TempX, TempY, TempHeight;
local float StringHeight, StringWidth;
local ClientPerkRepLink KFLR;
OnClickSound=CS_Click;

// Offset for the Background
TempX = X;
TempY = Y + ItemSpacing / 2.0;

// Initialize the Canvas
Canvas.Style = 1;
//Canvas.Font = class'ROHUD'.Static.GetSmallMenuFont(Canvas);
Canvas.SetDrawColor(255, 255, 255, 255);

// Draw Item Background
Canvas.SetPos(TempX, TempY);

if ( CanBuys[CurIndex] < 1 )
{
Canvas.DrawTileStretched(DisabledItemBackgroundLeft, Height - ItemSpacing, Height - ItemSpacing);

TempX += ((Height - ItemSpacing) - 1);
TempHeight = Height - 12;
TempY += 6;//(Height - TempHeight) / 2;

Canvas.SetPos(TempX, TempY);

Canvas.DrawTileStretched(DisabledItemBackgroundRight, Width - (Height - ItemSpacing), Height - 12);
}
else if ( bSelected )
{
Canvas.DrawTileStretched(SelectedItemBackgroundLeft, Height - ItemSpacing, Height - ItemSpacing);

TempX += ((Height - ItemSpacing) - 1);
TempHeight = Height - 12;
TempY += 6;//(Height - TempHeight) / 2;

Canvas.SetPos(TempX, TempY);

Canvas.DrawTileStretched(SelectedItemBackgroundRight, Width - (Height - ItemSpacing), Height - 12);
}
else
{
Canvas.DrawTileStretched(ItemBackgroundLeft, Height - ItemSpacing, Height - ItemSpacing);

TempX += ((Height - ItemSpacing) - 1);
TempHeight = Height - 12;
TempY += 6;//(Height - TempHeight) / 2;

Canvas.SetPos(TempX, TempY);

Canvas.DrawTileStretched(ItemBackgroundRight, Width - (Height - ItemSpacing), Height - 12);
}

Canvas.SetPos(X + 4, Y + 4);
KFLR = Class'ClientPerkRepLink'.Static.FindStats(PlayerOwner());
if( KFLR!=None && KFLR.ShopPerkIcons.Length>ItemPerkIndexes[CurIndex] )
Canvas.DrawTile(KFLR.ShopPerkIcons[ItemPerkIndexes[CurIndex]], Height - 8, Height - 8, 0, 0, 256, 256);

// Select Text color
if ( CurIndex == MouseOverIndex )
{
Canvas.SetDrawColor(255, 255, 255, 255);
}
else
{
Canvas.SetDrawColor(0, 0, 0, 255);
}

// Draw the item's name and categorie
Canvas.StrLen(PrimaryStrings[CurIndex], StringWidth, StringHeight);
Canvas.SetPos(TempX + (0.2 * Height), TempY + ((TempHeight - StringHeight) / 2));
Canvas.DrawText(PrimaryStrings[CurIndex]);

// Draw the item's price
Canvas.StrLen(SecondaryStrings[CurIndex], StringWidth, StringHeight);
Canvas.SetPos((TempX - Height) + Width - (StringWidth + (0.2 * Height)), TempY + ((TempHeight - StringHeight) / 2));
Canvas.DrawText(SecondaryStrings[CurIndex]);

Canvas.SetDrawColor(255, 255, 255, 255);
}

Удаляем/коментируем фуннкции IndexChanged(GUIComponent Sender), UpdateList()

Удаляем все переменные и свойства, кроме:
var KFPCServ PPC;

Сохраняем, компилируем, категорий больше нет
zOyBiRg
Дата: Воскресенье, 07.07.2013, 01:34 | Сообщение # 3
kok-s aka zOyBiRg
Награды: 4 +
Сообщений: 976
Замечания: ±
85
Администратор
Подскажите пожалуйста, у меня на 1047 медик бросает гранаты которые хиляют и наносят урон зомбакам. Но когда я добавляю Серверперкс 6.1 мед бросает обычные гранаты. Как это исправить?

Добавь в ServerPerksP.SRVetFieldMedic данную функцию: (или отредактируй уже имеющуюся)
Spoiler

static function class GetNadeType(KFPlayerReplicationInfo KFPRI)
{
return class'MedicNade';
}


Индивидуальность - это не просто набор уникальных скинов, оружия или мутаторов. Это своя атмосфера, стиль, который можно создать только в результате напряженной умственной деятельности © Freddy
Форум » Killing floor » Игровое редактирование » Модификация ServerPerks. (Изменение мутатора.)
  • Страница 1 из 1
  • 1
Поиск: