Замена оружия на карте

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

  1. Flame

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

    Речь идёт об оружии, которое уже лежит на карте и о том, которое спавнится в определённых местах
    (объекты KFRandomItemSpawn)

    Описание:
    Мутатор может быть полезен тем, кто хочет разнообразить игру и тем, у кого есть в игре свои унаследованные пушки
    (например, переделанный дигл, лежащий по адресу MyDeagle.Deagle),
    ибо две модельки диглов на карте (официальная и своя) эт нехорошо,
    а так же для тех, кто полностью хочет заменить все пушки и не хочет никакого упоминания о классических
    (именно такой человек меня и пинал, чтобы я сделал этот мутатор)) )

    Настройки в ini файле:
    Прежде всего это массив структур с отсылками на новые пушки, например,
    Код:
    PickupList=(PickupClassName="KFMod.MP7MPickup",Probability=15)
    PickupList=(PickupClassName="KFMod.MP5MPickup",Probability=10)
    PickupList=(PickupClassName="KFMod.KrissMPickup",Probability=5)
    
    Если загнать в ini только эти 3 элемента, то всегда будут спавниться эти 3 мед. пушки.
    PickupClassName - полный название класса пушки
    Probability - вероятность с которой она появится
    Это мягко говоря не совсем вероятность. Расчёт того какая пушка появится следующий: пробегаем по всему массиву и суммируем все Probability
    Для данного примера это будет 15+10+5=30
    Соответственно шанс, что появится первая пушка будет 15/30=1/2, шанс, что вторая 10/30=1/3 и шанс, что появится третья - 5/30=1/6
    Мы с таким же успехом могли написать 75,50,25 в настройках, или 3, 2, 1.
    Думаю суть понятна

    Размер списка оружия практически не имеет ограничений. Вот, например, настройки, которые я сегодня поставлю на свои сервера для теста
    Код:
    bApplyToFixedPickups=true
    PickupList=(PickupClassName="shweapons.shMP7MPickup",Probability=15)
    PickupList=(PickupClassName="shweapons.shMP5MPickup",Probability=10)
    PickupList=(PickupClassName="shweapons.shKrissMPickup",Probability=5)
    PickupList=(PickupClassName="shweapons.shHKMP7LLIPickup",Probability=5)
    PickupList=(PickupClassName="shweapons.shShotgunPickup",Probability=15)
    PickupList=(PickupClassName="shweapons.shKSGPickup",Probability=10)
    PickupList=(PickupClassName="shweapons.shSpas12RLLIPickup",Probability=5)
    PickupList=(PickupClassName="shweapons.shAA12Pickup",Probability=5)
    PickupList=(PickupClassName="shweapons.shCrossbowPickup",Probability=15)
    PickupList=(PickupClassName="shweapons.shSVDLLIPickup",Probability=10)
    PickupList=(PickupClassName="shweapons.shM14EBRPickup",Probability=10)
    PickupList=(PickupClassName="shweapons.shSIG550SRPickup",Probability=5)
    PickupList=(PickupClassName="shweapons.shSCARLAssaultRiflePickup",Probability=15)
    PickupList=(PickupClassName="shweapons.shAKS74ULLIPickup",Probability=10)
    PickupList=(PickupClassName="shweapons.shSCARMK17Pickup",Probability=5)
    PickupList=(PickupClassName="shweapons.shRPK47Pickup",Probability=5)
    PickupList=(PickupClassName="shweapons.shAxePickup",Probability=15)
    PickupList=(PickupClassName="shweapons.shKatanaPickup",Probability=10)
    PickupList=(PickupClassName="shweapons.shClaymoreSwordPickup",Probability=5)
    PickupList=(PickupClassName="shweapons.shCrossbuzzsawPickup",Probability=5)
    PickupList=(PickupClassName="shweapons.shMAC10Pickup",Probability=15)
    PickupList=(PickupClassName="shweapons.shFlameThrowerPickup",Probability=10)
    PickupList=(PickupClassName="shweapons.shTrenchgunPickup",Probability=10)
    PickupList=(PickupClassName="shweapons.shHuskGunPickup",Probability=10)
    PickupList=(PickupClassName="shweapons.shM79Pickup",Probability=15)
    PickupList=(PickupClassName="shweapons.shM32Pickup",Probability=10)
    PickupList=(PickupClassName="shweapons.shSeekerSixPickup",Probability=10)
    PickupList=(PickupClassName="shweapons.shLAWPickup",Probability=5)
    PickupList=(PickupClassName="shweapons.shMK23Pickup",Probability=15)
    PickupList=(PickupClassName="shweapons.shWaltherP99Pickup",Probability=15)
    PickupList=(PickupClassName="shweapons.shDual44MagnumPickup",Probability=10)
    PickupList=(PickupClassName="shweapons.shDeaglePickup",Probability=5)
    

    Если параметр bApplyToFixedPickups установлен в true - значит мы заменяем не только случайное оружие, но и стационарное, раскиданное на карте
    Это стационарное становится местом, где так же будет появляться случайное оружие из заданного списка

    Кроме того мы можем задать массив карт на которых мы не хотим никаких замен, например,
    Код:
    MapExcludeList="KF-Manor"
    MapExcludeList="KF-BioticLab"
    
    Если название карты непонятно - я добавил в мутатор вывод названия в лог сервера
    в формате PickupReplaceMut.MapNameInfo: Map name is *******
    Код:
    Код:
    class PickupReplaceMut extends Mutator config(PickupReplaceMut);
    
    struct PickupInfo
    {
    	var config string PickupClassName;
    	var config int Probability;
    };
    var config array<PickupInfo> PickupList;
    var config array<string> MapExcludeList;
    var config bool bApplyToFixedPickups;
    
    function PostBeginPlay()
    {
    	local string URL;
    	URL=GetShortUrl(Level.GetLocalURL());
    	Log("PickupReplaceMut.MapNameInfo: Map name is"@URL);
    	if(!InMapExcludeList(URL))
    		ReplaceItemSpawn();
    }
    
    function ReplaceItemSpawn()
    {
    	local KFRandomItemSpawn KFRIS;
    	local KFWeaponPickup KFWP;
    	foreach DynamicActors(class'KFRandomItemSpawn',KFRIS)
    	{
    		if(KFRIS.Class.Name=='KFRandomItemSpawn')
    		{
    			NewReplaceWith(KFRIS,"PickupReplaceMut.NewKFRandomItemSpawn");
    			KFRIS.Destroy();
    		}
    	}
    	if(bApplyToFixedPickups)
    	{
    		foreach DynamicActors(class'KFWeaponPickup',KFWP)
    		{
    			NewReplaceWith(KFWP,"PickupReplaceMut.NewKFRandomItemSpawn");
    			KFWP.Destroy();
    		}
    	}
    }
    
    function bool NewReplaceWith(actor Other, string aClassName)
    {
    	local Actor A;
    	local class<Actor> aClass;
    
    	if ( aClassName == "" )
    		return true;
    
    	aClass = class<Actor>(DynamicLoadObject(aClassName, class'Class'));
    	//Flame. заменяем Owner на Self. В базовой версии там Other.Owner
    	if ( aClass != None )
    		A = Spawn(aClass,self,Other.tag,Other.Location, Other.Rotation);
    	//
    	if ( Other.IsA('Pickup') )
    	{
    		if ( Pickup(Other).MyMarker != None )
    		{
    			Pickup(Other).MyMarker.markedItem = Pickup(A);
    			if ( Pickup(A) != None )
    			{
    				Pickup(A).MyMarker = Pickup(Other).MyMarker;
    				A.SetLocation(A.Location
    					+ (A.CollisionHeight - Other.CollisionHeight) * vect(0,0,1));
    			}
    			Pickup(Other).MyMarker = None;
    		}
    		else if ( A.IsA('Pickup') )
    			Pickup(A).Respawntime = 0.0;
    	}
    	if ( A != None )
    	{
    		A.event = Other.event;
    		A.tag = Other.tag;
    		return true;
    	}
    	return false;
    }
    
    function string GetNewWeaponClassName()
    {
    	local int i, sum;
    	local int iRand;
    	local string weaponName;
    	for(i=0;i<PickupList.Length;i++)
    	{
    		sum+=PickupList[i].Probability;
    	}
    	iRand=Rand(sum);
    	sum=0;
    	for(i=0;i<PickupList.Length;i++)
    	{
    		sum+=PickupList[i].Probability;
    		weaponName=PickupList[i].PickupClassName;
    		if(sum>iRand) break;
    	}
    	return weaponName;
    }
    
    function string GetShortUrl(string s)
    {
    	local int qPos, slashPos, startPos;
    	local string result;
    	qPos=InStr(s,"?");
    	slashPos=InStr(s,"/");
    	startPos=Max(slashPos, 0);
    	result=Mid(s, startPos+1, qPos-startPos-1);
    	return result;
    }
    
    function bool InMapExcludeList(string URL)
    {
    	local int i;
    	for(i=0;i<MapExcludeList.Length;i++)
    	{
    		if(MapExcludeList[i]~=URL)
    			return true;
    	}
    	return false;
    }
    
    defaultproperties
    {
    	bAddToServerPackages=True
    	GroupName="KF-PickupReplace"
    	FriendlyName="PickupReplaceMut"
    	Description="PickupReplaceMut"
    }
    
    Код:
    class NewKFRandomItemSpawn extends KFRandomItemSpawn;
    
    var PickupReplaceMut Mut;
    
    simulated function PostBeginPlay()
    {
    	Mut=PickupReplaceMut(Owner);
    	if ( Level.NetMode != NM_Client )
    		PowerUp = class<Pickup>(DynamicLoadObject(Mut.GetNewWeaponClassName(), class'Class'));
    	if ( KFGameType(Level.Game) != none )
    	{
    		KFGameType(Level.Game).WeaponPickups[KFGameType(Level.Game).WeaponPickups.Length] = self;
    		DisableMe();
    	}
    	SetLocation(Location - vect(0,0,1));
    }
    
    function TurnOn()
    {
    	PowerUp = class<Pickup>(DynamicLoadObject(Mut.GetNewWeaponClassName(), class'Class'));
    	if( myPickup != none )
    		myPickup.Destroy();
    	SpawnPickup();
    	SetTimer(InitialWaitTime+InitialWaitTime*FRand(), false);
    }
    
    Ссылка 1 или Ссылка 2
    Добавлять в виде PickupReplaceMut.PickupReplaceMut
     
    BAHO, xorex, HATAXA и ещё 1-му нравится это.
  2. Dr_Killjoy

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

    А PickupFix не работает чтоли?
     
  3. Flame

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

    Понятия не имел, что такой есть ))
    Ща почитаю, что там у тебя

    Поглядел
    Прикольно
    Ну будет два похожих)
     
  4. assayaro

    assayaro Соучастник

    Thank you so much~~~
     
  5. assayaro

    assayaro Соучастник

    Hello, Mr.Flame and everybody~

    I've a favor to ask you~~~

    I'd to using the superZombie mutator in v1058
    But it seems can not use now...hmm

    I too love this mutator...
    It would be useful if they were...difficulty atrocities~
    I'd like to use this mutator~
    I want to learn how to re-enable~
    Please tell me that...

    In addition, I hate to update meaningless of trip~ :verymad:
     
  6. Stein

    Stein Солдат

    всех с праздником, тестировать долго муторно и лень) объясните общий принцип как раскладывается оружие на картах, как примерно работает этот мут и нагружает ли он сервер, зависит ли то как сделана карта криворуко или не очень на работоспособность этого мута, короче кто в теме расскажите поподробней если не сложно, кто пользовался возникали ли баги?.. мне нужно тупо заменять разложенное на стандартных картах оружее на своё тоесть во всех картах где лежат диглы поменять на свои диглы, для каждой карты нужно отдельно как я понял?..функции случайность появления и прочие продвинутые не нужны, или она уже есть на стандартных картах (как то не замечал)?
     
  7. kok-s

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

    Тут не много не та система которая тебе нужна. Тут ты создаёшь свой список оружия на картах (заменяется всё оружие как случайное так и определённое). Если тебе нужно заменить только дигры на свои - используй Pickup Fix .
     
  8. Stein

    Stein Солдат

    :thanks:
     
  9. MarksmanFourSev

    MarksmanFourSev Новенький

    Если я правильно понял, все дело в цифрах. 15 - часто, 10 - средне, 5 - редко. Можно прописать, к примеру, М-134 на строчку с 15, и в результате ты утонешь в миниганах на карте. Если 5 - едва ли ты найдешь. Можно раскидать даже так оружие: 15 - дешевое, 5 - дорогое. Например мод этот будет полезен хардкорщикам (убрать из пикапа карт все, что мощнее пистолета) или админам тех серверов, которые хотят раскидать ТОЛЬКО свое или конкретное оружие. И да, пара полезных объектов, которые можно добавить:
    KFMod.Vest - если у вас нет этой строчки, бронежилет найти вам не светит.
    KFMod.FirstAidKit - аптечка первой помощи, есть в игре, но Tripwire не добавили ее в подбираемое снаряжение, без этого мутатора ее не найти. Крайне полезная штука. Дает +90 ХП при подборе.
    KFMod.CashPickup - случайное кол-во денег.
    Из багов - иногда снаряга меняется прямо на ГЛАЗАХ - секунду назад вместо того, что ты видел (напр. АК-12), лежит другое (напр. ящик с патронами)
     
  10. kok-s

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

    Броник ресается нормально проверено (в списке нет его).
     
  11. Stein

    Stein Солдат

    да оружие меняется на глазах, отбежишь на метр не взяв пушку вернёшься а уже другое оружие
    хотелось бы раскиданное оружие на все волны, взял оружие и больше не появится до следующей карты
     
  12. drummer36

    drummer36 Солдат

    FLAME ты чудо :rolleyes:Навсегда заменю стандарт,чтоб даже и не пахло KFMod-ом :)
    MarksmanFourSev и да,видел такую аптечку,здоровую такую,белую.
    Еще видел и шприцы на карте Deck16,они по 5хп. Думаю они отдельно в карте.