"Двойной" кач

Тема в разделе "Общего назначения", создана пользователем Flame, 5 апр 2013.

Метки:
  1. Flame

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

    На самом деле не двойной
    Множитель может быть любым. Хоть 1000 (я на 1000 и проверял, чтобы точно быть уверенным, что не забыл про какой-нибудь параметр какого-нибудь перка) )
    Можно даж 0 или отрицательный поставить. Для многих параметров будет работать )

    Только я так подумал
    Я вижу 2 способа использования данного мутатора
    1. В праздники делать всем подарок в виде повышенного кача
    2. Вип лист игроков (часто эти игроки платят деньги) и для них повышенный кач

    Первый способ мне вполне нравится, а вот второй нет
    Поэтому те кто желают вип список - вот ссылка или приделывайте список сами

    Код:
    Код:
    class MultipliedExpMut extends Mutator config(MultipliedExpMut);
    
    var config int nExp;
    var MeXGameRules RulesMod;
    
    function PostBeginPlay()
    {
    	if( RulesMod==None )
    		RulesMod = Spawn(Class'MeXGameRules');
    	RulesMod.nExp=nExp;
    	
    	if(KFGameType(Level.Game)==None) Destroyed();
    	class'KFMod.Welder'.default.FireModeClass[0]=Class'MultipliedExpMut.newWeldFire';
    	class'KFMod.Welder'.default.FireModeClass[1]=Class'MultipliedExpMut.newUnWeldFire';
    	class'KFMod.Syringe'.default.FireModeClass[0]=Class'MultipliedExpMut.newSyringeFire';
    	class'KFMod.KrissMAltFire'.default.ProjectileClass=Class'MultipliedExpMut.newKrissMHealingProjectile';
    	class'KFMod.M7A3MAltFire'.default.ProjectileClass=Class'MultipliedExpMut.newM7A3MHealinglProjectile';
    	class'KFMod.MP5MAltFire'.default.ProjectileClass=Class'MultipliedExpMut.newMP5MHealinglProjectile';
    	class'KFMod.MP7MAltFire'.default.ProjectileClass=Class'MultipliedExpMut.newMP7MHealinglProjectile';
    	class'MultipliedExpMut.newWeldFire'.default.nExp=nExp;
    	class'MultipliedExpMut.newSyringeFire'.default.nExp=nExp;
    	Class'MultipliedExpMut.newKrissMHealingProjectile'.default.nExp=nExp;
    	Class'MultipliedExpMut.newM7A3MHealinglProjectile'.default.nExp=nExp;
    	Class'MultipliedExpMut.newMP5MHealinglProjectile'.default.nExp=nExp;
    	Class'MultipliedExpMut.newMP7MHealinglProjectile'.default.nExp=nExp;
    	Class'MultipliedExpMut.newMedicNade'.default.nExp=nExp;
    	Super.PostBeginPlay();
    }
    
    defaultproperties
    {
    	nExp=2
    	bAddToServerPackages=True
    	GroupName="KF-Exp"
    	FriendlyName="MultipliedExpMut"
    	Description="Multiplies experience of all players"
    }
    
    Код:
    class MeXGameRules extends GameRules;
    
    var array<KFMonster> DecapitatedMonsters;
    var int nExp;
    
    function PostBeginPlay()
    {
    	if( Level.Game.GameRulesModifiers==None )
    		Level.Game.GameRulesModifiers = Self;
    	else Level.Game.GameRulesModifiers.AddGameRules(Self);
    }
    
    function AddGameRules(GameRules GR)
    {
    	if ( GR!=Self )
    		Super.AddGameRules(GR);
    }
    
    function bool PreventDeath(Pawn Killed, Controller Killer, class<DamageType> damageType, vector HitLocation)
    {
    	local KFSteamStatsAndAchievements KFStatsAndAchievements;
    	local PlayerController PC;
    	local int i;
    	//Чистим список обезглавленых от уже мёртвых
    	CleanDecapitatedList();
    	if(damageType==None || Killer==None || Killed==None)
    	{
    		if ( NextGameRules != None) 
    			return NextGameRules.PreventDeath(Killed,Killer,damageType,HitLocation);
    		return false;
    	}
    	PC=PlayerController(Killer);
    	if(PC!=None)
    		KFStatsAndAchievements = KFSteamStatsAndAchievements(PC.SteamStatsAndAchievements);
    	if( PC==None || KFStatsAndAchievements==None )
    	{
    		if ( NextGameRules != None) 
    			return NextGameRules.PreventDeath(Killed,Killer,damageType,HitLocation);
    		return false;
    	}
    	// Commando
    	if	(
    			DamageType.Name == 'DamTypeBullpup'					||
    			DamageType.Name == 'DamTypeAK47AssaultRifle'		||
    			DamageType.Name == 'DamTypeFNFALAssaultRifle'		||
    			DamageType.Name == 'DamTypeSCARMK17AssaultRifle'	||
    			DamageType.Name == 'DamTypeM4AssaultRifle'			||
    			DamageType.Name == 'DamTypeThompson'				||
    			DamageType.Name == 'DamTypeMKb42AssaultRifle'
    		)
    	{
    		if( Killed.IsA('ZombieStalker') )
    		{
    			for(i=0;i<nExp-1;i++)
    				KFStatsAndAchievements.AddStalkerKill();
    		}
    	}
    	if ( NextGameRules != None) 
    		return NextGameRules.PreventDeath(Killed,Killer, damageType,HitLocation);
    	return false;
    }
    
    function int NetDamage( int OriginalDamage, int Damage, Pawn Injured, Pawn InstigatedBy, vector HitLocation, out vector Momentum, class<DamageType> DamageType )
    {
    	local KFSteamStatsAndAchievements KFStatsAndAchievements;
    	local PlayerController PC;
    	local int i;
    	if(Injured==None || InstigatedBy==None)
    	{
    		if ( NextGameRules != None) 
    			return NextGameRules.NetDamage(OriginalDamage, Damage, injured, instigatedBy, HitLocation, Momentum, DamageType);
    		return Damage;
    	}
    
    	if	(
    			Injured.IsA('KFMonster')						&& 
    			InstigatedBy.IsA('KFHumanPawn')					&&
    			InstigatedBy.Controller.IsA('PlayerController')	&&
    			Damage>0 
    		)
    	{
    		PC=PlayerController(InstigatedBy.Controller);
    		if(PC!=None)
    			KFStatsAndAchievements = KFSteamStatsAndAchievements(PC.SteamStatsAndAchievements);
    
    		if( PC==None || KFStatsAndAchievements==None )
    		{
    			if ( NextGameRules != None) 
    				return NextGameRules.NetDamage(OriginalDamage, Damage, injured, instigatedBy, HitLocation, Momentum, DamageType);
    			return Damage;
    		}
    		// SupportSpec
    		if	(
    				class<KFWeaponDamageType>(DamageType)!=none	&&
    				class<KFWeaponDamageType>(DamageType).default.bIsPowerWeapon
    			)
    			KFStatsAndAchievements.AddShotgunDamage((nExp-1) * Min(Damage,Injured.Health));
    		// Berserker
    		else if	(
    					class<KFWeaponDamageType>(DamageType) != none && 
    					class<KFWeaponDamageType>(DamageType).default.bIsMeleeDamage 
    				)
    			KFStatsAndAchievements.AddMeleeDamage((nExp-1) * Min(Damage,Injured.Health));
    		// Commando
    		else if	(
    					DamageType.Name == 'DamTypeBullpup'					||
    					DamageType.Name == 'DamTypeAK47AssaultRifle'		||
    					DamageType.Name == 'DamTypeFNFALAssaultRifle'		||
    					DamageType.Name == 'DamTypeSCARMK17AssaultRifle'	||
    					DamageType.Name == 'DamTypeM4AssaultRifle'			||
    					DamageType.Name == 'DamTypeThompson'				||
    					DamageType.Name == 'DamTypeMKb42AssaultRifle'
    				)
    			KFStatsAndAchievements.AddBullpupDamage((nExp-1) * Min(Damage,Injured.Health));
    		// Firebug
    		else if	(
    					class<KFWeaponDamageType>(DamageType)!=None &&
    					class<KFWeaponDamageType>(DamageType).default.bDealBurningDamage
    				)
    			KFStatsAndAchievements.AddFlameThrowerDamage((nExp-1) * Min(Damage,Injured.Health));
    		// Sharpshooter
    		else if	(
    					class<KFWeaponDamageType>(DamageType)!=None &&
    					class<KFWeaponDamageType>(DamageType).default.bSniperWeapon
    				)
    		{
    			if(KFMonster(Injured).bDecapitated && !InDecapitatedList(KFMonster(Injured)))
    			{
    				DecapitatedMonsters[DecapitatedMonsters.Length]=KFMonster(Injured);
    				for(i=0;i<nExp-1;i++)
    					KFStatsAndAchievements.AddHeadshotKill(false);
    			}
    		}
    		// Demolitions
    		else if	(
    					class<KFWeaponDamageType>(DamageType)!=none &&
    					class<KFWeaponDamageType>(DamageType).default.bIsExplosive
    				)
    			KFStatsAndAchievements.AddExplosivesDamage((nExp-1) * Min(Damage,Injured.Health));
    	}
    	if ( NextGameRules != None )
    		return NextGameRules.NetDamage( OriginalDamage, Damage,injured,instigatedBy,HitLocation,Momentum,DamageType );
    	return Damage;
    }
    
    function bool InDecapitatedList(KFMonster M)
    {
    	local int i;
    	for(i=0;i<DecapitatedMonsters.Length;i++)
    		if(DecapitatedMonsters[i]==M) return true;
    	return false;
    }
    
    function CleanDecapitatedList()
    {
    	local int i;
    	for (i=0; i<DecapitatedMonsters.Length; i++)
    	{
    		if (DecapitatedMonsters[i]==none)
    		{
    			DecapitatedMonsters.Remove(i,1);
    			i--;
    		}
    	}
    }
    

    Для медика и в случае сварки - я заменяю либо Fire классы, либо Projectile
    Потом может выложу версию, которая это обходит
    Но в принципе и так неплохо

    В данном мутаторе учтено только классическое оружие - остальное прописывайте
    по-аналогии
    Хотя в общем то это касается оружия коммандоса, оружия медика и новых сварок
    Всё остальное будет работать и так скорее всего.
    Чтобы использовать мед. гранату - надо в ServerPerksP.SRVetFieldMedic прописать
    Код:
    static function class<Grenade> GetNadeType(KFPlayerReplicationInfo KFPRI)
    {
    	local class<Grenade> gClass;
    	gClass = class<Grenade>(DynamicLoadObject("MultipliedExpMut.newMedicNade", class'Class'));
    	if(gClass!=none)
    		return gClass;
    	return Super.GetNadeType(KFPRI);
    }
    
    Ссылка 1 или Ссылка 2
    Добавлять в виде MultipliedExpMut.MultipliedExpMut
    Множитель nExp задаётся в ini файле

    upd. 2013.04.13 - версия поправлена (см. пост Dr_Killjoy)

    upd. 2013.10.09 - поправлен код сварки в связи с последними патчами TWI
     
    Denkul999, Stein, kok-s и 9 другим нравится это.
  2. kok-s

    kok-s Консильери

    Благодарю!
     
  3. Udaroff

    Udaroff Бандит

    поставил, запустил ждущий серв, все работает, но после выхода не сохраняется нанесенный урон. так и должно быть?
     
  4. Flame

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

    нет, не должно
    на выделенном сохраняется
    да и на ждущем должно сохраняться
    если поиграть, умереть и выйти, то сохранится?
    а
    ну и ещё вопрос, Server Perks то используется? )
    я вообще не очень задумывался над вопросом куда что сохраняется, если не использовать SP - надо бы изучить вопрос
    мутатор ведь чёрный - значит кача вообще не должно быть без SP или аналога
     
  5. chi100v

    chi100v Соучастник

    спасибо отличный мутатор, какраз в прошлом году спрашивал как реализовать такое
    вопрос, какое значение выставить в ini файле чтобы скорость прокачки была стандартной?
     
    Noxicon и Папка01 нравится это.
  6. Udaroff

    Udaroff Бандит

    нет

    тоже нет, а без него никак?
     
  7. Flame

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

    1

    Я так понял - сейчас нет чёрных мутаторов
    Ну и в случае серых мутаторов - кач видимо всегда будет, а вот сохраняться (если нет SP или аналога) не будет
    Но я ещё покопаюсь в теме
     
  8. Dr_Killjoy

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

    Без сп у тебя не будет кача с подавляющим большинством мутаторов. Белый список трипы обновлять не собираются. Да и мутатор, дающий возможность быстрее прокачаться, никогда не попадёт в белый список.
     
  9. Atlan

    Atlan Капо

    Флейм хитрец...мут конечно полезный,но только для тех у кого каждый день праздник .....
     
  10. Flame

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

    Не
    Ну я для чего выкладываю мутаторы?
    Чтобы насобирать плюсиков было побольше примеров разных мутаторов и начинающим мододелам жилось попроще
    Кроме того - чтобы из них брать куски кода и использовать в своих мутаторах
    Мне вот если надо какой мутатор сделать - я беру пару тройку разных своих мутаторов и новый мутатор готов )
    У меня никогда не было намерения давать полноценные готовые решения, если только не получилось так, что я уже для себя сделал это полноценное решение. Тогда мне не жалко выложить

    Я сделал в последнее время кучу мутаторов, где есть вип списки. Например, LostZombiesMut.
    Достаточно оттуда взять функцию проверки и сам массив и поставить их в этот мутатор.
    И вызывать эту функцию из функций GameRules + в случае сварки и медика будут небольшие проблемы )

    Я вовсе не буду против, если кто-то не поленится и допишет вип списки
    (и даже помогу в возникающих проблемах, если увижу, что человек старается и действительно что-то пытается сделать)
    Но лично мне вот пока что-то не очень хочется поощрять всех этих випов
     
  11. Atlan

    Atlan Капо

    Не у всех бабла навалом,тогда и приходят на помощь игроки...ладно были бы скины или стволы,я б еще попытался пройти свою лень и что нибудь рабочее соорудить,а с обычными мутаторами,это засада для меня.

    Ну тогда ты получается вообще пример парадокса в развитии кф.

    З.Ы.Ладно забей-сделал для себя,подарил всем,пускай будет так.
     
  12. Flame

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

    Даа )
    Да мне глубоко плевать, если честно, на развитие кф )) (да и на кф в общем то )) )
    Я вообще во всём этом участвую из-за приятного общения с приятными людьми
    Часть из них мододелы, часть игроки с наших серверов
    Причём общения вовсе не на темы кф или мутаторов

    А мутатор
    Ну я раскачаюсь как-нть сделать версию без замены файлов для медика и сварщика
    Если никто так и не доделает за меня вип, то может в версии того мутатора сделаю списочек

    А тебя вообще не понимаю )
    Ну если хочешь ты так вип этот, то заплати чуток кому-нибудь (главное не мне)) ) и они присобачат тебе этот список
    Там делов то на 5 минут
    Как раз окупится, если игроки будут за это платить
     
  13. Dr_Killjoy

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

    Смотрел код мутатора, смущает использование значения nExp в добавлении сталкеров и дамага. Поскольку в гейм тайпе будет даваться дамаг в любом случае, получится что множитель кача будет всегда больше на единицу. Или я что-то не вкурил? Так же мне кажется вместо проверки на bIsPowerWeapon и так далее, есть смысл использовать AwardDamage. Опять же, может я что-то не понял, интересно бы понять почему именно так.
     
  14. Flame

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

    Ты и меня запутал )
    Хотя, кстати, да
    Вообще говоря надо бы nExp-1 везде прописать (так же как эт сделано в сварке)
    Я просто переделывал свою версию, а у меня в DamageType'ах нету кача
    Всё в GameRules запихнул. Так что да. Сегодня поправлю

    Насчёт AwardDamage не понял. Где ты его хочешь звать, если я никак не трогаю DamageType классы?
    В том плане, что вызывать искусственно его? И какого-нибудь сапповского DamageType? (в случае bIsPowerWeapon)
    В принципе можно

    bIsPowerWeapon и прочие я использую чтобы понять тип урона и не прописывать большой список DamageType'ов, как это приходится делать с оружием коммандоса
    Для всех остальных перков есть 1 свойство, которое их характеризует
     
  15. Dr_Killjoy

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

    В хилках по идее не надо минус один делать.

    Ну если у тебя не используется AwardDamage и кач где-то в другом месте, тогда понятно. Просто проще вызвать AwardDamage из дамтайпа, тогда не будет этих if.
     
  16. Flame

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

    Да, понял твою мысль
    Так действительно проще и лаконичнее
    Но я переделывал свою версию, а у меня у каждого перка по 3 параметра, поэтому мне такое даж в голову не пришло :)

    Хотя со снайпером всё равно придётся повозиться, небось
     
  17. hegyeri

    hegyeri Соучастник

    I want to use nExp=-1
    Negative value does not work! :(
     
  18. Flame

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

    It should work for ShotgunDamage, MeleeDamage, BullpupDamage, FlameThrowerDamage, ExplosivesDamage
     
  19. hegyeri

    hegyeri Соучастник

    ok, thx.

    One more question
    What are the negative values​​ (borders)?

    e.g.
    -1, -2, -3, etc. (so good?)
     
  20. Flame

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

    no borders )