Замена начального оружия

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

Метки:
  1. Interneyron

    Interneyron Соучастник

    благодарю :thumbsup: с этим разобрался
     
  2. Ninty-six

    Ninty-six Новенький

    Отличный мут, функционал мечты при хардкорной песочнице, где со стандартами и первую волну не вытянуть.
    Есть вопрос:
    • При создании сервера я прописываю конфиг и делаю выделенку - на половине перков заменет оружие ,а на половине нет. Конфиг прилагаю , с чем связано мне не понять, возможно конфликт мутов.
    OldWeaponB=KFMod.Knife
    NewWeaponB=KFMod.Katana
    OldWeaponCM=KFMod.Single
    NewWeaponCM=KFMod.Deagle
    OldWeaponDM=KFMod.Single
    NewWeaponDM=KFMod.Deagle
    OldWeaponM=
    NewWeaponM=
    OldWeaponF=KFMod.Knife
    NewWeaponF=KFMod.Katana
    OldWeaponSS=KFMod.Single
    NewWeaponSS=KFMod.Deagle
    OldWeaponSP=KFMod.Single
    NewWeaponSP=KFMod.Deagle
    bKFNeverThrow=false
    Weight=0

    • Но с тем-же успехом в одиночной игре заменяет на ура.

    ------------------------------------------------------------------------------------------------------------

    Дальше предложение по изменению мутатора:

    • Во первых сделать возможность заменять не одно оружие ( Сделать для каждого перка - что забирать, а что выдавать).

    • Во вторых убрать стоймость именно этого выданного оружия при продаже ( если возможно )

    • В третьих сделать возможность просто убрать оружие с перка ( ибо если сейчас одну из двух строк не забить в конфиге, то сервер сходит с ума чёрный экран и виснет)

    ________________________________________________

    FIX

    Если убираю активный мутатор IJCWeaponPack-WhiteV27 то KFMod.Single удачно меняется на дигл, я даже не предполагаю как они могут быть взаимосвязаны, но конфликт именно тут. При всём том, если вырубить мутатор IJCWeaponPack-WhiteV2 - оружие из него не купить, даже учитывая, что оно прописано в KFCustomShopV2


    FIX v.2

    Вскрыв оба мутатора, увидев, что в них, я рискну предположить ( Не знаком с US ) , что проблема в этом KFPlayerReplicationInfo KFPRI.
    Мутатор IJCWeaponPack-WhiteV27 модифицирует оружие и его характеристики от перка, и перки там все, кроме поджигателя, соответственно у пожарника оружие удачно заменяется, а у остальных - нет. Альтернатив коду я не знаю. Буду рад фиксу мута ибо SP мне не нравится, классика лучше и этот мут будет весьма кстати. (Угадал в чём проблема?)
     
  3. Configurator

    Configurator Бандит

    Подскажите, может коды оружия не те пишу

    OldWeaponCM=KFMod.AK47
    NewWeaponCM=KFMod.SCARMK17
    но командос также с калашом появляется
     
  4. Flame

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

    OldWeaponCM=KFMod.AK47AssaultRifle
    NewWeaponCM=KFMod.SCARMK17AssaultRifle
     
    Configurator нравится это.
  5. Configurator

    Configurator Бандит

    Спасибо, неплохо было бы ссылочку в первый пост на список команд оружия для незнающих. Или разъяснение как правильно посмотреть этот код
    А так спасибо за отличный мут!
     
  6. Dr_Killjoy

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

    По идее в KFMod.ucl должно быть. Но я всегда декомпилирую и смотрю названия из исходников.
     
  7. w.a.l

    w.a.l Консильери

    а не легче всё стандартное (в том числе и гранаты) менять в ServerPerks ? Для этого отлично подходит HumanPawn
    Удаляем всё ненужное, стандартное и выдаём перкам то что считаем нужным. (пример Flame)
    Также можно поменять стандартный вес, скорость бега, скорость в воздухе, прыжок, отключить размытие, жизнь батареек...много чего.
     
  8. Flame

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

    не легче, если есть задача не трогать ServerPerks (или нет SP)
    если похрен, то можно и SRHumanPawn
     
  9. w.a.l

    w.a.l Консильери

    Не трогать SP не интересно :teehee:
     
  10. Flame

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

    Лишний раз трогать SP - рыть себе могилу
    Потом будет в итоге неподъёмный кирпич, который не обновить, не поправить
    (ибо вы все нахрен забываете, где и что правили)
    В идеале SP должен быть как KFMod и прочие базовые классы
    Наследоваться с него можно, а править не стоит
     
    ЛОХМАТЫЙ нравится это.
  11. kok-s

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

    Flame Сделай пожалуйста чтоб можно было добавить 2-3 строчки NewWeapon
     
    Stein нравится это.
  12. Stein

    Stein Солдат

    Flame - пожелание если есть возможность, то желательно сделать чтобы при смене перка, оружие менялось обратно на то которое прописано другому перку или дефолтное..
     
  13. Flame

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

  14. Arckon.

    Arckon. Соучастник

    Тема давно неактивна, но попытка — не пытка.
    Хотелось бы увидеть готовую реализацию, при которой была бы возможность назначать не одно лишь начальное оружие для перка, а 2 по типу:
    OldWeaponSS="KFMod.Crossbow"
    NewWeaponSS_First="KFMod.Winchester"
    NewWeaponSS_Second="KFMod.MK23Pistol"
    Без *Weight* и *bKFNeverThrow* переменных (оставить по умолчанию).
     
  15. denfil777

    denfil777 Капо

    Дополнительные пушки и их замена в serverperks редактируется
     
  16. Essence

    Essence Солдат

    За основу брал новую версию от Флейма.
    Код не самый лучший, но чтобы реализовать всё красиво, я ещё недостаточно изучил циклы и динамические массивы.
    Ссылка
     
    Arckon. нравится это.
  17. Flame

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

    А я вообще не очень понимаю откуда взялась версия с "OldWeaponSS" и прочим
    В шапке ж новая версия, а старая под спойлером
    В новой же можно сколько угодно пушек заменять для любого перка

    Например, чтобы берсу заменить не только нож, но и 9мм можно так написать
    Код:
    ReplaceList=(Perk="SRVetBerserker",OldWeapon="KFMod.Knife",newWeapon="KFMod.Katana",Weight=0,bKFNeverThrow=True)
    ReplaceList=(Perk="SRVetBerserker",OldWeapon="KFMod.Single",newWeapon="KFMod.ClaymoreSword",Weight=0,bKFNeverThrow=True)
    
    Вместо ножа будет катана, вместо беретты будет клеймор
    Ну по крайней мере так должно быть )
     
  18. Essence

    Essence Солдат

    Как я понял, он хотел чтобы одно оружие сразу заменялось на два (то бишь несколько newWeapon для одного
    OldWeapon)
     
  19. Essence

    Essence Солдат

    Вот теперь всё красиво (Благодаря Флейму)
    Код:
    class StartWeaponReplaceMut extends Mutator config(StartWeaponReplaceMut);
    
    struct ReplaceStruct
    {
    	var config string Perk;
    	var config string OldWeapon;
    	var config array<string> NewWeapon;
    };
    
    var config array<ReplaceStruct> ReplaceList;
    var array<KFHumanPawn> PendingPlayers;
    
    function PostBeginPlay()
    {
    	SaveConfig();
    	class'KFMod.Single'.default.bKFNeverThrow=False;
    	Super.PostBeginPlay();
    }
    
    function bool CheckReplacement(Actor Other, out byte bSuperRelevant)
    {
    	if(KFHumanPawn(Other)!=None)
    	{
    		PendingPlayers[PendingPlayers.Length]=KFHumanPawn(Other);
    		SetTimer(0.1,false);
    	}
    	return true;
    }
    
    function Timer()
    {
    	while(PendingPlayers.Length>0)
    	{
    		if(PendingPlayers[0]!=None && PendingPlayers[0].PlayerReplicationInfo.PlayerID>0)
    			ReplaceWeapons(PendingPlayers[0]);
    		PendingPlayers.Remove(0,1);
    	}
    }
    
    function ReplaceWeapons(KFHumanPawn P)
    {
    	local KFPlayerReplicationInfo KFPRI;
    	local Name Veterancy;
    	local int i, k;
    	if(P!=None)
    		KFPRI=KFPlayerReplicationInfo(P.PlayerReplicationInfo);
    	if(KFPRI!=None)
    		Veterancy=KFPRI.ClientVeteranSkill.Name;
    	for(i=0;i<ReplaceList.Length;i++)
    	{
    		if(ReplaceList[i].Perk~=string(Veterancy))
    		{
    			for(k=0;k<ReplaceList[i].NewWeapon.Length;k++)
    			{
    				ReplaceWeapon(P,ReplaceList[i].OldWeapon,ReplaceList[i].NewWeapon[k]);
    			}
    			DeleteOldWeapon(P,ReplaceList[i].oldWeapon);
    		}
    	}
    }
    
    function ReplaceWeapon(KFHumanPawn P, string oldWeapon, string NewWeapon)
    {
    	local Inventory Inv;
    	local KFWeapon KFW;
    	local class<KFWeapon> KFWClass;
    	local bool bHasOldWeapon;
    
    	if(P!=None && P.Inventory!=None)
    	{
    		for(Inv=P.Inventory;Inv!=None;Inv=Inv.Inventory)
    		{
    			if(string(Inv.Class)~=NewWeapon)
    				return;
    		}
    		for(Inv=P.Inventory;Inv!=None;Inv=Inv.Inventory)
    		{
    			if(string(Inv.Class)~=oldWeapon)
    			{
    				bHasOldWeapon=True;
    			}
    		}
    		if(!bHasOldWeapon) return;
    		KFWClass = class<KFWeapon>(DynamicLoadObject(NewWeapon, class'Class'));
    		if(KFWClass!=None)
    		{
    			KFW=Spawn(KFWClass);
    			KFW.GiveTo(P);
    		}
    	}
    }
    
    function DeleteOldWeapon(KFHumanPawn P, string oldWeapon)
    {
    	local PlayerController PC;
    	local Inventory Inv;
    
    	if(P!=None)
    		PC=PlayerController(P.Controller);
    
    	for(Inv=P.Inventory;Inv!=None;Inv=Inv.Inventory)
    	{
    		if(string(Inv.Class)~=oldWeapon)
    		{
    			Inv.Destroy();
    		}
    	}
    	if(PC!=None && PC.Pawn!=None)
    	{
    		if(PC.Pawn.Weapon==None)
    			PC.SwitchToBestWeapon();
    	}
    }
    
    defaultproperties
    {
    	ReplaceList(0)=(Perk="KFVetBerserker",OldWeapon="KFMod.Knife",NewWeapon=("KFMod.Katana","KFMod.ClaymoreSword"))
    	bAddToServerPackages=True
    	GroupName="KF-StartWeaponReplace"
    	FriendlyName="Start Weapon Replace"
    	Description="Replaces weapons"
    }
    
    Можно указать 2 и более NewWeapon для одного OldWeapon
    Ссылка
     
    Последнее редактирование модератором: 13 ноя 2017
  20. Flame

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

    Добавил код в твой пост, а то мне пришлось качать, открывать, а просто хотелось на 1-2 строчки глянуть)
    Обновил шапку

    Наверное ещё можно убрать
    Код:
    bAddToServerPackages=True
    
    Ибо вроде не нужен этот пакет на клиенте - я любил раньше везде эту строчку пихать)

    И ещё, насчёт динамических массивов в структуре и иных подходов
    Ты выбрал динамический массив, а я обычно стараюсь вынести это в базовый массив
    Пусть это не оптимально в плане количества текста в инишнике, зато максимально просто и не надо думать как массив в массиве оформлять)
    То есть я при подобной задаче подправил бы пару строк в исходном мутаторе, чтобы он удалял oldWeapon не сразу, а после прохода по всем элементам массива. И в итоге было бы не
    Код:
    ReplaceList=(Perk="KFVetBerserker",OldWeapon="KFMod.Knife",NewWeapon=("KFMod.Katana","KFMod.ClaymoreSword"))
    
    а
    Код:
    ReplaceList=(Perk="KFVetBerserker",OldWeapon="KFMod.Knife",NewWeapon="KFMod.Katana")
    ReplaceList=(Perk="KFVetBerserker",OldWeapon="KFMod.Knife",NewWeapon="KFMod.ClaymoreSword")
    
    Но это уж мои заморочки)
    А так - молодец) Хороший код
     
    Essence нравится это.