MonsterConfig

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

  1. AitherKill

    AitherKill Солдат

    Ну например увеличение хп на 25 % :D сам поржал со скрейка в 10000 хп :D
    UPD У него там не задействованы некоторые функции вообще , резисты например.
     
  2. Dr_Killjoy

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

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

    AitherKill Солдат

    В монстерконфиге тоже? Я думал только в M.DiffBuilder'e, хотя надо проверить.
     
  4. Dr_Killjoy

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

    Не в монстерконфиге и диффбилдере, а в самом кфмонстре. Ты думаешь я бы делал диффбилдер хуже монстр конфига?
     
  5. AitherKill

    AitherKill Солдат

    В монстерконфиге геймтайп меняется , думал там реализовано.
    Из геймтайпа
    // Обработка резистов монстров + считаем очки при bWaveFundSystem
    function int ReduceDamage(int Damage, pawn injured, pawn instigatedBy, vector HitLocation, out vector Momentum, class<DamageType> DamageType)
    {
    local int i,n;
    local KFMonster M;
    local MCMonsterInfo MonInfo;
    local MCRepInfo tMCRepInfo;
    local bool lDebug;
    local float RewardScore;
    lDebug=false;

    if (lDebug) toLog("ReduceDamage() Original Damage:"@Damage);
    M = KFMonster(Injured);
    if (M!=none)
    MonInfo = SandboxController.GetMonInfo(M.Controller);
    if (MonInfo!=none)
    {
    n = MonInfo.Resist.Length;
    for(i=0; i<n; i++)
    {
    if ( MonInfo.Resist.DamType == DamageType
    || (!MonInfo.Resist.bNotCheckChild
    && ClassIsChildOf( DamageType, MonInfo.Resist.DamType) ) )
    {
    Damage = round(float(Damage) * MonInfo.Resist.Coeff);
    if (lDebug) toLog("ReduceDamage() Reduced Damage:"@Damage@"MonInfo"@string(MonInfo.Name));
    break;
    }
    }
    }
    Damage = Super.ReduceDamage(Damage,injured,instigatedBy,HitLocation,Momentum,DamageType);

    // добавляем очки игроку (если bWaveFundSystem)
    if (SandboxController.GameInfo.bWaveFundSystem)
    {
    if (M!=none
    && instigatedBy != none
    && instigatedBy.PlayerReplicationInfo != none
    && PlayerController(instigatedBy.Controller) != none)
    {
    tMCRepInfo = SandboxController.GetMCRepInfo(instigatedBy.PlayerReplicationInfo);
    if (tMCRepInfo!=none)
    {
    if (MonInfo!=none && MonInfo.RewardScore!=-1)
    RewardScore = MonInfo.RewardScore;
    else RewardScore = M.ScoringValue;

    if(MonInfo!=none && MonInfo.RewardScoreCoeff != MonInfo.default.RewardScoreCoeff)
    RewardScore*=MonInfo.RewardScoreCoeff;

    RewardScore *= (float(Damage) / M.HealthMax);

    tMCRepInfo.WaveScore+=RewardScore;
    tMCRepInfo.GameScore+=RewardScore;
    }
    }
    }
    return Damage;
    }
     
  6. gall87

    gall87 Капо

    Кстати по поводу геймтайпа, если его прописать в бантик с запуском, то карта меняется в два раза быстрей
    Ещё я просто увеличивал мобам хп, что бы в туловище убить их было сложно, люди должны боятся монстров, а херачить их налево и на право
     
  7. Dr_Killjoy

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

    Для непонятливых объясняю, смотри внимательно на красный текст.
    class KFMonster extends Skaarj;
    ...
    function TakeDamage(int Damage, Pawn instigatedBy, Vector hitlocation, Vector momentum, class<DamageType> damageType, optional int HitIndex )
    {
    local bool bIsHeadshot;
    local KFPlayerReplicationInfo KFPRI;
    local float HeadShotCheckScale;


    LastDamagedBy = instigatedBy;
    LastDamagedByType = damageType;
    HitMomentum = VSize(momentum);
    LastHitLocation = hitlocation;
    LastMomentum = momentum;


    if ( KFPawn(instigatedBy) != none && instigatedBy.PlayerReplicationInfo != none )
    {
    KFPRI = KFPlayerReplicationInfo(instigatedBy.PlayerReplicationInfo);
    }


    // Scale damage if the Zed has been zapped
    if( bZapped )
    {
    Damage *= ZappedDamageMod;
    }


    // Zeds and fire dont mix.
    if ( class<KFWeaponDamageType>(damageType) != none && class<KFWeaponDamageType>(damageType).default.bDealBurningDamage )
    {
    if( BurnDown<=0 || Damage > LastBurnDamage )
    {
    // LastBurnDamage variable is storing last burn damage (unperked) received,
    // which will be used to make additional damage per every burn tick (second).
    LastBurnDamage = Damage;


    // FireDamageClass variable stores damage type, which started zed's burning
    // and will be passed to this function again every next burn tick (as damageType argument)
    if ( class<DamTypeTrenchgun>(damageType) != none ||
    class<DamTypeFlareRevolver>(damageType) != none ||
    class<DamTypeMAC10MPInc>(damageType) != none)
    {
    FireDamageClass = damageType;
    }
    else
    {
    FireDamageClass = class'DamTypeFlamethrower';
    }
    }


    if ( class<DamTypeMAC10MPInc>(damageType) == none )
    {
    Damage *= 1.5; // Increase burn damage 1.5 times, except MAC10.
    }


    // BurnDown variable indicates how many ticks are remaining for zed to burn.
    // It is 0, when zed isn't burning (or stopped burning).
    // So all the code below will be executed only, if zed isn't already burning
    if( BurnDown<=0 )
    {
    if( HeatAmount>4 || Damage >= 15 )
    {
    bBurnified = true;
    BurnDown = 10; // Inits burn tick count to 10
    SetGroundSpeed(GroundSpeed *= 0.80); // Lowers movement speed by 20%
    BurnInstigator = instigatedBy;
    SetTimer(1.0,false); // Sets timer function to be executed each second
    }
    else HeatAmount++;
    }
    }


    if ( !bDecapitated && class<KFWeaponDamageType>(damageType)!=none &&
    class<KFWeaponDamageType>(damageType).default.bCheckForHeadShots )
    {
    HeadShotCheckScale = 1.0;


    // Do larger headshot checks if it is a melee attach
    if( class<DamTypeMelee>(damageType) != none )
    {
    HeadShotCheckScale *= 1.25;
    }


    bIsHeadShot = IsHeadShot(hitlocation, normal(momentum), HeadShotCheckScale);
    bLaserSightedEBRM14Headshotted = bIsHeadshot && M14EBRBattleRifle(instigatedBy.Weapon) != none && M14EBRBattleRifle(instigatedBy.Weapon).bLaserActive;
    }
    else
    {
    bLaserSightedEBRM14Headshotted = bLaserSightedEBRM14Headshotted && bDecapitated;
    }


    if ( KFPRI != none )
    {
    if ( KFPRI.ClientVeteranSkill != none )
    {
    Damage = KFPRI.ClientVeteranSkill.Static.AddDamage(KFPRI, self, KFPawn(instigatedBy), Damage, DamageType);
    }
    }


    if ( damageType != none && LastDamagedBy.IsPlayerPawn() && LastDamagedBy.Controller != none )
    {
    if ( KFMonsterController(Controller) != none )
    {
    KFMonsterController(Controller).AddKillAssistant(LastDamagedBy.Controller, FMin(Health, Damage));
    }
    }


    if ( (bDecapitated || bIsHeadShot) && class<DamTypeBurned>(DamageType) == none && class<DamTypeFlamethrower>(DamageType) == none )
    {
    if(class<KFWeaponDamageType>(damageType)!=none)
    Damage = Damage * class<KFWeaponDamageType>(damageType).default.HeadShotDamageMult;


    if ( class<DamTypeMelee>(damageType) == none && KFPRI != none &&
    KFPRI.ClientVeteranSkill != none )
    {
    Damage = float(Damage) * KFPRI.ClientVeteranSkill.Static.GetHeadShotDamMulti(KFPRI, KFPawn(instigatedBy), DamageType);
    }


    LastDamageAmount = Damage;


    if( !bDecapitated )
    {
    if( bIsHeadShot )
    {
    // Play a sound when someone gets a headshot TODO: Put in the real sound here
    if( bIsHeadShot )
    {
    PlaySound(sound'KF_EnemyGlobalSndTwo.Impact_Skull', SLOT_None,2.0,true,500);
    }
    HeadHealth -= LastDamageAmount;
    if( HeadHealth <= 0 || Damage > Health )
    {
    RemoveHead();
    }
    }


    // Award headshot here, not when zombie died.
    if( bDecapitated && Class<KFWeaponDamageType>(damageType) != none && instigatedBy != none && KFPlayerController(instigatedBy.Controller) != none )
    {
    bLaserSightedEBRM14Headshotted = M14EBRBattleRifle(instigatedBy.Weapon) != none && M14EBRBattleRifle(instigatedBy.Weapon).bLaserActive;
    Class<KFWeaponDamageType>(damageType).Static.ScoredHeadshot(KFSteamStatsAndAchievements(PlayerController(instigatedBy.Controller).SteamStatsAndAchievements), self.Class, bLaserSightedEBRM14Headshotted);
    }
    }
    }


    // Client check for Gore FX
    //BodyPartRemoval(Damage,instigatedBy,hitlocation,momentum,damageType);


    if( Health-Damage > 0 && DamageType!=class'DamTypeFrag' && DamageType!=class'DamTypePipeBomb'
    && DamageType!=class'DamTypeM79Grenade' && DamageType!=class'DamTypeM32Grenade'
    && DamageType!=class'DamTypeM203Grenade' && DamageType!=class'DamTypeDwarfAxe'
    && DamageType!=class'DamTypeSPGrenade' && DamageType!=class'DamTypeSealSquealExplosion'
    && DamageType!=class'DamTypeSeekerSixRocket')
    {
    Momentum = vect(0,0,0);
    }


    if(class<DamTypeVomit>(DamageType)!=none) // Same rules apply to zombies as players.
    {
    BileCount=7;
    BileInstigator = instigatedBy;
    LastBileDamagedByType=class<DamTypeVomit>(DamageType);
    if(NextBileTime< Level.TimeSeconds )
    NextBileTime = Level.TimeSeconds+BileFrequency;
    }


    if ( KFPRI != none && Health-Damage <= 0 && KFPRI.ClientVeteranSkill != none && KFPRI.ClientVeteranSkill.static.KilledShouldExplode(KFPRI, KFPawn(instigatedBy)) )
    {
    Super.takeDamage(Damage + 600, instigatedBy, hitLocation, momentum, damageType);
    HurtRadius(500, 1000, class'DamTypeFrag', 100000, Location);
    }
    else
    {
    Super.takeDamage(Damage, instigatedBy, hitLocation, momentum, damageType);
    }


    if( bIsHeadShot && Health <= 0 )
    {
    KFGameType(Level.Game).DramaticEvent(0.03);
    }


    bBackstabbed = false;
    }
    ...
    Код:
    class Skaarj extends Monster;
    ...
    // Здесь нет TakeDamage
    ...
    Код:
    class Monster extends xPawn
          dependsOn(xPawnGibGroup);
    ...
    // Здесь нет TakeDamage
    ...
    Код:
    class xPawn extends UnrealPawn
        config(User)
        dependsOn(xUtil)
        dependsOn(xPawnSoundGroup);
    ...
    State Dying
    {
    ...
    simulated function TakeDamage( int Damage, Pawn InstigatedBy, Vector Hitlocation, Vector Momentum, class<DamageType> damageType, optional int HitIndex)
        {
            local Vector SelfToHit, SelfToInstigator, CrossPlaneNormal;
            local float W;
            local float YawDir;
    
    
            local Vector HitNormal, shotDir;
            local Vector PushLinVel, PushAngVel;
            local Name HitBone;
            local float HitBoneDist;
            local int MaxCorpseYawRate;
    
    
    if ( bFrozenBody || bRubbery )
    return;
    
    
    if( Physics == PHYS_KarmaRagdoll )
    {
    // Can't shoot corpses during de-res
    if( bDeRes || bRubbery )
    return;
    
    
    // Throw the body if its a rocket explosion or shock combo
    if( damageType.Default.bThrowRagdoll )
    {
    shotDir = Normal(Momentum);
                    PushLinVel = (RagDeathVel * shotDir) +  vect(0, 0, 250);
    PushAngVel = Normal(shotDir Cross vect(0, 0, 1)) * -18000;
    KSetSkelVel( PushLinVel, PushAngVel );
    }
    else if( damageType.Default.bRagdollBullet )
    {
    if ( Momentum == vect(0,0,0) )
    Momentum = HitLocation - InstigatedBy.Location;
    if ( FRand() < 0.65 )
    {
    if ( Velocity.Z <= 0 )
    PushLinVel = vect(0,0,40);
    PushAngVel = Normal(Normal(Momentum) Cross vect(0, 0, 1)) * -8000 ;
    PushAngVel.X *= 0.5;
    PushAngVel.Y *= 0.5;
    PushAngVel.Z *= 4;
    KSetSkelVel( PushLinVel, PushAngVel );
    }
                    PushLinVel = RagShootStrength*Normal(Momentum);
    KAddImpulse(PushLinVel, HitLocation);
    if ( (LifeSpan > 0) && (LifeSpan < DeResTime + 2) )
    LifeSpan += 0.2;
    }
    else
    {
                    PushLinVel = RagShootStrength*Normal(Momentum);
    KAddImpulse(PushLinVel, HitLocation);
    }
    if ( (DamageType.Default.DamageOverlayMaterial != None) && (Level.DetailMode != DM_Low) && !Level.bDropDetail )
    SetOverlayMaterial(DamageType.Default.DamageOverlayMaterial, DamageType.default.DamageOverlayTime, true);
    return;
    }
    
    
            if ( DamageType.default.bFastInstantHit && GetAnimSequence() == 'Death_Spasm' && RepeaterDeathCount < 6)
            {
                PlayAnim('Death_Spasm',, 0.2);
                RepeaterDeathCount++;
            }
            else if (Damage > 0)
            {
    if ( InstigatedBy != None )
    {
    if ( InstigatedBy.IsA('xPawn') && xPawn(InstigatedBy).bBerserk )
    Damage *= 2;
    
    
    // Figure out which direction to spin:
    
    
    if( InstigatedBy.Location != Location )
    {
    SelfToInstigator = InstigatedBy.Location - Location;
    SelfToHit = HitLocation - Location;
    
    
    CrossPlaneNormal = Normal( SelfToInstigator cross Vect(0,0,1) );
    W = CrossPlaneNormal dot Location;
    
    
    if( HitLocation dot CrossPlaneNormal < W )
    YawDir = -1.0;
    else
    YawDir = 1.0;
    }
    }
                if( VSize(Momentum) < 10 )
                {
                    Momentum = - Normal(SelfToInstigator) * Damage * 1000.0;
                    Momentum.Z = Abs( Momentum.Z );
                }
    
    
                SetPhysics(PHYS_Falling);
                Momentum = Momentum / Mass;
                AddVelocity( Momentum );
                bBounce = true;
    
    
                RotationRate.Pitch = 0;
                RotationRate.Yaw += VSize(Momentum) * YawDir;
    
    
                MaxCorpseYawRate = 150000;
                RotationRate.Yaw = Clamp( RotationRate.Yaw, -MaxCorpseYawRate, MaxCorpseYawRate );
                RotationRate.Roll = 0;
    
    
                bFixedRotationDir = true;
                bRotateToDesired = false;
    
    
                Health -= Damage;
                CalcHitLoc( HitLocation, vect(0,0,0), HitBone, HitBoneDist );
    
    
                if( InstigatedBy != None )
                    HitNormal = Normal( Normal(InstigatedBy.Location-HitLocation) + VRand() * 0.2 + vect(0,0,2.8) );
                else
                    HitNormal = Normal( Vect(0,0,1) + VRand() * 0.2 + vect(0,0,2.8) );
    
    
                DoDamageFX( HitBone, Damage, DamageType, Rotator(HitNormal) );
            }
        }
    ...
    }
    ...
    Код:
    class UnrealPawn extends Pawn
    abstract
    config(User);
    ...
    State TimingOut
    {
    ...
    function TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation,
    Vector momentum, class<DamageType> damageType, optional int HitIndex)
    {
    }
    ...
    }
    ...
    Код:
    class Pawn extends Actor
    abstract
    native
    placeable
    config(user)
    nativereplication
    exportstructs;
    ...
    // if _RO_
    function TakeDamage(int Damage, Pawn InstigatedBy, vector HitLocation, vector Momentum, class<DamageType> DamageType, optional int HitIndex)
    // else UT
    // function TakeDamage(int Damage, Pawn InstigatedBy, vector HitLocation, vector Momentum, class<DamageType> DamageType);
    {
    local int actualDamage;
    local Controller Killer;
    
    
    if ( damagetype == None )
    {
    if ( InstigatedBy != None )
    warn("No damagetype for damage by "$instigatedby$" with weapon "$InstigatedBy.Weapon);
    DamageType = class'DamageType';
    }
    
    
    if ( Role < ROLE_Authority )
    {
    log(self$" client damage type "$damageType$" by "$instigatedBy);
    return;
    }
    
    
    if ( Health <= 0 )
    return;
    
    
    if ((instigatedBy == None || instigatedBy.Controller == None) && DamageType.default.bDelayedDamage && DelayedDamageInstigatorController != None)
    instigatedBy = DelayedDamageInstigatorController.Pawn;
    
    
    if ( (Physics == PHYS_None) && (DrivenVehicle == None) )
    SetMovementPhysics();
    if (Physics == PHYS_Walking && damageType.default.bExtraMomentumZ)
    momentum.Z = FMax(momentum.Z, 0.4 * VSize(momentum));
    if ( instigatedBy == self )
    momentum *= 0.6;
    momentum = momentum/Mass;
    
    
    if (Weapon != None)
    Weapon.AdjustPlayerDamage( Damage, InstigatedBy, HitLocation, Momentum, DamageType );
    if (DrivenVehicle != None)
             DrivenVehicle.AdjustDriverDamage( Damage, InstigatedBy, HitLocation, Momentum, DamageType );
    if ( (InstigatedBy != None) && InstigatedBy.HasUDamage() )
    Damage *= 2;
    actualDamage = Level.Game.ReduceDamage(Damage, self, instigatedBy, HitLocation, Momentum, DamageType);
    if( DamageType.default.bArmorStops && (actualDamage > 0) )
    actualDamage = ShieldAbsorb(actualDamage);
    
    
    Health -= actualDamage;
    if ( HitLocation == vect(0,0,0) )
    HitLocation = Location;
    
    
    PlayHit(actualDamage,InstigatedBy, hitLocation, damageType, Momentum);
    if ( Health <= 0 )
    {
    // pawn died
    if ( DamageType.default.bCausedByWorld && (instigatedBy == None || instigatedBy == self) && LastHitBy != None )
    Killer = LastHitBy;
    else if ( instigatedBy != None )
    Killer = instigatedBy.GetKillerController();
    if ( Killer == None && DamageType.Default.bDelayedDamage )
    Killer = DelayedDamageInstigatorController;
    // if _KF_
    if ( bPhysicsAnimUpdate )
    SetTearOffMomemtum(momentum);
    //else
    // if ( bPhysicsAnimUpdate )
    // TearOffMomentum = momentum;
    // endif _KF_
    Died(Killer, damageType, HitLocation);
    }
    else
    {
    AddVelocity( momentum );
    if ( Controller != None )
    Controller.NotifyTakeHit(instigatedBy, HitLocation, actualDamage, DamageType, Momentum);
    if ( instigatedBy != None && instigatedBy != self )
    LastHitBy = instigatedBy.Controller;
    }
    MakeNoise(1.0);
    }
    ...
    Прочитав это, ответь мне на вопрос, в какой момент высчитывается дамаг через GameInfo а в какой наносится урон в голову. И больше мне не рассказывай сказки.

    P.S. Выделение красным не сработало, но думаю если включить мозги прочитать это можно всё равно.
     
  8. AitherKill

    AitherKill Солдат

    Получается наносится урон по голове когда выполняется bIsHeadshot , так выходит?
    Ну да не подумал...
     
  9. iliya_flame

    iliya_flame Соучастник

    Спасибо, мужики, что потратили свое время. Очень выручили - друзья довольны)
     
    gall87 нравится это.
  10. gall87

    gall87 Капо

    да не за что, главное помогли)
     
  11. belkir

    belkir Соучастник

    на 1063 не робит. Запускается карта потом: волна 256 из 10, монстров 0 -> отряд выжил в лог пишет ошибки что accessNone для sandboxController

    Проблема найдена!
    Чтобы мутатор работал корректно надо:
    1) Юзать правленную версию из шапки
    2) Прописывать мут как МУТАТОР в батнике или MutLoader'е (не game=!!!)
    В противном случае начинаются косяки с отсутствием монстров и т.п. вещами.
     
    Dave_Scream нравится это.
  12. gall87

    gall87 Капо

    Народ, вот настроенный инишник для последних версий кф
    https://yadi.sk/i/E4ZMfn0bYx3sk
    Килджой добавь на главную как альтернатива
    [youtube]http://youtu.be/xBtHAO3kbjc[/youtube]
    примерно так настроен ини
     
    Dave_Scream и AitherKill нравится это.
  13. 4eGevara

    4eGevara Соучастник

    Доброго времени суток читающему это!!!
    Помогите пожал. сделал пару перков если в сп7 добавляю один то норм все но если еще один добавляю то не пашет выбор навыка вот так вот как на картинке
     

    Вложения:

  14. eXes1ze`

    eXes1ze` Соучастник

    Причём здесь MonsterConfig?
     
    gall87 нравится это.
  15. OZMO

    OZMO Соучастник

    Мутатор отказывается работать... Прописал в мутлоадер после серверперкМут Mutator=MonsterConfig.MCGameType , для теста клоту поставил 800 хп тела и головы сложность 7.0 и ничего не меняется. Может кто сказать в чем проблема?
     
  16. gall87

    gall87 Капо

    а мут лодер прописал в бантике запуска серва и мут работает только на выделенном серве?
    И ты походу прописал гейм тайп а не мут!
     
    Dave_Scream и OZMO нравится это.
  17. OZMO

    OZMO Соучастник

    Вот я дубина в рот миненоги! Ну да гейм тайп вбивал... Класные клоты с магнума с 3 выстрелов убиваются. Это наверно самый классный из мутов для сервера, который я только видел. Никаких мобов новых даже качать не обязательно любого можно отредактировать и будут одновремено и обычные скряки и какие-нибудь быстрые и невидимые жD
     
    Dave_Scream нравится это.
  18. Dave_Scream

    Dave_Scream Мододел "Ы"

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

    OZMO Соучастник

    Но это правда просто огонь вообще, с сандбоксом замучался, бесило что больше 32 отрядов вбивать нельзя, а мули на волне когда играешь 1 то вообще не выходят то сразу 2-е друг за другом бегут.
    У мута только 1 недостаток - нету зависимости от сложности, я часто меняю сложность когда совсем нулевые на сервер заходят, но с этим параметром у мобов всегда фиксированное количество хп :sad: . Например по стандарту у горфаста 250хп это соответствует нормальной сложности, а при аде повышается на 70% и получается 435. Вот желательно что бы выставляемые хп соответствовали сложности НОРМАЛ, и при повышении как и стандартные 70% повышения параметров работали для них. Если люди хотят что бы я быстро снизил сложность в веб админке, то приходиться париться постоянным переписыванием хп мобов в ини файлике. Может кто нибудь прописываемые хп/мобы на волне/данные о волнах привязать к нормальной сложности? Или долгое это дело?
     
  20. OZMO

    OZMO Соучастник

    Все, просеек что можно сделать, хоть и не очень удобно для редактирования сильных мобов.