Хэдшотный урон.

Тема в разделе "Кодинг", создана пользователем AitherKill, 28 авг 2014.

  1. AitherKill

    AitherKill Солдат

    Видел где-то задавали подобный вопрос. "Как сделать снайперу прокачку хэдшотным уроном?"
    И вот я поднимаю его вновь.
    Что я пробовал сделать
    В DamType записать функцию -

    static function AwardDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount)
    {
    //local bool bIsHeadShot;
    local KFMonster KFM;
    if(KFM.bDecapitated)
    {
    ServerStStats(KFStatsAndAchievements).AddSniperDamage(Amount);
    }
    }

    static function AwardDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount)
    {
    local bool bIsHeadShot;
    bIsHeadShot = IsHeadShot(HitLocation, normal(Momentum), 1.0);
    if(bIsHeadShot)
    {
    ServerStStats(KFStatsAndAchievements).AddSniperDamage(Amount);
    }
    }

    Cобирается без ошибок , но урон в статистику не идет.
    Просто вариант без отслеживания хедшота

    static function AwardDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount)
    {
    ServerStStats(KFStatsAndAchievements).AddSniperDamage(Amount);
    }
    Статистика идет , но уже пофигу куда стрелять, хоть по телу хоть по голове.
     
    Винни нравится это.
  2. Dr_Killjoy

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

    С вопросом разобрался уже или помочь надо?
     
  3. AitherKill

    AitherKill Солдат

    Помощь еще нужна.
     
  4. Dr_Killjoy

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

    Щас погляжу код, и скажу, реально ли это сделать без вмешательства в код моба. С вмешательством в код моба это точно возможно.
     
  5. AitherKill

    AitherKill Солдат

    Каждый используемый моб находится в нашем пакете мобов, это не станет большой проблемой )
     
  6. Dr_Killjoy

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

    Вот код GameRules, которые будут осуществлять зачисление дамага в голову, в статистику. Соответственно, надо их запустить из какого-то мутатора. От DamType требуется только выставленная переменная bSniperWeapon.

    class DamageRegisterGameRule extends GameRules;

    function int NetDamage( int OriginalDamage, int Damage, pawn injured, pawn instigatedBy, vector HitLocation, out vector Momentum, class<DamageType> DamageType )
    {
    local class<KFWeaponDamageType> KFWDT;
    local ServerStStats InstigatedByStats;
    local KFMonster KFM;
    local int AwardDamage;

    if ( NextGameRules != None )
    Damage = NextGameRules.NetDamage( OriginalDamage,Damage,injured,instigatedBy,HitLocation,Momentum,DamageType );
    if ( Damage <= 0 ) return Damage;
    KFM = KFMonster(Injured);
    KFWDT = class<KFWeaponDamageType>(DamageType);
    InstigatedByStats = Static.GetServerStStats(InstigatedBy);
    if ( KFM != none && Static.IsSharpDamageType(KFWDT) && InstigatedByStats != none
    && ( KFM.bDecapitated || KFM.IsHeadshot(HitLocation,Momentum,1.00) ) )
    {
    AwardDamage = Clamp(Damage,1,Injured.Health);
    InstigatedByStats.AddSniperDamage(AwardDamage);
    }
    return Damage;
    }

    static function ServerStStats GetServerStStats(Pawn P)
    {
    local PlayerController PC;
    local SteamStatsAndAchievementsBase KFStats;

    if ( P == none ) return none;
    if ( P.Controller != none ) PC = PlayerController(P.Controller);
    if ( PC == none ) return none;
    if ( PC.SteamStatsAndAchievements != none ) KFStats = PC.SteamStatsAndAchievements;
    if ( KFStats == none ) return none;
    return ServerStStats(KFStats);
    }

    static function bool IsSharpDamageType(class<KFWeaponDamageType> KFWDT) // проверка на то, принадлежит ли дамтайп перку снайпера
    {
    local class<KFWeapon> KFW;
    local class<KFWeaponPickup> KFWP;

    if ( KFWDT == none || !KFWDT.default.bSniperWeapon || !KFWDT.bCheckForHeadshots ) return false;
    KFW = class<KFWeapon>(KFWDT.default.WeaponClass);
    if ( KFW == none ) return true;
    KFWP = class<KFWeaponPickup>(KFW.default.PickupClass); // если в дамтайпе указано оружие, исключаем всякие DamTypeRocketImpact
    return KFWP == none || KFWP.default.CorrespondingPerkIndex == class'KFVetSharpshooter'.default.PerkIndex;
    }
     
    VENOM:) и AitherKill нравится это.
  7. AitherKill

    AitherKill Солдат

    Зародыш мутатора
    class HeadRulesMut extends Mutator;
    var DamageRegisterGameRule HeadRules;

    function PostBeginPlay()
    {
    if( HeadRules==None )
    HeadRules = Spawn(Class'DamageRegisterGameRule');
    Super.PostBeginPlay();
    }
    Еще должна быть фукция таймера для проверки дамтайпов и зачисления статистики?
     
  8. Dr_Killjoy

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

    Мут у тебя неправильно добавляет геймрулз, их надо ещё засунуть в список, иначе до них просто не будет доходить цепочка вызовов фунций, вот пример:

    function PostBeginPlay()
    {
    local GameRules G;

    Super.PostBeginPlay();
    G = spawn(class'FFPenaltyRules');
    if ( Level.Game.GameRulesModifiers == None )
    Level.Game.GameRulesModifiers = G;
    else Level.Game.GameRulesModifiers.AddGameRules(G);

    }

    Про таймер не понял.
     
  9. AitherKill

    AitherKill Солдат

    Отпишу сразу
    if ( KFWDT == none || !KFWDT.default.bSniperWeapon || !KFWDT.bCheckForHeadshots ) return false;
    KFW = class<KFWeapon>(KFWDT.default.WeaponClass);
    !KFWDT.bCheckForHeadshots, переменной bCheckForHeadshots нет в дамтайп классах, но это не помешало работоспособности кода.
    Про GR понял)
     
  10. 3xzet

    3xzet Мододел "Ы"

    Код:
    class KFWeaponDamageType extends WeaponDamageType;
    
    ....
    var()   bool    bCheckForHeadShots;     // This damagetype is capabable of removing heads with 
                                            // headshots (doesn't mean it can't blow heads off, just means it 
                                            // shouldn't do headshot check if this is false);
    ....
    
    defaultproperties
    {
    ....
         bCheckForHeadShots=True
    
     
  11. AitherKill

    AitherKill Солдат

    Ой не заметил, но все же
    if ( KFWDT == none || !KFWDT.default.bSniperWeapon || !KFWDT.bCheckForHeadshots ) return false;
    KFW = class<KFWeapon>(KFWDT.default.WeaponClass);
    !KFWDT.bCheckForHeadshots , bCheckForHeadshots в defaultproperties
    То есть должно быть !KFWDT.default.bCheckForHeadShots
    Я от этого подумал
    [​IMG]
     
  12. LLIePLLIeHb

    LLIePLLIeHb Guest

    Вообще зря ты всю эту затею начал.
    Столько гемора с этим хедшотным уронов, у тебя скорее всего кач будет засчитан после обезглавливания моба, то есть, например:
    если ты выбил 90% урона , скажем, с СК , потом какой-нибудь коммандос 0-го уровня его добил , то снайпер уже кача не получает.
    Да и засчитывает он его криво как-то в принципе, на собственном опыте , могу сказать , что лучше обычный дамаг считать, в тело снайпер и не нанесет много , а вот в голову будет также, может чуть меньше, чем от хедшотного.
     
  13. Dr_Killjoy

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

    Кто знает, может и нормально заработает, тут не такой способ как у нас используется.
     
  14. AitherKill

    AitherKill Солдат

    Урон и вправду засчитывается после обезглавливания. Но это огромной проблемой мне не кажется , ведь прокачка на количество тех же самых хедов и подразумевало обезглавливание мобиков. Это даже полезнее будет - разозлил фп , но не убил , нет кача.
     
  15. LLIePLLIeHb

    LLIePLLIeHb Guest

    Я когда-то также думал, но , при хорошем балансе ФП не умирает с выстрела, рассмотрим следующую ситуацию :
    стоят 2 снайпера, один стреляет , второй ждет и добивает , проще говоря, будут специально выжидать и воровать кач, после начинаются ум тк холивары и тд и тп.
    Проверено на собственном опыте , после чего убрали хедшотный дамаг , сделали обычный и забыли о подобных проблемах.
     
    AitherKill и FaBricOF нравится это.
  16. AitherKill

    AitherKill Солдат

    У меня лично на сервере так и стоит... меня подпинывали сделать урон именно по хедам , вот и решил выяснить как это сделать.
    В общем спасибо что откликнулись и помогли :thanks: :thumbsup:
     
  17. demnikzak

    demnikzak Бандит

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