Новое требование к прокачке перка. Счетчик убийств моба

Тема в разделе "Кодинг", создана пользователем Swer, 14 сен 2012.

  1. Swer

    Swer Солдат

    Может кто подскажет что нужно добавить/отредактировать что б у перка к прокачке добавить подсчет например Mauler zombie?
     
  2. key

    key Солдат

    Это нужно в оружии править (дамаг), и в серверперксе (здесь на форуме есть где-то).
     
  3. Swer

    Swer Солдат

    чёт я искал да ненашол :(
     
  4. Freddy

    Freddy Капо

    Нетривиальная задача, гайд будет здоровенный, если конечно кто-то писать заморочится
     
  5. offutt

    offutt Капо

    Точно :biggrin:
    Писать никто не станет.
     
  6. Dr_Killjoy

    Dr_Killjoy Заблокированные

    Это верно.
     
  7. key

    key Солдат

    Кажется в теме про пулеметчика есть как настроить счетчик определенного монстра для пулеметов.
     
  8. Папка01

    Папка01 ۞ Всевидящее око форума ۞

    Да, там обсуждали как убийства Сирен к перку прикрутить. Перк пулеметчик в Мутаторах кажется.
     
  9. Dr_Killjoy

    Dr_Killjoy Заблокированные

    Насколько я знаю у него ничего толкового не вышло.
     
  10. Rainishе

    Rainishе Солдат

    уж не скажите. всё очень даже вышло. просто какие были пожелания я учёл и сделал. получили как говорится что желали.
    И насчёт счётчика то ето не сложно. напишу как нить поподробнее об етом. когда будет время.
     
  11. Dr_Killjoy

    Dr_Killjoy Заблокированные

    Я знаю о чём говорю. То что ты там наваял не работает как следует. Молчу про работу с удалённым сервером.
     
    Lexass нравится это.
  12. Lexass

    Lexass Капо

    я полностью согласен. К пулеметчику прописаны убийства сирен.НО С ЛЮБОГО ОРУЖИЯ. что становится обидно перку Командос которому лишь с Автоматов можно сталкеров убивать
    Сделать статью Действительно долгоя и мучительная работа.
     
  13. Flame

    Flame -Заслуженый кодер форума-

    Lexass, я ж вроде тебе несколько раз написал что делать надо )
    Ладно, напишу статью на недельке, тем более я обещал
    Только не пойму - а в чем проблема то?
    Прописать в ServerStStats функцию изменяющую параметр, добавить эту функцию в демедж тайп нужной пушки и прописать репликацию и сохранение в общей статистике
    ServerStStats, StatObject, SRStatList, ClientPerkRepLink)
    Ну и поправить соответствующий SRVet* класс - добавить требование прокачки
    Вроде ж по аналогии не сложно сделать
    Или я что-то не понимаю и речь о чём то другом?
     
  14. Dr_Killjoy

    Dr_Killjoy Заблокированные

    Это не сложно, но тем не менее мало кто с этой темой знаком. А как написать правильным образом чтобы работало с удалённым сервером я не видел чтобы кто-то писал. Я сам уже делал так, это действительно не сложно, но желательно понимать как что работает.
     
  15. Rainishе

    Rainishе Солдат

    ну да блин. я вобще ничего не умею. коряворучка безглазая. тогда раз все такие знающие то я пошел с етого сайта.
     
  16. Папка01

    Папка01 ۞ Всевидящее око форума ۞

    Какие же вы мододелы ранимые. Среди тех, кто тут отписывается нет людей с этого сайта.

    Этот сайт вмещает в себя мододелов, которые старательно относят себя к менее широким проэктам, тут они только в основном пересекаются друг между другом.
    Я хренею, тут у нас и Симхост, и Медвед, и Санрайз, и независимые участники, а взаимобурчание давайте спишем на место, которое дает вам возможность всем взаимодействовать.
    Делайте чего хотите. Только проще и правильнее указать Килджою на отверстие, которое на твой взгляд ему предназначено и не устраивать прощания.
     
    denfil777 и prototype22 нравится это.
  17. Flame

    Flame -Заслуженый кодер форума-

    А
    Кстати
    А ведь в соседней теме много полезного по этому вопросу написано
    Жаль только оформление пострадало и картинки пропали
     
  18. Flame

    Flame -Заслуженый кодер форума-

    Итак, создадим новое требование для прокачки перка
    Пусть это будут многострадальные убитые из пулемёта сирены
    Для получения 5 и 6 уровня коммандоса пусть надо будет не только выполнить стандартные требования (урон + сталкеры), но и надо будет убить 20 и 50 сирен (используя пулемёт) соответственно

    В качестве пулемёта будем использовать ПКМ (тот что по ссылке под надписью Обновление)

    Для начала я напишу что делать надо, а потом (как время будет) поподробнее опишу что вообще происходит и зачем и что мы делаем.
    Впрочем, если кто хочет действительно разобраться в теме, то советую самостоятельно понять зачем нужно каждое нижеописанное действие.

    1. Нам нужно создать новую переменную, которая будет отвечать за хранение (ну точнее в эту переменную мы считываем значение убитых сирен из ServerPerksStat при подключении игрока, во время игры она изменяется и периодически сохраняет значения в ServerPerksStat) и функцию изменяющую её значение

    - Класс ServerPerksMut.StatsObject
    Cоздаём переменную MGSirenKillsStat
    Код:
    var config int MGSirenKillsStat;
    Правим функцию GetSaveData
    Код:
    final function string GetSaveData()
    {
    	local string Result;
    
    	Result = SelectedVeterancy$","$DamageHealedStat$","$WeldingPointsStat$","$ShotgunDamageStat$","$HeadshotKillsStat$","$StalkerKillsStat;
    	Log("First part:"@Result);
    	Result = Result$","$BullpupDamageStat$","$MeleeDamageStat$","$FlameThrowerDamageStat$","$SelfHealsStat$","$SoleSurvivorWavesStat;
    	Result = Result$","$CashDonatedStat$","$FeedingKillsStat$","$BurningCrossbowKillsStat$","$GibbedFleshpoundsStat$","$StalkersKilledWithExplosivesStat;
    	Result = Result$","$GibbedEnemiesStat$","$BloatKillsStat$","$SirenKillsStat$","$KillsStat$","$ExplosivesDamageStat;
    	Result = Result$","$int(TotalZedTimeStat)$","$TotalPlayTime$","$WinsCount$","$LostsCount$",'"$SelectedChar$"'";
    	//NewStat 2012_11_29
    	Result = Result$","$MGSirenKillsStat;
    	//Result = Result$","$GetPropertyText("CC");
    	//
    	return Result;
    }
    
    Правим функцию SetSaveData
    Код:
    final function SetSaveData( string S )
    {
    	local int i;
    
    	i = InStr(S,",");
    	if( i==-1 )
    		return;
    	SelectedVeterancy = Left(S,i);
    	S = Mid(S,i+1);
    	DamageHealedStat = GetNextValue(S);
    	WeldingPointsStat = GetNextValue(S);
    	ShotgunDamageStat = GetNextValue(S);
    	HeadshotKillsStat = GetNextValue(S);
    	StalkerKillsStat = GetNextValue(S);
    	BullpupDamageStat = GetNextValue(S);
    	MeleeDamageStat = GetNextValue(S);
    	FlameThrowerDamageStat = GetNextValue(S);
    	SelfHealsStat = GetNextValue(S);
    	SoleSurvivorWavesStat = GetNextValue(S);
    	CashDonatedStat = GetNextValue(S);
    	FeedingKillsStat = GetNextValue(S);
    	BurningCrossbowKillsStat = GetNextValue(S);
    	GibbedFleshpoundsStat = GetNextValue(S);
    	StalkersKilledWithExplosivesStat = GetNextValue(S);
    	GibbedEnemiesStat = GetNextValue(S);
    	BloatKillsStat = GetNextValue(S);
    	SirenKillsStat = GetNextValue(S);
    	KillsStat = GetNextValue(S);
    	ExplosivesDamageStat = GetNextValue(S);
    	TotalZedTimeStat = GetNextValue(S);
    	TotalPlayTime = GetNextValue(S);
    	WinsCount = GetNextValue(S);
    	LostsCount = GetNextValue(S);
    	SelectedChar = GetNextStrValue(S);
    	//NewStat 2012_11_29
    	MGSirenKillsStat = GetNextValue(S);
    	/*
    	CC.Length = 0;
    	if( Len(S)>0 )
    		SetPropertyText("CC",S);
    	*/
    	//
    }
    
    Замечание
    Выше учтено замечание Dr_Killjoy
    Я в свою очередь замечу, что если не используется удалённая база, то данные 2 функции можно вообще не править.
    Если удалённая база создаётся с нуля (а не используется уже существующая), то нашу новую переменную можно ставить куда угодно в фунциях SetSaveData и GetSaveData, главное чтобы она считывалась и записывалась на одном и том же шаге. СС можно не трогать.
    А вот если используется существующая удалённая база и в неё добавляются параметры, то новый параметр надо писать в конце списка (или поправить базу, подставив нулевое значение вместо нового параметра на нужную позицию всем игрокам)
    А насчёт того, чтобы убрать CC - я ещё чуток подумаю, как это поизящнее сделать.
    upd. Подумал. Всёж проще убрать СС из рассмотрения пока что. Возможно потом Марко сам изменит реализацию.
    - Класс ServerPerks.ClientPerkRepLink
    Создаём переменную RMGSirenKillsStat
    Код:
    var int RMGSirenKillsStat;
    
    Создаём репликацию этой переменной
    Код:
    reliable if( Role==ROLE_Authority && bNetOwner )
    	RMGSirenKillsStat;
    
    - Класс ServerPerksMut.ServerStStats
    Правим функцию RepCopyStats
    Код:
    final function RepCopyStats()
    {
    // Copy all stats from data object for client replication
    	Rep.RDamageHealedStat = MyStatsObject.DamageHealedStat;
    	Rep.RWeldingPointsStat = MyStatsObject.WeldingPointsStat;
    	Rep.RShotgunDamageStat = MyStatsObject.ShotgunDamageStat;
    	Rep.RHeadshotKillsStat = MyStatsObject.HeadshotKillsStat;
    	Rep.RStalkerKillsStat = MyStatsObject.StalkerKillsStat;
    	Rep.RBullpupDamageStat = MyStatsObject.BullpupDamageStat;
    	Rep.RMeleeDamageStat = MyStatsObject.MeleeDamageStat;
    	Rep.RFlameThrowerDamageStat = MyStatsObject.FlameThrowerDamageStat;
    	Rep.RSelfHealsStat = MyStatsObject.SelfHealsStat;
    	Rep.RSoleSurvivorWavesStat = MyStatsObject.SoleSurvivorWavesStat;
    	Rep.RCashDonatedStat = MyStatsObject.CashDonatedStat;
    	Rep.RFeedingKillsStat = MyStatsObject.FeedingKillsStat;
    	Rep.RBurningCrossbowKillsStat = MyStatsObject.BurningCrossbowKillsStat;
    	Rep.RGibbedFleshpoundsStat = MyStatsObject.GibbedFleshpoundsStat;
    	Rep.RStalkersKilledWithExplosivesStat = MyStatsObject.StalkersKilledWithExplosivesStat;
    	Rep.RGibbedEnemiesStat = MyStatsObject.GibbedEnemiesStat;
    	Rep.RBloatKillsStat = MyStatsObject.BloatKillsStat;
    	Rep.RTotalZedTimeStat = MyStatsObject.TotalZedTimeStat;
    	Rep.RSirenKillsStat = MyStatsObject.SirenKillsStat;
    	Rep.RKillsStat = MyStatsObject.KillsStat;
    	Rep.RExplosivesDamageStat = MyStatsObject.ExplosivesDamageStat;
    	Rep.TotalPlayTime = MyStatsObject.TotalPlayTime;
    	Rep.WinsCount = MyStatsObject.WinsCount;
    	Rep.LostsCount = MyStatsObject.LostsCount;
    	//NewStat 2012_11_29
    	Rep.RMGSirenKillsStat = MyStatsObject.MGSirenKillsStat;
    	//
    	MyStatsObject.GetCustomValues(Rep.CustomLink);
    }
    
    Добавляем ту самую функцию, которая будет изменять значение убиты сирен
    Код:
    function AddMGSirenKill()
    {
    	bHasChanged = true;
    	Rep.RMGSirenKillsStat++;
    	if( MyStatsObject!=None )
    		MyStatsObject.MGSirenKillsStat++;
    	DelayedStatCheck();
    }
    
    - Класс ServerPerks.SRStatList
    Правим функцию InitList
    Код:
    function InitList( ClientPerkRepLink L )
    {
    	local SRCustomProgress P;
    	local int i;
    
    	for( P=L.CustomLink; P!=None; P=P.NextLink )
    		++i;
    
    	ItemCount = Default.ProgressName.Length+i;
    	ProgressName.Length = ItemCount;
    	StatProgress.Length = ItemCount;
    
    	i = Default.ProgressName.Length;
    	for( P=L.CustomLink; P!=None; P=P.NextLink )
    	{
    		ProgressName[i] = P.ProgressName;
    		StatProgress[i] = P.GetDisplayString();
    		++i;
    	}
    
    	// Update the ItemCount and select the first item
    	SetIndex(0);
    
    	StatProgress[0] = string(L.RDamageHealedStat);
    	StatProgress[1] = string(L.RWeldingPointsStat);
    	StatProgress[2] = string(L.RShotgunDamageStat);
    	StatProgress[3] = string(L.RHeadshotKillsStat);
    	StatProgress[4] = string(L.RChainsawKills);
    	StatProgress[5] = string(L.RStalkerKillsStat);
    	StatProgress[6] = string(L.RBullpupDamageStat);
    	StatProgress[7] = string(L.RMeleeDamageStat);
    	StatProgress[8] = string(L.RFlameThrowerDamageStat);
    	StatProgress[9] = string(L.RSelfHealsStat);
    	StatProgress[10] = string(L.RSoleSurvivorWavesStat);
    	StatProgress[11] = string(L.RCashDonatedStat);
    	StatProgress[12] = string(L.RFeedingKillsStat);
    	StatProgress[13] = string(L.RHuntingShotgunKills);
    	StatProgress[14] = string(L.RBurningCrossbowKillsStat);
    	StatProgress[15] = string(L.RGibbedFleshpoundsStat);
    	StatProgress[16] = string(L.RStalkersKilledWithExplosivesStat);
    	StatProgress[17] = string(L.RExplosivesDamageStat);
    	StatProgress[18] = string(L.RGibbedEnemiesStat);
    	StatProgress[19] = string(L.RBloatKillsStat);
    	StatProgress[20] = string(L.RTotalZedTimeStat);
    	StatProgress[21] = string(L.RSirenKillsStat);
    	StatProgress[22] = string(L.RKillsStat);
    	StatProgress[23] = string(L.RMedicKnifeKills);
    	StatProgress[24] = string(L.TotalPlayTime);
    	StatProgress[25] = string(L.WinsCount);
    	StatProgress[26] = string(L.LostsCount);
    	//NewStat 2012_11_29
    	StatProgress[27] = string(L.RMGSirenKillsStat);
    	//
    	for( i=0; i<DisplayFormat.Length; ++i )
    		if( DisplayFormat[i]==1 )
    			StatProgress[i] = GetTimeText(int(StatProgress[i]));
    
    	if ( bNotify )
    	{
    		CheckLinkedObjects(Self);
    	}
    
    	if ( MyScrollBar != none )
    	{
    		MyScrollBar.AlignThumb();
    	}
    }
    
    Правим defaultproperties InitList
    Код:
    defaultproperties
    {
    	InfoBackground=Texture'KF_InterfaceArt_tex.Menu.Item_box_bar'
    	ProgressName(0)="Healed damage"
    	ProgressName(1)="Welded hitpoints"
    	ProgressName(2)="Shotgun damage"
    	ProgressName(3)="Headshot kills"
    	ProgressName(4)="Chainsaw kills"
    	ProgressName(5)="Stalker kills"
    	ProgressName(6)="Bullpup/AK47/SCAR damage"
    	ProgressName(7)="Melee damage"
    	ProgressName(8)="Flame thrower damage"
    	ProgressName(9)="Self healed count"
    	ProgressName(10)="Sole survivor waves count"
    	ProgressName(11)="Cash donated"
    	ProgressName(12)="Feeding zombies killed"
    	ProgressName(13)="Hunting shotgun kills"
    	ProgressName(14)="Burning crossbow kills"
    	ProgressName(15)="Gibbed fleshpounds"
    	ProgressName(16)="Stalkers killed with explosives"
    	ProgressName(17)="Explosives damage count"
    	ProgressName(18)="Gibbed zombies count"
    	ProgressName(19)="Bloat kills"
    	ProgressName(20)="Total ZED-time"
    	ProgressName(21)="Siren kills"
    	ProgressName(22)="Total kills"
    	ProgressName(23)="Knife kills as medic"
    	ProgressName(24)="Total playtime"
    	ProgressName(25)="Won games"
    	ProgressName(26)="Lost games"
    //NewStat 2012_11_29
    ProgressName(27)="Siren kills with MG"
    //
    	DisplayFormat(20)=1
    	DisplayFormat(24)=1
    	GetItemHeight=SRStatList.PerkHeight
    	ItemCount=27
    	OnDrawItem=SRStatList.DrawStat
    	FontScale=FNS_Medium
    	OnPreDraw=SRStatList.PreDraw
    }
    

    2. Теперь займёмся непосредственно перком коммандоса
    Правим функцию ServerPerksP.GetPerkProgressInt
    Код:
    static function int GetPerkProgressInt( ClientPerkRepLink StatOther, out int FinalInt, byte CurLevel, byte ReqNum )
    {
    	switch( CurLevel )
    	{
    	case 0:
    		if( ReqNum==0 )
    			FinalInt = 10;
    		//NewStat 2012_11_29
    		else if( ReqNum==1 )
    			FinalInt = 10000;
    		else FinalInt = 0;
    		//
    		break;
    	case 1:
    		if( ReqNum==0 )
    			FinalInt = 30;
    		//NewStat 2012_11_29
    		else if( ReqNum==1 )
    			FinalInt = 25000;
    		else FinalInt = 0;
    		//
    		break;
    	case 2:
    		if( ReqNum==0 )
    			FinalInt = 100;
    		//NewStat 2012_11_29
    		else if( ReqNum==1 )
    			FinalInt = 100000;
    		else FinalInt = 0;
    		//
    		break;
    	case 3:
    		if( ReqNum==0 )
    			FinalInt = 350;
    		//NewStat 2012_11_29
    		else if( ReqNum==1 )
    			FinalInt = 500000;
    		else FinalInt = 0;
    		//
    		break;
    	case 4:
    		if( ReqNum==0 )
    			FinalInt = 1200;
    		//NewStat 2012_11_29
    		else if( ReqNum==1 )
    			FinalInt = 1500000;
    		else FinalInt = 0;
    		//
    		break;
    	case 5:
    		if( ReqNum==0 )
    			FinalInt = 2300;
    		//NewStat 2012_11_29
    		else if( ReqNum==1 )
    			FinalInt = 3500000;
    		else FinalInt = 20;
    		//
    		break;
    	case 6:
    		if( ReqNum==0 )
    			FinalInt = 3600;
    		//NewStat 2012_11_29
    		else if( ReqNum==1 )
    			FinalInt = 5500000;
    		else FinalInt = 50;
    		//
    		break;
    	default:
    		if( ReqNum==0 )
    			FinalInt = 3600+GetDoubleScaling(CurLevel,350);
    		//NewStat 2012_11_29
    		else if( ReqNum==1 )
    			FinalInt = 5500000+GetDoubleScaling(CurLevel,500000);
    		else FinalInt = 50;
    		//
    	}
    	if( ReqNum==0 )
    		return Min(StatOther.RStalkerKillsStat,FinalInt);
    	//NewStat 2012_11_29
    	else if( ReqNum==1 )
    		return Min(StatOther.RBullpupDamageStat,FinalInt);
    	return Min(StatOther.RMGSirenKillsStat,FinalInt);
    	//
    }
    Замечание
    В данной реализации я для всех уровней больших 6 оставил значение 50 для Сирен. Можно его как либо изменять в секции
    Код:
    	default:
    		if( ReqNum==0 )
    			FinalInt = 3600+GetDoubleScaling(CurLevel,350);
    		//NewStat 2012_11_29
    		else if( ReqNum==1 )
    			FinalInt = 5500000+GetDoubleScaling(CurLevel,500000);
    		else FinalInt = 50;
    
    Правим defaultproperties
    Код:
    defaultproperties
    {
    	CustomLevelInfo="50% more damage with Assault/Battle Rifles|%r less recoil with Assault/Battle Rifles|25% larger Assault/Battle Rifles clip|%s faster reload with all weapons|%d discount on Assault/Battle Rifles|Spawn with an AK47|Can see cloaked Stalkers from 16m|Can see enemy health from 16m|Up to %z Zed-Time Extensions"
    	SRLevelEffects(0)="5% more damage with Assault/Battle Rifles|5% less recoil with Assault/Battle Rifles|5% faster reload with all weapons|10% discount on Assault/Battle Rifles|Can see cloaked Stalkers from 4 meters"
    	SRLevelEffects(1)="10% more damage with Assault/Battle Rifles|10% less recoil with Assault/Battle Rifles|10% larger Assault/Battle Rifles clip|10% faster reload with all weapons|20% discount on Assault/Battle Rifles|Can see cloaked Stalkers from 8m|Can see enemy health from 4m"
    	SRLevelEffects(2)="20% more damage with Assault/Battle Rifles|15% less recoil with Assault/Battle Rifles|20% larger Assault/Battle Rifles clip|15% faster reload with all weapons|30% discount on Assault/Battle Rifles|Can see cloaked Stalkers from 10m|Can see enemy health from 7m"
    	SRLevelEffects(3)="30% more damage with Assault/Battle Rifles|20% less recoil with Assault/Battle Rifles|25% larger Assault/Battle Rifles clip|20% faster reload with all weapons|40% discount on Assault/Battle Rifles|Can see cloaked Stalkers from 12m|Can see enemy health from 10m|Zed-Time can be extended by killing an enemy while in slow motion"
    	SRLevelEffects(4)="40% more damage with Assault/Battle Rifles|30% less recoil with Assault/Battle Rifles|25% larger Assault/Battle Rifles clip|25% faster reload with all weapons|50% discount on Assault/Battle Rifles|Can see cloaked Stalkers from 14m|Can see enemy health from 13m|Up to 2 Zed-Time Extensions"
    	SRLevelEffects(5)="50% more damage with Assault/Battle Rifles|30% less recoil with Assault/Battle Rifles|25% larger Assault/Battle Rifles clip|30% faster reload with all weapons|60% discount on Assault/Battle Rifles|Spawn with a Bullpup|Can see cloaked Stalkers from 16m|Can see enemy health from 16m|Up to 3 Zed-Time Extensions"
    	SRLevelEffects(6)="50% more damage with Assault/Battle Rifles|40% less recoil with Assault/Battle Rifles|25% larger Assault/Battle Rifles clip|35% faster reload with all weapons|70% discount on Assault/Battle Rifles|Spawn with an AK47|Can see cloaked Stalkers from 16m|Can see enemy health from 16m|Up to 4 Zed-Time Extensions"
    	//NewStat 2012_11_29
    	NumRequirements=3
    	//
    	PerkIndex=3
    	OnHUDIcon=Texture'KillingFloorHUD.Perks.Perk_Commando'
    	OnHUDGoldIcon=Texture'KillingFloor2HUD.Perk_Icons.Perk_Commando_Gold'
    	VeterancyName="Commando"
    	Requirements(0)="Kill %x Stalkers with Assault/Battle Rifles"
    	Requirements(1)="Deal %x damage with Assault/Battle Rifles"
    	//NewStat 2012_11_29
    	Requirements(2)="Kill %x Sirens with PKM"
    	//
    }
    

    3. Теперь привяжем убийство сирен к пулемёту
    Отредактируем PKMMut.DamTypePKM
    Код:
    static function AwardKill(KFSteamStatsAndAchievements KFStatsAndAchievements, KFPlayerController Killer, KFMonster Killed )
    {
    	if( Killed.IsA('ZombieStalker') )
    		KFStatsAndAchievements.AddStalkerKill();
    	//NewStat 2012_11_29
    	if( Killed.IsA('ZombieSiren') )
    		ServerStStats(KFStatsAndAchievements).AddMGSirenKill();
    	//
    }
    
    Всё.

    Теперь пару слов куда добавлять PKMMut при компиляции
    EditPackages=PKMMut
    должен быть после
    EditPackages=ServerPerksMut
    Так как в пулемёте используется ServerStStats (а этот класс из ServerPerksMut)
    Поэтому всё оружие должно, либо лежать в паке ServerPerksMut, либо EditPackages этой пушки должен быть после ServerPerksMut

    Чтобы при этом быть в состоянии прописать оружие в файлах перков в ServerPerksP
    (который идёт после ServerPerks и перед ServerPerksMut)
    можно написать его так:
    Код:
    static function float ModifyRecoilSpread(KFPlayerReplicationInfo KFPRI, WeaponFire Other, out float Recoil)
    {
    	if	( Bullpup(Other.Weapon) != none || AK47AssaultRifle(Other.Weapon) != none
    		|| SCARMK17AssaultRifle(Other.Weapon) != none || M4AssaultRifle(Other.Weapon) != none
    		|| FNFAL_ACOG_AssaultRifle(Other.Weapon) != none
    		//NewStat 2012_11_29
    		|| Other.Weapon.IsA('PKM')
    		//
    		)
    	{
    ...
    
    Код:
    static function int AddDamage(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, int InDamage, class<DamageType> DmgType)
    {
    	if	( DmgType == class'DamTypeBullpup' || DmgType == class'DamTypeAK47AssaultRifle'
    		|| DmgType == class'DamTypeSCARMK17AssaultRifle' || DmgType == class'DamTypeM4AssaultRifle'
    		|| DmgType == class'DamTypeFNFALAssaultRifle'
    		//NewStat 2012_11_29
    		|| DmgType.Name == 'DamTypePKM'
    		//
    		)
    	{
    ...
    
    Код:
    static function float AddExtraAmmoFor(KFPlayerReplicationInfo KFPRI, Class<Ammunition> AmmoType)
    {
    	if	( (AmmoType==class'BullpupAmmo' || AmmoType==class'AK47Ammo' || AmmoType==class'SCARMK17Ammo'
    		|| AmmoType==class'M4Ammo' || AmmoType==class'FNFALAmmo'
    		//NewStat 2012_11_29
    		|| AmmoType.Name == 'PKMAmmo'
    		//
    		)
    

    Ниже исходники ServerPerks 6.01 с прописанным пулемётом подготовленные к компиляции (не забываем удалить ServerPerks.u, ServerPerksP.u и ServerPerksMut.u) + откомпилированный вариант
    Кроме того я прописал пулемёт всем уровням коммандоса для того, чтобы проще было проверять ( но начиная с 4 уровня он выпадает из-за нехватки веса - так что ищите его на земле)) )
    В killingfloor.ini добавить ServerPackages=ServerPerksMut (т.к. я туда запихал пулемёт )) ) или добавлять в магазин TraderInventory=4:ServerPerksMut.PKMPickup

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

    Для тех, кто будет изучать исходники:
    В перечисленных выше классах все изменения отмечены следующим образом:
    //NewStat 2012_11_29
    изменения
    //

    Для совсем ленивых ссылка на готовый сервер версии 1043 с ServerPerks 6.01 и пулемётом
    Для запуска сервера достаточно нажать _start.bat
    Сервер долго не пролежит - удалю через несколько дней )
    Ссылка 1 или Ссылка 2

    upd. Отслеживание хэдшотов, пример:
    Код:
    static function AwardKill(KFSteamStatsAndAchievements KFStatsAndAchievements, KFPlayerController Killer, KFMonster Killed )
    {
    	if(Killed.bDecapitated)
    	{
    		if( Killed.IsA('ZombieBloat') )
    			ServerStStats(KFStatsAndAchievements).AddHeadShotBloatKill();
    	}
    }
    

    upd. Имена новых переменных в StatsObject советую выбирать покороче. Иначе, если сервер популярен и в базе много народу записано - длинные имена значительно увеличат размер базы
     
    ЛОХМАТЫЙ, HATAXA, Винни и 5 другим нравится это.
  19. Dr_Killjoy

    Dr_Killjoy Заблокированные

    Есть один нюанс. При принятии строки мутатором с удалённого сервера, и при отправке, следует все новые статы добавлять в конец строки, потому что считывание строки в обратном случае, произойдёт некорректно. Так же следует убрать CC из операций с строкой, поскольку этот элемент по сути реализован как массив, и он не оставит нам возможности добавлять новые статы своим способом. Все эти комментарии относятся к работе с удалённой базой.
     
    ЛОХМАТЫЙ и Flame нравится это.
  20. Flame

    Flame -Заслуженый кодер форума-

    Никогда не работал с удалённой базой - поэтому не знал, спасибо )