From 810dd5075f2028f91b9db3e0871e44faf96cf8f0 Mon Sep 17 00:00:00 2001 From: T-MaxWiese-T Date: Sun, 7 Mar 2021 00:30:35 +0100 Subject: [PATCH] v8.1 (stable) --- CHANGELOG_SEF.txt | 2 + CHANGELOG_SEFC.txt | 11 +++- .../Classes/SwatProtectiveEquipment_sefc.u | Bin 10149 -> 7629 bytes SEFC backup files guide.txt | 12 ++--- .../Classes/Actions/AttackTargetAction.uc | 25 ++++----- .../Classes/Actions/BarricadeAction.uc | 1 + .../Classes/Goals/AttackTargetGoal.uc | 7 +++ System/SwatEquipment.ini | 50 +++++++++--------- System/SwatGui.ini | Bin 2802672 -> 2802944 bytes System/Version.ini | 8 +-- 10 files changed, 67 insertions(+), 49 deletions(-) diff --git a/CHANGELOG_SEF.txt b/CHANGELOG_SEF.txt index 23b75d3..85653cc 100644 --- a/CHANGELOG_SEF.txt +++ b/CHANGELOG_SEF.txt @@ -1,3 +1,5 @@ +ATTENTION: SEFC DOES NOT CONTAIN CONTENT CHANGES AND SOME THINGS ARE NOT TAKEN OVER! + ### v7.1 #### ALL CHANGES #### diff --git a/CHANGELOG_SEFC.txt b/CHANGELOG_SEFC.txt index e715f83..cdac582 100644 --- a/CHANGELOG_SEFC.txt +++ b/CHANGELOG_SEFC.txt @@ -1,8 +1,15 @@ +### v8.1 (stable) (main version) SEF Community Mod +- Updated to the latest SEFv7.1(Beta) state +- Added description with armorpenetration protection level to the helmets +- Added missing image for one helmet + + +----------------------------------------------------------------------------------------------------------------------------------------------- stable stage ### v8.01.1 (Beta) (main version) SEF Community Mod - Fixed crash when SWAT AI has arrested someone (thanks to mcdimm for the hint) ### v8.01 - Fixed crash with certain suspects -- Updated to the latest SEFv8(Beta) state +- Updated to the latest SEFv7.1(Beta) state - Updated SFX Improvement Mod from v5 to v6.0.1 (thanks to EFdee) - Fixed some sound bugs - Fixed wrong G36k silenced iron sight @@ -29,7 +36,7 @@ - Removed HOV Mod because it offers no real added value. Maybe some content will be added again but not everything - Restored SEFv7 vests and helmets - Reduced weapon clipping (inspired by Beppegoodoldrebel) - +--------------------------------------------------------------------------------------------------------------------------------------------------------- Beta stage ### v7.10.1 (stable) (main version) SEF Community Mod - Added new images for the mich2000 helmets and for the beretta pistol diff --git a/Content/Classes/SwatProtectiveEquipment_sefc.u b/Content/Classes/SwatProtectiveEquipment_sefc.u index 89a1495ac740d2450f639d6c5d3b4985b93bdb90..9727140f870f8436a1d2e02f447fa141550fa72b 100644 GIT binary patch literal 7629 zcmcIpYj7J^6}~I!?pm^C*|D9M^VlSAlIDezkkT|w;ydN#4EwnsaenK+C3_tRdfBa{Lp}c0`oO^fID@$pmKz2sn zd(NJF?sp#d+_URP zYfm|vqi1KBUF38$d46iDq`6Py6PC`(Ib-FlRub~cBGU^+hs)BDs&Sc*dS}cMD?8QF zf;q>^%&{~_h;Q)8+?a-HC$y|%T4K_OVP-G0`UhQemg%sp!*cVi;2G32p(&!}9a!IC%#XI=4d9b});CkY7ppjYU zZEeXA*t^EBfgx)&$H&X8w1TQ^CcF?^VA*2Q&}^IQiKZ5Z7mg(>$2dhNnNbq@ld0tK z%#lpNVoXG#Q>aD><{aTdowF5t)U=r3ah76ctA-1@eO@=6z_X5VLw9O~#UgxSTS2pD zG+P9y15pJTy|6d{7s`@mpE0dBkkEBZqM+XRbb|?mahlaZ4b)Ayb4&xU_ zJ1)|AWZ>x0qeEf%n;If<&dBHgd>R=&Lqtjs?1D^K)^p5OZE$Z+vvO(?YOpFIjHliq z(w0ti3U9$Ptf@qyH)Q%b614LcAl%UqWdmlUH9LFKvN)0Z(kGwv0qdnwwX8cUs$;67 zDHV$F0ky&^6=p3#!2|;AaT%&zv9y&#=&EBO<7m5t0tGKbz za^VoDF)Ef@W~oHhs50`+0M{|r7)nd77795H5a#c8~!Fj5g=QPXbVMih*5W0X= z^?W&RT28eL=Q^m+9W|>}ZBSw{+p%;!s?}xPMoqYs32H1`Et@Ku$j^i|k%~p3NUJkg zbrpJ3reCfJ((@3DM;pYWA*`l>+qMMeQ z<1G|CV9Rg}ptm8XFphjLSiD(M!LL`DVc?w^dP#?vL5~v%uZ{5yTG*CuQzpF~^P)_@ zS`&<~f!DV+^n3$mi@05>ztmmL$j?0TmBT z%yt0~J6Y9Z0l;s|^gA^G(dU~U8o<8c7`<1T;U9 z>1#D;@Wfl+ESeV67>~Q@lep)mPj*Tz9Cz#cMBr<3lSh73tKfSMwBk$n60OkJW%@>) zK?fh2K{s#QfHOgKOf4An-sgAJ|9Ym-pUU)Sb@uFfNcKqS`*}Lu85g@w6(3d=`ld|Z zsskn(mL|}(m^r*x0=3|4=%G)wl049wrYZkOq|l$s^cQuQH#7m4i?oRO|DNsXSQNi( zLqV@VqW@B+zpAk%0wC3gXp8r1kf5J=-_tU&=Hr$^el9K!nxDSC8A8dpB-+=KrO8gxL$57F`FnG+B*yS-k zvvDZ_$$7P)3igAgpz(IJ& zJrP)(&+$QQav5+JsJ6HaxC_R1mjQRd=m*AMLFu%=%tlw_s3-CPVBoqR^cd@13AhU- z2VDl-1q1xVk#T<^_Br%1+J^%nv%%%ST`+vp&!RAbO8LUG9&29WA9l%s0g@oa@FzBr zTbN!ukYsXUE5R>q^e*q7zl8XQU literal 10149 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 diff --git a/SEFC backup files guide.txt b/SEFC backup files guide.txt index c9377c7..2c34f4b 100644 --- a/SEFC backup files guide.txt +++ b/SEFC backup files guide.txt @@ -1,16 +1,16 @@ -Since I recommend to reinstall new main versions completely some data will be lost. -To avoid this you can backup some files and replace them in the new "SEFCommunityModv7" folder. +Main versions should be completely reinstalled and some data will be lost. +To avoid this you can backup some files and replace them in the new "SEFCommunityMod" folder. Campaign progress: -SEFCommunityModv7/System -> Campaign.ini +SEFCommunityMod/System -> Campaign.ini Your last loadouts: -SEFCommunityModv7/System -> DynamicLoadout.ini +SEFCommunityMod/System -> DynamicLoadout.ini Your personal settings, for example, keyboard settings: -SEFCommunityModv7/System -> User.ini +SEFCommunityMod/System -> User.ini Your mission results: -SEFCommunityModv7/System -> MissionResults.ini +SEFCommunityMod/System -> MissionResults.ini diff --git a/Source/Game/SwatAICommon/Classes/Actions/AttackTargetAction.uc b/Source/Game/SwatAICommon/Classes/Actions/AttackTargetAction.uc index 91e8527..f2e42fc 100644 --- a/Source/Game/SwatAICommon/Classes/Actions/AttackTargetAction.uc +++ b/Source/Game/SwatAICommon/Classes/Actions/AttackTargetAction.uc @@ -27,6 +27,7 @@ var(Parameters) float ChanceToSucceedAfterFiring; var(Parameters) bool bHavePerfectAim; var(Parameters) bool bOrderedToAttackTarget; var(Parameters) float WaitTimeBeforeFiring; +var(Parameters) bool bSuppressiveFire; // sensor we use to determine if we can hit the target var private TargetSensor TargetSensor; @@ -185,7 +186,7 @@ private function bool ShouldSucceed() latent function AttackTarget() { - local FiredWeapon CurrentWeapon; + local FiredWeapon CurrentWeapon; if(Target == None) { instantFail(ACT_INSUFFICIENT_RESOURCES_AVAILABLE); // Possibly fixes a bug (?) @@ -195,20 +196,20 @@ latent function AttackTarget() ReadyWeapon(); - CurrentWeapon = FiredWeapon(m_Pawn.GetActiveItem()); + CurrentWeapon = FiredWeapon(m_Pawn.GetActiveItem()); - // we should have a weapon before we continue + // we should have a weapon before we continue if (CurrentWeapon == None) instantFail(ACT_NO_WEAPONS_AVAILABLE); if (m_Pawn.LogTyrion) log(m_Pawn.Name $ " AttackTargetAction::AttackTarget - CurrentWeapon: " $ CurrentWeapon.Name $ " NeedsReload: " $ CurrentWeapon.NeedsReload() $ " CanReload: " $ CurrentWeapon.CanReload()); - // if our current weapon is empty, and can reload, reload - if (CurrentWeapon.NeedsReload() && CurrentWeapon.CanReload()) - { + // if our current weapon is empty, and can reload, reload + if (CurrentWeapon.NeedsReload() && CurrentWeapon.CanReload()) + { CurrentWeapon.LatentReload(); - } + } else if (CurrentWeapon.IsEmpty()) { instantFail(ACT_NO_WEAPONS_AVAILABLE); @@ -225,14 +226,14 @@ latent function AttackTarget() CurrentWeapon.AIInterrupt(); } - // wait until we can hit the target (make sure the target is still conscious too!) - while(! m_Pawn.CanHit(Target) && ((TargetPawn == None) || class'Pawn'.static.checkConscious(TargetPawn))) - { + // wait until we can hit the target (make sure the target is still conscious too!) + while(!bSuppressiveFire && !m_Pawn.CanHit(Target) && ((TargetPawn == None) || class'Pawn'.static.checkConscious(TargetPawn))) + { if (m_Pawn.logTyrion) log(m_Pawn.Name $ " is waiting to be able to hit target " $ TargetPawn); - yield(); - } + yield(); + } // if we can aim at the target if (ISwatAI(m_pawn).AnimCanAimAtDesiredActor(Target)) diff --git a/Source/Game/SwatAICommon/Classes/Actions/BarricadeAction.uc b/Source/Game/SwatAICommon/Classes/Actions/BarricadeAction.uc index 838ae27..7a94aff 100644 --- a/Source/Game/SwatAICommon/Classes/Actions/BarricadeAction.uc +++ b/Source/Game/SwatAICommon/Classes/Actions/BarricadeAction.uc @@ -504,6 +504,7 @@ latent function ShootAtOpeningDoor() AttackDoorGoal = new class'AttackTargetGoal'(weaponResource(), DoorOpening); assert(AttackDoorGoal != None); AttackDoorGoal.AddRef(); + AttackDoorGoal.SetSuppressiveFire(true); AttackDoorGoal.postGoal(self); // do some speech diff --git a/Source/Game/SwatAICommon/Classes/Goals/AttackTargetGoal.uc b/Source/Game/SwatAICommon/Classes/Goals/AttackTargetGoal.uc index f755e10..5d37fbe 100644 --- a/Source/Game/SwatAICommon/Classes/Goals/AttackTargetGoal.uc +++ b/Source/Game/SwatAICommon/Classes/Goals/AttackTargetGoal.uc @@ -16,6 +16,7 @@ var(Parameters) float ChanceToSucceedAfterFiring; var(Parameters) bool bHavePerfectAim; var(Parameters) bool bOrderedToAttackTarget; var(Parameters) float WaitTimeBeforeFiring; +var(Parameters) bool bSuppressiveFire; /////////////////////////////////////////////////////////////////////////////// // @@ -72,6 +73,11 @@ function SetWaitTimeBeforeFiring(float inWaitTime) WaitTimeBeforeFiring = inWaitTime; } +function SetSuppressiveFire(bool suppressiveFire) +{ + bSuppressiveFire = suppressiveFire; +} + /////////////////////////////////////////////////////////////////////////////// defaultproperties { @@ -79,5 +85,6 @@ defaultproperties GoalName = "AttackTarget" WaitTimeBeforeFiring = 0 + bSuppressiveFire = false } diff --git a/System/SwatEquipment.ini b/System/SwatEquipment.ini index 8b1b4b8..578d47b 100644 --- a/System/SwatEquipment.ini +++ b/System/SwatEquipment.ini @@ -6484,7 +6484,7 @@ Bulk=1.4 ;SEFC [SwatProtectiveEquipment_sefc.GSG9riotcamou] PlayerUsable=true -Description= +Description=Armorpenetration: Level 2 FriendlyName=GSG9riotcamou GUIImage=material'AddEquipGui_Tex.equip_SEK_geschl' Weight=2.2 @@ -6492,7 +6492,7 @@ Bulk=2.4 [SwatProtectiveEquipment_sefc.GSG9riotblack] PlayerUsable=true -Description= +Description=Armorpenetration: Level 2 FriendlyName=GSG9riotblack GUIImage=material'AddEquipGui_Tex.equip_GSG9_geschl' Weight=2.2 @@ -6500,19 +6500,19 @@ Bulk=2.4 [SwatProtectiveEquipment_sefc.AdvancedHelmet] PlayerUsable=true -Description= +Description=Armorpenetration: Level 2 FriendlyName=AdvancendHelmet GUIImage=material'AddEquipGui_Tex.AdvancedHelmet' -Weight=2.2 -Bulk=2.4 +Weight=2.3 +Bulk=2.5 [SwatProtectiveEquipment_sefc.EliteHelmet] PlayerUsable=true -Description= +Description=Armorpenetration: Level 2 FriendlyName=EliteHelmet GUIImage=material'AddEquipGui_Tex.EliteHelmet' -Weight=2.2 -Bulk=2.4 +Weight=2.4 +Bulk=2.7 [SwatProtectiveEquipment_sefc.helmetGasMask] PlayerUsable=true @@ -6524,7 +6524,7 @@ Bulk=2.4 [SwatProtectiveEquipment_sefc.BallisticEyewear] PlayerUsable=true -Description= +Description=Armorpenetration: Level 0 FriendlyName=BallisticEyewear GUIImage=material'AddEquipGui_Tex.BallisticEyewear' Weight=2.2 @@ -6532,15 +6532,15 @@ Bulk=2.4 [SwatProtectiveEquipment_sefc.Headset] PlayerUsable=true -Description= +Description=Armorpenetration: Level 0 FriendlyName=Headset GUIImage=material'AddEquipGui_Tex.Headset' -Weight=2.2 +Weight=1.2 Bulk=2.4 [SwatProtectiveEquipment_sefc.Helm] PlayerUsable=true -Description= +Description=Armorpenetration: Level 2 FriendlyName=Helmet GUIImage=material'AddEquipGui_Tex.Helm' Weight=2.2 @@ -6548,11 +6548,11 @@ Bulk=2.4 [SwatProtectiveEquipment_sefc.SWAT5Hat] PlayerUsable=true -Description= +Description=Armorpenetration: Level 0 FriendlyName=Hat -GUIImage=material'AddEquipGui_Tex.SWAT5Hat' -Weight=2.2 -Bulk=2.4 +GUIImage=material'AddEquipGui_Tex.Hat' +Weight=0.5 +Bulk=0.4 ;******************************** ; TACTICAL AIDS @@ -8802,15 +8802,6 @@ EquipmentClassName=SwatProtectiveEquipment.EnemyProTecHelmet Validity=NETVALID_All TeamValidity=TEAMVALID_All bSelectable=1 -EquipmentClassName=SwatEquipment.NoEquipment -Validity=NETVALID_All -TeamValidity=TEAMVALID_ALL -bSelectable=1 -EquipmentClassName=None -Validity=NETVALID_All -TeamValidity=TEAMVALID_All -bSelectable=0 -bSpawnable=True ;SEFC EquipmentClassName=SwatProtectiveEquipment_sefc.AdvancedHelmet Validity=NETVALID_All @@ -8844,6 +8835,15 @@ EquipmentClassName=SwatProtectiveEquipment_sefc.SWAT5Hat Validity=NETVALID_All TeamValidity=TEAMVALID_ALL bSelectable=1 +EquipmentClassName=SwatEquipment.NoEquipment +Validity=NETVALID_All +TeamValidity=TEAMVALID_ALL +bSelectable=1 +EquipmentClassName=None +Validity=NETVALID_All +TeamValidity=TEAMVALID_All +bSelectable=0 +bSpawnable=True [Pocket_Toolkit] bSpawnable=True diff --git a/System/SwatGui.ini b/System/SwatGui.ini index 56c7a12c112f5a001243e4ec41f405d2d3ba5c3f..3db09e5b2720176306c3d9749e51774727ad2c55 100644 GIT binary patch delta 989 zcmaLWT}V@L6aeu5-R`b)yZ7$<-ubb-o7>!mjJYjc6r~m6V)@ZG1Xg4p&e^0!5LDhh zQ1SaC_GK=xDnbNvAdsgN4cNP`$ug|w&|>6HF}e)e5qE=fOV zSJN=BVzn^SYoL2NmUorOpkvY&(zD1|8j>O zeYjg`k|O=YPb8AS_yQTk=paUEa*ar^@<`PUucCG@$gTEOQ#TnV7s=Jll#K)*$XebF zl9NtAPji(Ok~{4QC}!(*Ajc^?Oj#(a@;zo3qVO{5YPR*_N_Ud8BvUDs!mXvC+AY=A4d77MQ3Q7*xYh{1!<9;uhR+RN4}=}wX!XY52>XsO4k%Yy fqENDG7?_c~%iNYzxk;xNH6b7JE0fN^iO0VIHfS4u delta 878 zcmbW$Pe>F|90%|>yEE&q`^VjJ-5K50W}V&Vx-7bD>RQNRAx2R-$ATzLA%k2CgZ>b zf>6pY2)P%+N~7Zp>t)>(#}U3{JrB=0OA~Tjkn=-vfmn!@h(sbbQbz2=LCVdcxbxLV zO#KvNNOrgloVvP-I)WLlyVY>@yjP-b+EPu#bBL`!WC8g`&dfxP&W!=iZ{P5xrv8VkllA5 zkx3=-lPVH0*CmCIBe&)e(X$+=M{?fhfiV>bnZ|uZ7K9XTY`S&yeRtZ;hYu9HP?2I9 z8({q`%dWCfb`x_mdc$5Gls{#h^m6=;(V=h0svMR^?xGJNRQsw+)RwdP>h6G87)RH=Kh-f5C>WNMw=43V+ zS^9IQA5BkJVyjcrg2QZt4N_dDOEy5`Vb)A`zm38g=22fW4M*55+SoOE_On5J(|H=# t6~Abu{{yKA??v&0Zo_hzZ#wq-;j_Yn@M`>aKBIHeKw_lP%;@ozx!>^h9d!Tz diff --git a/System/Version.ini b/System/Version.ini index c25b771..15a46e0 100644 --- a/System/Version.ini +++ b/System/Version.ini @@ -1,10 +1,10 @@ [Version] ModName="SEF" -ChangeNumber=8.011 +ChangeNumber=8.1 ChangeTime="00:00:00" -ChangeDate="2021/03/01" -BuildTime="Mon Mar 03 2021" +ChangeDate="2021/03/06" +BuildTime="Sat Mar 03 2021" [SwatGui.ModInfo] ModName="[b]SWAT: Elite Force Community[\b]" -ChangeNumber="v8.01.1 ([c=00FF00][b]Beta[\b][\c])" +ChangeNumber="v8.1 ([c=00FF00][b]stable[\b][\c])"