Help, Weapons Owner RULE

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

  1. assayaro

    assayaro Соучастник

    Log: Analyzing...
    ...
    Error: C:\KFServer\OweWeaponsRules\Classes\OwnWeaponsRules.uc(56) : Error, Call to 'CanTakeItem': bad or missing parameter 2
    Log: Compile aborted due to errors.

    Because weapons,
    Players will often fight between them
    So,
    Except Weapons master pick up,
    I'd like not to pick up a weapon and prevent..

    Please take a look at once..
    And Anybody help...

    OwnWeaponsMut:
    Код:
    class OwnWeaponsMut extends Mutator;
    
    var array<WeaponPickup> Pending;
    var OwnWeaponsRules Rules;
    
    function PostBeginPlay()
    {
    	if( Rules==None )
    		Rules = Spawn(Class'OwnWeaponsRules');
    }
    function bool CheckReplacement(Actor Other, out byte bSuperRelevant)
    {
    	if( WeaponPickup(Other)!=None && !Level.Game.bWaitingToStartMatch )
    	{
    		Pending[Pending.Length] = WeaponPickup(Other);
    		SetTimer(0.01,false);
    	}
    	return true;
    }
    function Timer()
    {
    	local int i;
    
    	for( i=(Pending.Length-1); i>=0; --i )
    	{
    		if( Pending[I]!=None && Pending[I].Instigator!=None && PlayerController(Pending[I].Instigator.Controller)!=None )
    			Rules.AddPickup(Pending[I],Pending[I].Instigator.Controller);
    	}
    	Pending.Length = 0;
    }
    
    OwnWeaponsRules:
    Код:
    class OwnWeaponsRules extends GameRules;
    
    struct FOwnership
    {
    	var Controller Owner;
    	var WeaponPickup P;
    };
    var array<FOwnership> OwnedPickups;
    var transient string LastOwnerName;
    
    function PostBeginPlay()
    {
    	NextGameRules = Level.Game.GameRulesModifiers;
    	if( Level.Game.GameRulesModifiers==None )
    		Level.Game.GameRulesModifiers = Self;
    }
    final function bool CanTakeItem( Controller P, Pickup W, bool bDeleteItem )
    {
    	local int i;
    
    	for( i=(OwnedPickups.Length-1); i>=0; --i )
    	{
    		if( OwnedPickups[I].Owner==None || OwnedPickups[I].P==None )
    			OwnedPickups.Remove(i,1); // Purge old information
    		else if( OwnedPickups[I].P==W )
    		{
    			if( OwnedPickups[I].Owner==P )
    			{
    				if( bDeleteItem )
    					OwnedPickups.Remove(i,1);
    				return true;
    			}
    			LastOwnerName = OwnedPickups[I].Owner.PlayerReplicationInfo.PlayerName;
    			return false;
    		}
    	}
    	return true;
    }
    final function bool HasItemClass( Actor Other, class<Inventory> IC )
    {
    	local Inventory I;
    
    	for( I=Other.Inventory; I!=None; I=I.Inventory )
    		if( I.Class==IC )
    			return true;
    	return false;
    }
    function bool OverridePickupQuery(Pawn Other, Pickup item, out byte bAllowPickup)
    {
    	if( WeaponPickup(item)!=None && Other.Controller!=None )
    	{
    		bAllowPickup = 0;
    		if( !HasItemClass(Other,item.InventoryType) )
    		{
    			if( !CanTakeItem(Other.Controller,P,true) )
    				Other.ClientMessage("This weapon is owned by"@LastOwnerName);
    			else return false;
    		}
    		else if( CanTakeItem(Other.Controller,P,false) )
    			return false;
    		return true;
    	}
    	if( NextGameRules!=None && NextGameRules.OverridePickupQuery(Other, item, bAllowPickup) )
    		return true;
    	return false;
    }
    final function AddPickup( WeaponPickup WP, Controller Other )
    {
    	local int i;
    
    	for( i=(OwnedPickups.Length-1); i>=0; --i )
    	{
    		if( OwnedPickups[I].Owner==None || OwnedPickups[I].P==None )
    			OwnedPickups.Remove(i,1); // Purge old information
    	}
    
    	OwnedPickups.Insert(0,1);
    	OwnedPickups[0].P = WP;
    	OwnedPickups[0].Owner = Other;
    }
    
     
    Последнее редактирование модератором: 20 окт 2016
    ЛОХМАТЫЙ, kok-s, PMushroomEX и 3 другим нравится это.
  2. Dr_Killjoy

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

    Хы товарищи, все говорили что запрет на подбор оружия это супер сложная схема, и что никогда её не будет в общем доступе, вот теперь смотрите, почти рабочая версия. Я сам где-то так и представлял этот алгоритм.


    if( !CanTakeItem(Other.Controller,P,true) )

    Eeerm. You dont have variable named "P". Your pickup is "item". Put "item" instead of "P".
     
    kok-s, LLIePLLIeHb, Папка01 и ещё 1-му нравится это.
  3. Flame

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

    Ну почему не будет )
    Я бы выложил дней через 20 одну из версий
    Ну раз и без меня всё хорошо, то и отлично )
    Хотя реализация тут красивая, конечно (именно использование OverridePickupQuery)
     
    Папка01 нравится это.
  4. Dr_Killjoy

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

    Эта реализация хороша тем что это именно мутатор. А не просто интеграция в другой код. Он может быть совместим со всеми другими мутаторами.
     
    Папка01 нравится это.
  5. Flame

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

    Ну да
    Но и я давно ушёл от той версии, где наследуется KFWeaponPickup )
    Тож давно работаю с отдельным мутатором
    Но тут красивая реализация, чего уж там
    Моя правда более функциональная, но более корявая с точки зрения изящности
    Интересно откуда Ассайро это утащил ))
     
    Папка01 нравится это.
  6. assayaro

    assayaro Соучастник


    Thank u so much Always... love u.. and russian.. hahahahah...joke... Don't misunderstand what i say :whistling: :thumbsup: i.m not gay .
     
    WipeMaster, ЛОХМАТЫЙ, PMushroomEX и ещё 1-му нравится это.
  7. kok-s

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

    На сколько я понял получается так: Игрок выкидывает ствол или умирает с ним и не кто (кроме самого его) не может подобрать оружие.

    А в коде можно как нить отследить выкидывает ли игрок сам ствол или оружие выпадает после смерти? Было бы логично если кидаешь оружие сам и его подбирают, а если умер то уже нет.
     
  8. AitherKill

    AitherKill Солдат

    Логично ли будет то, что ты скинул себе запаску , а ее спиздили , если уж брать own' илку пушек то для любых условий.
    Не хватило патронов игроку? Хватать чужое нефиг, запасай заранее на свои пожитки. Либо баланс сервера править.
    Все слились, а ты остался 1 и без патронов? Запаски/Слив. Предпочтителен слив т.к 80 % игроков не досиживают в спектаторах пока 1 "тащер" сливает 400+ мобов.
     
  9. ЛОХМАТЫЙ

    ЛОХМАТЫЙ •*´¨`*•.,¸¸,.•*´¨`*•.,¸¸,.•*´¨`*•

    Надо сделать, чтобы при большом числе мобов игрок, оставшийся последним, пугался :smile: оружие там ронял или ещё что.

    А вот когда остаётся, скажем, 50 мобов, у тебя патроны кончились (а запаски нередко уже все украдены) - погибшие раньше товарищи, наблюдающие с небес, и рады бы отдать тебе своё оружие, а тут на-ка - запрет :smile:
    Реально ли погибшему игроку на ходу менять правила подбора своего оружия ?
    (точнее, насколько это удобно будет ? То, что реально - думаю, да)
     
  10. AitherKill

    AitherKill Солдат

    В принципе если только привязать команду "отвязки" на команду в чат например !AllowPickup или короче , чаттер спектатору отслеживание пихануть.
    Допустим чтобы спектатор мог "подарить" ствол еще не сдохшему последнему мяску)
     
    kok-s нравится это.
  11. kok-s

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

    Хорошая мысль.
     
  12. Flame

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

    Ну у меня это и команда через mutate и галочка в персональном меню сервера
    Esc жмём, заходим в нужную вкладку и разрешаем )
     
  13. AitherKill

    AitherKill Солдат

    Как вынести фишку в менюху ESC может показать SCRN мод)
     
    Flame нравится это.
  14. Rainishе

    Rainishе Солдат

    чего то я не понял, проблема решена или так и нет ?
     
  15. Stein

    Stein Солдат

    халява будет?
     
  16. Rainishе

    Rainishе Солдат

    халява уже есть. надо только понять что делать)
     
  17. AitherKill

    AitherKill Солдат

    LoL
    Создаем 2 файла OwnWeaponsMut.uc и OwnWeaponsRules.uc
    Вставляем в OwnWeaponsMut.uc
    class OwnWeaponsMut extends Mutator;

    var array<WeaponPickup> Pending;
    var OwnWeaponsRules Rules;

    function PostBeginPlay()
    {
    if( Rules==None )
    Rules = Spawn(Class'OwnWeaponsRules');
    }
    function bool CheckReplacement(Actor Other, out byte bSuperRelevant)
    {
    if( WeaponPickup(Other)!=None && !Level.Game.bWaitingToStartMatch )
    {
    Pending[Pending.Length] = WeaponPickup(Other);
    SetTimer(0.01,false);
    }
    return true;
    }
    function Timer()
    {
    local int i;

    for( i=(Pending.Length-1); i>=0; --i )
    {
    if( Pending!=None && Pending.Instigator!=None && PlayerController(Pending.Instigator.Controller)!=None )
    Rules.AddPickup(Pending,Pending.Instigator.Controller);
    }
    Pending.Length = 0;
    }


    Вставляем в OwnWeaponsRules.uc
    class OwnWeaponsRules extends GameRules;

    struct FOwnership
    {
    var Controller Owner;
    var WeaponPickup P;
    };
    var array<FOwnership> OwnedPickups;
    var transient string LastOwnerName;

    function PostBeginPlay()
    {
    NextGameRules = Level.Game.GameRulesModifiers;
    if( Level.Game.GameRulesModifiers==None )
    Level.Game.GameRulesModifiers = Self;
    }
    final function bool CanTakeItem( Controller P, Pickup W, bool bDeleteItem )
    {
    local int i;

    for( i=(OwnedPickups.Length-1); i>=0; --i )
    {
    if( OwnedPickups.Owner==None || OwnedPickups.P==None )
    OwnedPickups.Remove(i,1); // Purge old information
    else if( OwnedPickups.P==W )
    {
    if( OwnedPickups.Owner==P )
    {
    if( bDeleteItem )
    OwnedPickups.Remove(i,1);
    return true;
    }
    LastOwnerName = OwnedPickups.Owner.PlayerReplicationInfo.PlayerName;
    return false;
    }
    }
    return true;
    }
    final function bool HasItemClass( Actor Other, class<Inventory> IC )
    {
    local Inventory I;

    for( I=Other.Inventory; I!=None; I=I.Inventory )
    if( I.Class==IC )
    return true;
    return false;
    }
    function bool OverridePickupQuery(Pawn Other, Pickup item, out byte bAllowPickup)
    {
    if( WeaponPickup(item)!=None && Other.Controller!=None )
    {
    bAllowPickup = 0;
    if( !HasItemClass(Other,item.InventoryType) )
    {
    if( !CanTakeItem(Other.Controller,item,true) )
    Other.ClientMessage("This weapon is owned by"@LastOwnerName);
    else return false;
    }
    else if( CanTakeItem(Other.Controller,item,false) )
    return false;
    return true;
    }
    if( NextGameRules!=None && NextGameRules.OverridePickupQuery(Other, item, bAllowPickup) )
    return true;
    return false;
    }
    final function AddPickup( WeaponPickup WP, Controller Other )
    {
    local int i;

    for( i=(OwnedPickups.Length-1); i>=0; --i )
    {
    if( OwnedPickups.Owner==None || OwnedPickups.P==None )
    OwnedPickups.Remove(i,1); // Purge old information
    }

    OwnedPickups.Insert(0,1);
    OwnedPickups[0].P = WP;
    OwnedPickups[0].Owner = Other;
    }



    Все поместить в папку .../OwnWeaponsMut/classes и скомпилировать
    Итог - Вы великолепны.
     
    Denkul999 нравится это.
  18. Stein

    Stein Солдат

    то есть проблема была только в этом.....?
    Код:
    if( !CanTakeItem(Other.Controller,item,true) )
    
     
  19. key

    key Солдат

    Скомпилировал, подключил, ошибок нет, но и не работает.
    В чём может быть причина?


    P.S. У кого-нибудь работает вышенаписанный мутатор?
     
  20. Stein

    Stein Солдат

    короче вроде работает