Advertisement
Guest User

Untitled

a guest
May 2nd, 2018
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. class HS_Weap_ArmorWelder extends KFWeap_Welder
  2.     hidedropdown;
  3.  
  4. var Actor WeldTargetActor;
  5.  
  6. simulated function AttachWeaponTo( SkeletalMeshComponent MeshCpnt, optional Name SocketName )
  7. {
  8.     super.AttachWeaponTo( MeshCpnt, SocketName );
  9.  
  10.     if( Instigator != none && Instigator.IsLocallyControlled() )
  11.     {
  12.         if (ScreenUI == none)
  13.         {
  14.             ScreenUI = new( self ) ScreenUI${1}< ${3} >
  15.             ScreenUI.Init();
  16.             ScreenUI.Start(true);
  17.         }
  18.  
  19.         if ( ScreenUI != none)
  20.         {
  21.             ScreenUI.SetPause(false);
  22.             ScreenUI.SetCharge( AmmoCount[0] );
  23.             ScreenUI.SetIntegrity( 255 );
  24.         }
  25.     }
  26. }
  27.  
  28. simulated function UpdateScreenUI()
  29. {
  30.     local float WeldPercentageFloat;
  31.     local byte WeldPercentage;
  32.     local KFDoorActor DoorTarget;
  33.     local KFPawn_Human HumanTarget;
  34.  
  35.     if ( Instigator != none && Instigator.IsLocallyControlled() && Instigator.Weapon == self )
  36.     {
  37.         if ( ScreenUI != none )
  38.         {
  39.             if ( ScreenUI.CurrentCharge != AmmoCount[0] )
  40.             {
  41.                 ScreenUI.SetCharge( AmmoCount[0] );
  42.             }
  43.  
  44.             DoorTarget=KFDoorActor(WeldTargetActor);
  45.             HumanTarget=KFPawn_Human(WeldTargetActor);
  46.  
  47.             if ( DoorTarget != none )
  48.             {
  49.                 WeldPercentageFloat = ( float(DoorTarget.WeldIntegrity) / float(DoorTarget.MaxWeldIntegrity) ) * 100.f;
  50.                 if( WeldPercentageFloat < 1.f && WeldPercentageFloat > 0.f )
  51.                 {
  52.                     WeldPercentageFloat = 1.f;
  53.                 }
  54.                 else if( WeldPercentageFloat > 99.f && WeldPercentageFloat < 100.f )
  55.                 {
  56.                     WeldPercentageFloat = 99.f;
  57.                 }
  58.  
  59.                 WeldPercentage = byte( WeldPercentageFloat );
  60.                 if ( WeldPercentage != ScreenUI.IntegrityPercentage )
  61.                 {
  62.                     ScreenUI.SetIntegrity( WeldPercentage );
  63.                 }
  64.             }
  65.             else if ( HumanTarget != none )
  66.             {
  67.                 WeldPercentageFloat = ( float(HumanTarget.Armor) / float(HumanTarget.MaxArmor) ) * 100.f;
  68.                 if( WeldPercentageFloat < 1.f && WeldPercentageFloat > 0.f )
  69.                 {
  70.                     WeldPercentageFloat = 1.f;
  71.                 }
  72.                 else if( WeldPercentageFloat > 99.f && WeldPercentageFloat < 100.f )
  73.                 {
  74.                     WeldPercentageFloat = 99.f;
  75.                 }
  76.  
  77.  
  78.                 WeldPercentage = byte( WeldPercentageFloat );
  79.                 if ( WeldPercentage != ScreenUI.IntegrityPercentage )
  80.                 {
  81.                     ScreenUI.SetIntegrity( WeldPercentage );
  82.                 }
  83.             }
  84.  
  85.             else if ( ScreenUI.IntegrityPercentage != 255 )
  86.             {
  87.                 ScreenUI.SetIntegrity( 255 );
  88.             }
  89.         }
  90.     }
  91. }
  92.  
  93. simulated function bool HasAmmo( byte FireModeNum, optional int Amount )
  94. {
  95.     if ( FireModeNum == DEFAULT_FIREMODE || FireModeNum == ALTFIRE_FIREMODE )
  96.     {
  97.         if ( AmmoCount[0] >= AmmoCost[FireModeNum])
  98.         {
  99.             // Requires a valid WeldTarget (see ServerSetWeldTarget)
  100.             return ( WeldTargetActor != None && CanWeldTarget(FireModeNum) );
  101.         }
  102.         return false;
  103.     }
  104.  
  105.     return Super.HasAmmo(FireModeNum, Amount);
  106. }
  107.  
  108. simulated function StartFire(byte FireModeNum)
  109. {
  110.     if ( FireModeNum == DEFAULT_FIREMODE || FireModeNum == ALTFIRE_FIREMODE )
  111.     {
  112.         if ( Role < ROLE_Authority )
  113.         {
  114.             ServerSetWeldTarget(WeldTargetActor, false);
  115.         }
  116.     }
  117.  
  118.     Super.StartFire(FireModeNum);
  119. }
  120.  
  121. simulated function CustomFire()
  122. {
  123.     local float CurrentFastenRate, CurrentUnfastenRate;
  124.     local KFDoorActor DoorTarget;
  125.     local KFPawn_Human HumanTarget;
  126.  
  127.     WeldTargetActor = TraceWeldActors();
  128.     DoorTarget=KFDoorActor(WeldTargetActor);
  129.     HumanTarget=KFPawn_Human(WeldTargetActor);
  130.  
  131.     if ( Role == ROLE_Authority )
  132.     {
  133.         if ( DoorTarget != None )
  134.         {
  135.             CurrentFastenRate = FastenRate;
  136.             CurrentUnfastenRate = UnFastenRate;
  137.  
  138.             GetPerk().ModifyWeldingRate(CurrentFastenRate, CurrentUnfastenRate);
  139.             SetTimer(AmmoRechargeRate, true, nameof(RechargeAmmo));
  140.  
  141.             if ( DoorTarget.bIsDestroyed )
  142.             {
  143.                 DoorTarget.RepairDoor(RepairRate, KFPawn(Instigator));
  144.             }
  145.             else if ( CurrentFireMode == DEFAULT_FIREMODE )
  146.             {
  147.                 DoorTarget.FastenDoor(CurrentFastenRate, KFPawn(Instigator));
  148.             }
  149.             else
  150.             {
  151.                 DoorTarget.FastenDoor(CurrentUnfastenRate, KFPawn(Instigator));
  152.             }
  153.         }
  154.         else if ( HumanTarget != None )
  155.         {
  156.             CurrentFastenRate = FastenRate;
  157.             CurrentUnfastenRate = UnFastenRate;
  158.  
  159.             GetPerk().ModifyWeldingRate(CurrentFastenRate, CurrentUnfastenRate);
  160.             SetTimer(AmmoRechargeRate, true, nameof(RechargeAmmo));
  161.  
  162.             if ( HumanTarget.Armor > 0.0 )
  163.             {
  164.                 if ( CurrentFireMode == DEFAULT_FIREMODE )
  165.                 {
  166.                     HumanTarget.Armor++;
  167.                 }
  168.                 else
  169.                 {
  170.                     HumanTarget.Armor--;
  171.                 }
  172.             }
  173.         }
  174.     }
  175.  
  176.     if ( Instigator.IsLocallyControlled() )
  177.     {
  178.         if ( WeldTargetActor == none || !CanWeldTarget() )
  179.         {
  180.             StopFire(CurrentFireMode);
  181.         }
  182.     }
  183. }
  184.  
  185. simulated function bool CanWeldTarget( optional int FireModeNum=CurrentFireMode )
  186. {
  187.     local KFPerk WelderPerk;
  188.     local KFDoorActor DoorTarget;
  189.     local KFPawn_Human HumanTarget;
  190.  
  191.     WelderPerk = GetPerk();
  192.     DoorTarget=KFDoorActor(WeldTargetActor);
  193.     HumanTarget=KFPawn_Human(WeldTargetActor);
  194.  
  195.     if ( DoorTarget != None )
  196.     {
  197.  
  198.         if ( FireModeNum == DEFAULT_FIREMODE &&
  199.              DoorTarget.WeldIntegrity >= DoorTarget.MaxWeldIntegrity )
  200.         {
  201.             if( WelderPerk != none && WelderPerk.CanExplosiveWeld() )
  202.             {
  203.                 return DoorTarget.DemoWeld < DoorTarget.default.DemoWeldRequired;
  204.             }
  205.  
  206.             return false;
  207.         }
  208.         else if ( FireModeNum == ALTFIRE_FIREMODE &&
  209.                 DoorTarget.WeldIntegrity <= 0 )
  210.         {
  211.             return false;
  212.         }
  213.  
  214.     }
  215.     else if ( HumanTarget != None )
  216.     {
  217.         if ( FireModeNum == DEFAULT_FIREMODE && HumanTarget.Armor >= HumanTarget.MaxArmor )
  218.         {
  219.             return false;
  220.         }
  221.         else if ( FireModeNum == ALTFIRE_FIREMODE && HumanTarget.Armor <= 0 )
  222.         {
  223.             return false;
  224.         }
  225.     }
  226.  
  227.  
  228.     return true;
  229. }
  230.  
  231. simulated function CheckDelayedStartFire()
  232. {
  233.     local bool bNotifyServer;
  234.  
  235.     if ( WeldTargetActor != None )
  236.     {
  237.         if( PendingFire(DEFAULT_FIREMODE) )
  238.         {
  239.             BeginFire(DEFAULT_FIREMODE);
  240.             bNotifyServer = true;
  241.         }
  242.         else if( PendingFire(ALTFIRE_FIREMODE) )
  243.         {
  244.             BeginFire(ALTFIRE_FIREMODE);
  245.             bNotifyServer = true;
  246.         }
  247.  
  248.         if ( bNotifyServer && Role < ROLE_Authority )
  249.         {
  250.             ServerSetWeldTarget(WeldTargetActor, true);
  251.         }
  252.     }
  253. }
  254.  
  255. simulated function bool TickWeldTarget()
  256. {
  257.     local Actor PreviousTarget;
  258.  
  259.     if ( `TimeSince(LastTraceHitTime) < 0.2f )
  260.     {
  261.         return false;
  262.     }
  263.  
  264.     PreviousTarget = WeldTargetActor;
  265.     WeldTargetActor = TraceWeldActors();
  266.  
  267.     if ( PreviousTarget != WeldTargetActor )
  268.     {
  269.         return PlayIdleReadyTransition(PreviousTarget);
  270.     }
  271.  
  272.     return false;
  273. }
  274.  
  275. simulated function Actor TraceWeldActors()
  276. {
  277.     local KFDoorActor Door;
  278.     local KFPawn_Human Player;
  279.     local vector HitLoc, HitNorm, StartTrace, EndTrace, AdjustedAim;
  280.  
  281.     StartTrace = Instigator.GetWeaponStartTraceLocation();
  282.     AdjustedAim = vector(GetAdjustedAim(StartTrace));
  283.     EndTrace = StartTrace + AdjustedAim * WeldingRange;
  284.  
  285.     if( WeldTargetActor != none )
  286.     {
  287.         EndTrace += AdjustedAim * ExtraWeldingRange;
  288.     }
  289.  
  290.     foreach GetTraceOwner().TraceActors(class'KFDoorActor', Door, HitLoc, HitNorm, StartTrace, EndTrace)
  291.     {
  292.         if ( !Door.bIsDestroyed )
  293.         {
  294.             LastTraceHitTime = WorldInfo.TimeSeconds;
  295.             return Door;
  296.         }
  297.     }
  298.  
  299.     foreach GetTraceOwner().TraceActors(class'KFPawn_Human', Player, HitLoc, HitNorm, StartTrace, EndTrace)
  300.     {
  301.         if( Player.Health > 0 && Player.Armor < Player.MaxArmor )
  302.         {
  303.             LastTraceHitTime = WorldInfo.TimeSeconds;
  304.             return Player;
  305.         }
  306.     }
  307.  
  308.     return FindRepairableDoor();
  309. }
  310.  
  311. reliable server private function ServerSetWeldTarget(Actor NewTarget, bool bDelayedStart)
  312. {
  313.     WeldTargetActor = NewTarget;
  314.  
  315.     if ( bDelayedStart )
  316.     {
  317.         CheckDelayedStartFire();
  318.     }
  319. }
  320.  
  321. simulated function bool PlayIdleReadyTransition(Actor PreviousTarget)
  322. {
  323.     local name AnimName;
  324.     local float Duration;
  325.  
  326.     if( WeldTargetActor != None )
  327.     {
  328.         AnimName = WeldOpenAnim;
  329.         if ( PreviousTarget == None )
  330.         {
  331.             Duration = MySkelMesh.GetAnimLength(AnimName);
  332.             SetTimer(FMax(Duration - 0.2f, 0.01f), false, nameof(CheckDelayedStartFire));
  333.         }
  334.     }
  335.     else if( PreviousTarget != None )
  336.     {
  337.         AnimName = WeldCloseAnim;
  338.     }
  339.  
  340.     if ( AnimName != '' )
  341.     {
  342.         PlayAnimation(AnimName);
  343.         return true;
  344.     }
  345.  
  346.     return false;
  347. }
  348.  
  349. auto state Inactive
  350. {
  351.     simulated function BeginState(name PreviousStateName)
  352.     {
  353.         Super.BeginState(PreviousStateName);
  354.         WeldTargetActor = none;
  355.     }
  356. }
  357.  
  358. simulated state Active
  359. {
  360.     simulated event BeginState(Name PreviousStateName)
  361.     {
  362.         Super.BeginState(PreviousStateName);
  363.     }
  364.  
  365.     simulated event Tick(float DeltaTime)
  366.     {
  367.         Global.Tick(DeltaTime);
  368.  
  369.         if ( Instigator != none && Instigator.IsLocallyControlled() )
  370.         {
  371.             TickWeldTarget();
  372.             UpdateScreenUI();
  373.  
  374.             if ( !bAutoUnequip )
  375.             {
  376.                 TickAutoUnequip();
  377.             }
  378.         }
  379.     }
  380.  
  381.     simulated event OnAnimEnd(AnimNodeSequence SeqNode, float PlayedTime, float ExcessTime)
  382.     {
  383.         local bool bPlayingAnim;
  384.  
  385.         if ( Instigator != none && Instigator.IsLocallyControlled() )
  386.         {
  387.             bPlayingAnim = TickWeldTarget();
  388.  
  389.             if ( !bPlayingAnim )
  390.             {
  391.                 PlayIdleAnim();
  392.             }
  393.         }
  394.     }
  395.  
  396.     simulated function PlayIdleAnim()
  397.     {
  398.         local int IdleIndex;
  399.  
  400.         if ( Instigator != none && Instigator.IsLocallyControlled() )
  401.         {
  402.             if( WeldTargetActor != None )
  403.             {
  404.                 PlayAnimation(IdleWeldAnim, 0.0, true, 0.2);
  405.             }
  406.             else
  407.             {
  408.                 IdleIndex = Rand(IdleAnims.Length);
  409.                 PlayAnimation(IdleAnims[IdleIndex], 0.0, true, 0.2);
  410.             }
  411.         }
  412.     }
  413. }
  414.  
  415. defaultproperties
  416. {
  417.     InventoryGroup=IG_None
  418.     bCanThrow=false
  419.     bDropOnDeath=false
  420.     bAutoUnequip=true
  421.  
  422.     PlayerViewOffset=(X=20.0,Y=10,Z=-10)
  423.  
  424.     FireTweenTime=0.2f
  425.     WeldingRange=100.f
  426.     ExtraWeldingRange=10
  427.     FastenRate=68.f
  428.     UnFastenRate=-110.f
  429.     RepairRate=0.03f  //0.05f
  430.     IdleWeldAnim=Idle_Weld
  431.     WeldOpenAnim=Weld_On
  432.     WeldCloseAnim=Weld_Off
  433.  
  434.     // Aim Assist
  435.     AimCorrectionSize=0.f
  436.     bTargetAdhesionEnabled=false
  437.    
  438.     // Ammo
  439.     MagazineCapacity[0]=100
  440.     SpareAmmoCapacity[0]=0
  441.     bInfiniteSpareAmmo=true
  442.     AmmoRechargeRate=0.08f
  443.     bAllowClientAmmoTracking=false
  444.  
  445.     // Grouping
  446.     GroupPriority=5
  447.     WeaponSelectTexture=Texture2D'ui_weaponselect_tex.UI_WeaponSelect_Welder'
  448.  
  449.     // Weld
  450.     FireModeIconPaths(DEFAULT_FIREMODE)=Texture2D'ui_firemodes_tex.UI_FireModeSelect_Electricity'
  451.     FiringStatesArray(DEFAULT_FIREMODE)=WeaponWelding
  452.     WeaponFireTypes(DEFAULT_FIREMODE)=EWFT_Custom
  453.     FireInterval(DEFAULT_FIREMODE)=+0.2
  454.     AmmoCost(DEFAULT_FIREMODE)=7
  455.  
  456.     // Un-Weld
  457.     FireModeIconPaths(ALTFIRE_FIREMODE)=Texture2D'ui_firemodes_tex.UI_FireModeSelect_Electricity'
  458.     FiringStatesArray(ALTFIRE_FIREMODE)=WeaponWelding
  459.     WeaponFireTypes(ALTFIRE_FIREMODE)=EWFT_Custom
  460.     FireInterval(ALTFIRE_FIREMODE)=+0.2
  461.     AmmoCost(ALTFIRE_FIREMODE)=7
  462.  
  463.     // Fire Effects
  464.     MuzzleFlashTemplate=KFMuzzleFlash'WEP_Welder_ARCH.Wep_Welder_MuzzleFlash'
  465.     WeaponFireSnd(DEFAULT_FIREMODE)=(DefaultCue=AkEvent'WW_WEP_SA_Welder.Play_WEP_SA_Welder_Fire_Loop_M', FirstPersonCue=AkEvent'WW_WEP_SA_Welder.Play_WEP_SA_Welder_Fire_Loop_S')
  466.     WeaponFireSnd(ALTFIRE_FIREMODE)=(DefaultCue=AkEvent'WW_WEP_SA_Welder.Play_WEP_SA_Welder_Fire_Loop_M', FirstPersonCue=AkEvent'WW_WEP_SA_Welder.Play_WEP_SA_Welder_Fire_Loop_S')
  467.  
  468.     // BASH_FIREMODE
  469.     InstantHitDamageTypes(BASH_FIREMODE)=class'KFDT_Bludgeon_Welder'
  470.     InstantHitDamage(BASH_FIREMODE)=20
  471.  
  472.     // Advanced (High RPM) Fire Effects
  473.     bLoopingFireAnim(DEFAULT_FIREMODE)=true
  474.     bLoopingFireAnim(ALTFIRE_FIREMODE)=true
  475.     bLoopingFireSnd(DEFAULT_FIREMODE)=true
  476.     bLoopingFireSnd(ALTFIRE_FIREMODE)=true
  477.     WeaponFireLoopEndSnd(DEFAULT_FIREMODE)=(DefaultCue=AkEvent'WW_WEP_SA_Welder.Stop_WEP_SA_Welder_Fire_Loop_M', FirstPersonCue=AkEvent'WW_WEP_SA_Welder.Stop_WEP_SA_Welder_Fire_Loop_S')
  478.  
  479.     Begin Object Name=FirstPersonMesh
  480.         SkeletalMesh=SkeletalMesh'WEP_1P_Welder_MESH.Wep_1stP_Welder_Rig'
  481.         AnimSets(0)=AnimSet'WEP_1P_Welder_ANIM.Wep_1st_Welder_Anim'
  482.     End Object
  483.  
  484.     ScreenUIClass=class'KFGFxWorld_WelderScreen'
  485.  
  486.     AttachmentArchetype=KFWeaponAttachment'WEP_Welder_ARCH.Welder_3P'
  487.  
  488.     AssociatedPerkClasses(0)=none
  489. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement