
1.
Äëÿ ýòîé ïðîöåäóðû íàì ïîíàäîáèòüñÿ äâå ïðîãðàììû: HexEdit äëÿ ïðàâêè øåñòíàäöàòåðè÷íîãî êîäà è UT Package Tool v2.0 beta 5, êîòîðûé ñîáñòâåííî è äåêîìïèëèðóåò êîä ñ óäàëåííûì òåêñòîì èñõîäíîãî êîäà. Òàê æå ðåêîìåíäóþ ïðîãðàììó UnCodeX äëÿ óäîáíîãî ïðîñìîòðà è ïîèñêà íóæíîé ôóíêöèè â èñõîäíèêàõ Killing Floor (êîòîðûå çàãðóæàþòñÿ âìåñòå ñ ðåäàêòîðîì Killing Floor SDK). Áåðåì çàøèôðîâàííûé ôàéë (îáû÷íî ýòî *.u ôàéëû ), êîòîðûé íóæíî äåêîìïèëèòü, è äëÿ íà÷àëà äåêîìïèëèðóåì åãî îáû÷íûìè ñðåäñòâàìè Killing Floor (ucc.exe), äëÿ òîãî ÷òîá ïîëó÷èòü defaultproperties, òàê êàê ïðîãðàììà UT Package Tool äåêîìïèëèò ýòè çíà÷åíèÿ ïî óìîë÷àíèþ ñ íåêîòîðûìè îøèáêàìè. Äëÿ ýòîãî ñîçäàåì â ïàïêå System bat ôàéë, â êîòîðîì ïèøåì ucc batchexport Mut.u class uc ..MutClassespauseÂìåñòî Mut èìÿ âàøåãî çàñêðèïòîâàííîãî ôàéëà. Ñîõðàíÿåì. Çàïóñêàåì. Ñîõðàíÿåì ïîëó÷åííûå *.uc ôàéëû ê ïðèìåðó â ïàïêå ïîä èìåíåì Default.
2.
Äàëåå îïÿòü æå èñõîäíûé *.u ôàéë îòêðûâàåì â HexEdit è ìåíÿåì ïåðâûé áàéò çíà÷åíèå êîòîðîãî C2 íà çíà÷åíèå C1, äëÿ òîãî ÷òîá UT Package Tool îïðåäåëèë ýòîò ôàéë êàê ôàéë èãðû Unreal Tournament 2004, òàê êàê ïðîãðàììà íå çíàêîìà ñ èãðîé Killing Floor. Ñîõðàíÿåì åãî â HexEdit. Çàïóñêàåì UT Package Tool è îòêðûâàåì ïîëó÷åííûé ôàéë. Âî âêëàäêå Export Tree ùåëêàåì íà ëþáîì êëàññå ïðàâîé êíîïêîé è íàæèìàåì Full Collapse. Íàæèìàåì File/Options è óáåæäàåìñÿ, ÷òî ñòîèò ãàëî÷êà Add line offsets to decompiled code. Äàëåå ïî ïîðÿäêó íà êàæäîì êëàññå ùåëêàåì ïðàâîé êíîïêîé ìûøè è íàæèìàåì Decompile.  ïðàâîì îêíå äîëæåí ïîÿâèòüñÿ äåêîìïèëèðîâàííûé êîä äàííîãî êëàññà. Ñïðàâà íàæèìàåì Save. Ñîçäàåì êàêóþ-íèáóäü ïàïêó ñ áóäóùèì íàçâàíèåì äàííîãî ìóòàòîðà, íàïðèìåð Mut, è â ýòîé æå ïàïêå ñîçäàåì ïîäïàïêó Classes, â êîòîðîé è ñîõðàíÿåì äåêîìïèëèðîâàííûé êîä. Äàííóþ ïðîöåäóðó ïðîäåëûâàåì ñî âñåìè êëàññàìè ñëåâà. Äàëåå ñîõðàíåííûå *.uc ôàéëû â ïàïêå MutClasses îòêðûâàåì ñ ïîìîùüþ áëîêíîòà è çàìåíÿåì âñå defaultproperties íà defaultproperties èç ñîõðàíåííîé ðàíåå ïàïêè Default. Åñëè, íàïðèìåð, â îïèñàíèè êëàññà åñòü class AntiBlocker extends Mutator Localized HideCategories(Movement,Collision,Lighting,LightColor,Karma,Force);òî óäàëÿåì Localized è HideCategories(Movement,Collision,Lighting,LightColor,Karma,Force). Çíàê ; îñòàâëÿåì, ïîëó÷àåòñÿ ïðîñòî class AntiBlocker extends Mutator;
3.
Äàëåå ðàññìîòðèì íåêîòîðûå îøèáêè è íåäî÷åòû äîïóùåííûå ñàìèì UT Package Tool. Èíîãäà ïðè êîìïèëèðîâàíèè äàííîãî äåøèôðîâàííîãî êîäà ucc.exe ìîæåò âûäàòü, ê ïðèìåðó, ñëåäóþùåå ñîîáùåíèå Log: Parsing ClientPerkRepLinkError: E:GamesGameSteamsteamappscommonkillingfloorKFpubModClassesClientPerkRepLink.uc(46) : Error, Unrecognized type 'FPerksListType'Äàííûé êëàññ âûãëÿäèò ñëåäóþùèì îáðàçîìclass ClientPerkRepLink extends LinkedReplicationInfo;var array<FPerksListType> CachePerks;struct FPerksListType{ var Class<KFpubVet> PerkClass; var byte CurrentLevel;};Òóò îøèáêà â ñëåäóþùåì, ÷òî UT Package Tool ñíà÷àëà ïðèñâàèâàåò ïåðåìåííóþ CachePerks, ññûëàÿñü íà ïåðåìåííóþ FPerksListType, ñòðóêòóðà êîòîðîé îïèñûâàåòñÿ óæå ïîñëå îáúÿâëåíèÿ CachePerks, ïðàâèëüíî áóäåò ñíà÷àëà îáúÿâèòü ïåðåìåííóþ FPerksListType, à çàòåì óæå ññûëàòüñÿ íà íåå, áóäåò òàêclass ClientPerkRepLink extends LinkedReplicationInfo;struct FPerksListType{ var Class<KFpubVet> PerkClass; var byte CurrentLevel;};var array<FPerksListType> CachePerks;Êîðî÷å, íàäî ïðîâåðèòü âñå uc ôàéëû, è ïåðåíåñòè âñå ñòðóêòóðû (struct) â íà÷àëî ôàéëà ñðàçó ïîñëå îáúÿâëåíèÿ êëàññà, èëè íà óñìîòðåíèå ñàìîãî êîäåðà. Ñëåäóþùàÿ îøèáêà, êîòîðàÿ âûïàëà íà îäíîì ïðèìåðå ïî êîìïèëÿöèè âçëîìàííîãî ìóòàòîðà Log: Parsing ClientPerkRepLinkError: E:GamesGameSteamsteamappscommonkillingfloorKFpubModClassesClientPerkRepLink.uc(290) : Error, Missing '>' in 'class limitor'Îøèáêà â ñëåäóþùåì òåêñòå ïðîãðàììû local array<Class<KFpubVet>> ca;Çäåñü ïðîñòî íàäî ïîñëå local array<Class<KFpubVet> ïîñòàâèòü ïðîáåë, ïîëó÷èòüñÿlocal array<Class<KFpubVet> > ca;Äàëåå Log: Parsing KillingFloorPubError: E:GamesGameSteamsteamappscommonkillingfloorKFpubModClassesKillingFloorPub.uc(251) : Error, Unrecognized type 'ServerResponseLine'Òåêñò ñ îøèáêîéfunction GetServerDetails (out ServerResponseLine ServerState)Ïðàâèëüíî áóäåòfunction GetServerDetails (out GameInfo.ServerResponseLine ServerState)Åñëè êîìïèëÿòîð ãîâîðèò ÷òî ïåðåìåííàÿ íå íàéäåíà, òî ìîæíî ïîêîïàòüñÿ â èñõîäíûõ êîäàõ Killing Floor è ïîñìîòðåòü ïðàâèëüíîå íàïèñàíèå äàííîé ïåðåìåííîé, â äàííîì ñëó÷àå ýòî ServerResponseLine, êîïèðóåòå íàçâàíèå, çàïóñêàåòå UnCodeX è â ïîèñêå âáèâàåòå ýòó ïåðåìåííóþ, è ïðîãðàììà ïîêàæåò âîçìîæíî ïðàâèëüíîå íàïèñàíèå ýòîé ïåðåìåííîé. Íåêîòîðûå ïðèìåðû ïåðåìåííûõ, êîãäà UT Package Tool íå ïðîïèñûâàåò èõ ïîëíîñòüþ: PlayerRecord (ïðàâèëüíî xUtil.PlayerRecord ), ServerFavorite (ïðàâèëüíî ExtendedConsole.ServerFavorite), AllowWeaponInTrader ( ïðàâèëüíî Static.AllowWeaponInTrader, ïî ïîâîäó Static, ýòî ñëîâî ìíîãî ãäå áóäåò ïðèïèñûâàòüñÿ ïî õîäó êîìïèëÿöèè êîäà ) .ÄàëååLog: Parsing KFpubGTError: E:GamesGameSteamsteamappscommonkillingfloorKFpubModClassesKFpubGT.uc(424) : Error, 'Extends' not allowed here: state 'PendingMatch' overrides version in parent classÒåêñò ñ îøèáêîéauto state PendingMatch extends PendingMatchÏðîäóáëèðîâàëñÿ PendingMatch, ïðîñòî óäàëÿåì è ïîëó÷àåìauto state PendingMatchÄàëååLog: Parsing KFpubTabMidGameVCError: E:GamesGameSteamsteamappscommonkillingfloorKFpubModClassesKFpubTabMidGameVC.uc(20) : Error, Specified type modifiers not allowed hereÒåêñò ñ îøèáêîéfunction bool Buttonclicked (export editinlineuse GUIComponent Sender)Ïðàâèëüíîfunction bool Buttonclicked ( GUIComponent Sender)Ïðîñòî óäàëÿåì export editinlineuse. Ýòî òàêæå êàñàåòñÿ îáúÿâëåíèÿ ïåðåìåííûõ, íàïðèìåðlocal export editinlineuse GUIList List;Ïðàâèëüíîlocal GUIList List;ÄàëååLog: Compiling KFpubLCError: E:GamesGameSteamsteamappscommonkillingfloorKFpubModClassesKFpubLC.uc(41) : Error, Type mismatch in 'new' nameÒåêñ ñ îøèáêîéC = new (None,Class'KFpubLC');ÏðàâèëüíîC = new (None) Class'KFpubLC';ÄàëååLog: Compiling KFpubLCError: E:GamesGameSteamsteamappscommonkillingfloorKFpubModClassesKFpubLC.uc(48) : Error, Label 'JL0021' not found in this block of codeÒåêñò ñ îøèáêîéstatic final function AddSafeCleanup (PlayerController PC){ local int i; local KFpubLC C; i = PC.Player.LocalInteractions.Length - 1; // 0x00000019 : 0x0000 if ( i >= 0 ) // 0x00000032 : 0x0021 { if ( PC.Player.LocalInteractions[i ].Class == Default.Class ) // 0x0000003B : 0x002C { return; // 0x0000005F : 0x005C } --i; // 0x00000061 : 0x005E goto JL0021; // 0x00000066 : 0x0065 } C = new (None) Class'KFpubLC'; // 0x00000069 : 0x0068 C.ViewportOwner = PC.Player; // 0x00000074 : 0x0077 C.Master = PC.Player.InteractionMaster; // 0x00000089 : 0x0094 i = PC.Player.LocalInteractions.Length; // 0x000000A5 : 0x00BA PC.Player.LocalInteractions.Length = i + 1; // 0x000000BB : 0x00D8 PC.Player.LocalInteractions[i ] = C; // 0x000000D4 : 0x00F9 C.Initialize(); // 0x000000ED : 0x011C}Ñïðàâà òèïà íàäïèñè êàê // 0x000000A5 : 0x00BA ýòî àäðåñà, êîòîðûå ïðîïèñàëèñü ïðè äåêîìïèëÿöèè ïðè ïîìîùè UT Package Tool ( äëÿ ýòîãî ìû âûñòàâèëè ãàëî÷êó Add line offsets to decompiled code â îïöèÿõ ïðîãðàììû). Ñäåëàíî ýòî äëÿ òîãî, ÷òîá ìû ìîãëè âèäåòü êóäà ïðîïèñàòü Label, êîòîðûé íóæåí äëÿ îïåðàòîðà goto. Äåëî â òîì, ÷òî UT Package Tool âñå îïåðàöèè ñ öèêëàìè òèïà êàê for, while è ò.ä. äåêîìïèëèðóåò â îïåðàòîð goto, ïðè ýòîì ïðîãðàììà âñÿ÷åñêè îòêàçûâàåòñÿ ñàìîñòîÿòåëüíî ðàññòàâëÿòü íåîáõîäèìûå Label, à åñëè è ðàññòàâëÿåò (÷òî î÷åíü ðåäêî), òî âñåãäà íå ïðàâèëüíî, è èõ íàäî óäàëÿòü, ïîñëå ýòîãî ðàññòàâëÿòü âðó÷íóþ. Íà äàííîì ïðèìåðå çäåñü òîëüêî îäèí îïåðàòîð goto êîòîðûé õî÷åò ïåðåéòè íà label JL0021. Ïðàâèëüíî áóäåò òàêstatic final function AddSafeCleanup (PlayerController PC){ local int i; local KFpubLC C; i = PC.Player.LocalInteractions.Length - 1; // 0x00000019 : 0x0000 JL0021: if ( i >= 0 ) // 0x00000032 : 0x0021 { if ( PC.Player.LocalInteractions[i ].Class == Default.Class ) // 0x0000003B : 0x002C { return; // 0x0000005F : 0x005C } --i; // 0x00000061 : 0x005E goto JL0021; // 0x00000066 : 0x0065 } C = new (None) Class'KFpubLC'; // 0x00000069 : 0x0068 C.ViewportOwner = PC.Player; // 0x00000074 : 0x0077 C.Master = PC.Player.InteractionMaster; // 0x00000089 : 0x0094 i = PC.Player.LocalInteractions.Length; // 0x000000A5 : 0x00BA PC.Player.LocalInteractions.Length = i + 1; // 0x000000BB : 0x00D8 PC.Player.LocalInteractions[i ] = C; // 0x000000D4 : 0x00F9 C.Initialize(); // 0x000000ED : 0x011C}Íî label íóæíî ïðîïèñûâàòü èìåííî â òîé ôóíêöèè, ãäå èñïîëüçóåòñÿ îïåðàòîð goto.ÄàëååLog: Compiling ClientPerkRepLinkError: E:GamesGameSteamsteamappscommonkillingfloorKFpubModClassesClientPerkRepLink.uc(78) : Error, Missing 'Reliable' or 'Unreliable'Òåêñò ñ îøèáêîéun?reliable if ( (Role == 4) && bNetOwner )Ïðàâèëüíî reliable if ( (Role == 4) && bNetOwner )Òàê êàê UT Package Tool íå çíàë, ÷òî ïðèìåíèòü, Reliable èëè Unreliable. Íàñêîëüêî ÿ ïîíÿë â ýòèõ ïîíÿòèÿõ î ðåïëèêàöèè, òî Reliable ïåðåñûëàåò îáÿçàòåëüíî ïåðåìåííóþ èëè ôóíêöèþ îò ñåðâåðà ê êëèåíòó è íàîáîðîò, à ïðè ñëó÷àå ñ Unreliable, äîïóñêàåòñÿ óòðàòà ïåðåìåííîé èëè ôóíêöèè ïðè ïëîõîì èíòåðíåò ñîåäèíåíèè. Òàê ÷òî â áîëüøèíñòâå ñëó÷àåâ èñïîëüçóåòñÿ èìåííî Reliable.
4.
ÄàëååLog: Compiling ClientPerkRepLinkError: E:GamesGameSteamsteamappscommonkillingfloorKFpubModClassesClientPerkRepLink.uc(496) : Error, 'If' is not allowed hereÒåêñò ñ îøèáêîéif ( Level.NetMode == 3 )Ïðàâèëüíîif ( Level.NetMode == NM_Client )Äåëî â òîì, ÷òî UT Package Tool íåêîòîðûå ñèìâîëüíûå çíà÷åíèÿ çàìåíÿåò öèôðàìè, ýòè öèôðû ñîîòâåòñòâóþò íåêîòîðûì çíà÷åíèÿì ïåðåìåííûõ, êîòîðûå ñîñòîÿò èç ñòðóêòóð. Ýòî êàñàåòñÿ òàêèõ âûðàæåíèÿõ êàê ClientState, ClientGrenadeState, NetMode, Role, Physics, PlayOwnedSound, SetDrawType è ìíîãèõ äðóãèõ, âñå èõ ìîæíî íàéòè â èñõîäíèêàê Killing Floor, íàïðèìåð áîëüøèíñòâî èõ îïèñàíî â êëàññå Actor. Âîò òàáëèöà íåêîòîðûõ èç íèõClientState-----------0- WS_None1- WS_Hidden2- WS_BringUp3- WS_PutDown4- WS_ReadyToFireClientGrenadeState------------------0- GN_None1- GN_TempDown2- GN_BringUpNetMode-------0- NM_Standalone1- NM_DedicatedServer2- NM_ListenServer3- NM_ClientRole----0- ROLE_None1- ROLE_DumbProxy2- ROLE_SimulatedProxy3- ROLE_AutonomousProxy4- ROLE_AuthorityPhysics-------0- PHYS_None1- PHYS_Walking2- PHYS_Falling3- PHYS_Swimming4- PHYS_Flying5- PHYS_Rotating6- PHYS_Projectile7- PHYS_Interpolating8- PHYS_MovingBrush9- PHYS_Spider10- PHYS_Trailer11- PHYS_Ladder12- PHYS_RootMotion13- PHYS_Karma14- PHYS_KarmaRagDoll15- PHYS_Hovering16- PHYS_CinMotionPlayOwnedSound--------------0- SLOT_None1- SLOT_Misc2- SLOT_Pain3- SLOT_Interact4- SLOT_Ambient5- SLOT_Talk6- SLOT_InterfaceSetDrawType-----------0- DT_None,1- DT_Sprite,2- DT_Mesh,3- DT_Brush,4- DT_RopeSprite,5- DT_VerticalSprite,6- DT_Terraform,7- DT_SpriteAnimOnce,8- DT_StaticMesh,9- DT_DrawType,10-DT_Particle,11-DT_AntiPortal,12-DT_FluidSurfaceÑëåâà öèôðà, à ñïðàâà ÷åìó ýòà öèôðà áóäåò ñîîòâåòñòâîâàòü, â íàøåì ïðèìåðå Level.NetMode == 3 ðàâíà òðè, ÷òî ñîîòâåòñòâóåò çíà÷åíèþ NM_Client, ïîýòîìó íóæíî ïîìåíÿòü íà Level.NetMode == NM_Client, ïîâòîðÿþ, âñå ýòè çíà÷åíèÿ ìîæíî íàéòè â èñõîäíèêàõ. Èíîãäà êîìïèëÿòîð äîïóñêàåò èñïîëüçîâàíèå öèôð âìåñòî áóêâåííîãî çíà÷åíèÿ, íî âñå ðàâíî, ëó÷øå ýòîãî íå äîïóñêàòü.Äàëåå îïÿòü òà æå îøèáêà â òîì æå ìåñòå, íî ïî äðóãîìó ïîâîäóLog: Compiling ClientPerkRepLinkError: E:GamesGameSteamsteamappscommonkillingfloorKFpubModClassesClientPerkRepLink.uc(496) : Error, 'If' is not allowed hereÒåêñò ñ îøèáêîéauto state RepSetup{ if ( Level.NetMode == NM_Client ) // 0x00000018 : 0x0000 { stop // 0x0000002C : 0x0019 }Ýòî íå âåñü êîä, à òîëüêî êóñî÷åê, ãäå ïðîèçîøëà îøèáêà, îøèáêà çàêëþ÷àåòñÿ â ñëåäóþùåì, ïðîãðàììà UT Package Tool â ôóíêöèÿõ State íå õî÷åò ðàññòàâëÿòü Label, çäåñü äîëæíà áûòü ìåòêà begin, áóäåò ïðàâèëüíî âûãëÿäåòü òàêauto state RepSetup{Begin: if ( Level.NetMode == NM_Client ) // 0x00000018 : 0x0000 { stop; // 0x0000002C : 0x0019 }Òàê ÷òî â êàæäîì state íóæíî âèçóàëüíî ïðîñìîòðåòü íà íåîáõîäèìîñòü íóæíûõ ìåòîê, à åñëè åñòü ñîìíåíèÿ ëó÷øå ïîäãëÿäåòü â èñõîäíèêàõ, â îñíîâíîì âñå ñòàòû ïåðåïèñûâàþòñÿ èç óæå èìåþùèõñÿ â ñàìîé èãðå. Åñëè ýòîãî íå ñäåëàòü, òî êîìïèëÿòîð ìîæåò è çàêîí÷èòü êîìïèëÿöèþ ìîäà áåç îøèáîê è ïðåäóïðåæäåíèé, íî â ýòîì ñëó÷àå âîçìîæíî íàáëþäàòü, ÷òî, ê ïðèìåðó, êàêîé-íèáóäü çîìáè áóäåò ñåáÿ âåñòè íå àäåêâàòíî, òóïèòü è òàê äàëåå, èìåííî èç-çà òîãî, ÷òî ìû â ñòàòå íå ïðîïèñàëè íóæíóþ ìåòêó, ïî÷åìó çîìáè? Ïîòîìó ÷òî â îñíîâíîì îíè è èñïîëüçóþò òàêèå ôóíêöèè êàê state, íî íå òîëüêî îíè êîíå÷íî. Åñëè êòî-òî çàìåòèë, òî ïîñëå îïåðàòîðà stop ÿ ïîñòàâèë çíàê ; ýòî òîæå áûëà îøèáêà äîïóùåííàÿ UT Package Tool. Îïåðàòîð goto íåëüçÿ èñïîëüçîâàòü â state, çàìåíÿéòå âûðàæåíèÿ íà êîìàíäó while â îñíîâíîì, â ýòîì âàì ïîìîãóò èñõîäíèêè. Íàïðèìåð òåêñò ñ êîäîì êàê äåëàòü íåëüçÿauto state RepSetup{begin: if ( Level.NetMode == NM_Client ) // 0x00000018 : 0x0000 { stop; // 0x0000002C : 0x0019 } Sleep(1.0); // 0x0000002D : 0x001A NetUpdateFrequency = 0.5; // 0x00000035 : 0x0022 if ( NetConnection(StatObject.PlayerOwner.Player) != None ) // 0x0000003E : 0x002D {if ( (ClientAccknowledged[0] < ShopInventory.Length) || (ClientAccknowledged[1] < ShopCategories.Length) ) // 0x00000057 : 0x004F { SendIndex = 0; // 0x00000075 : 0x0075if ( SendIndex < ShopInventory.Length ) // 0x0000007A : 0x007C { ClientReceiveWeapon(SendIndex,ShopInventory[SendIndex].PC,ShopInventory[SendIndex].CatNum); // 0x00000086 : 0x008C Sleep(0.1); // 0x000000A1 : 0x00B7 ++SendIndex; // 0x000000A9 : 0x00BF goto JL007C; // 0x000000AE : 0x00C6 } SendIndex = 0; // 0x000000B1 : 0x00C9if ( SendIndex < ShopCategories.Length ) // 0x000000B6 : 0x00D0 { ClientReceiveCategory(SendIndex,ShopCategories[SendIndex]); // 0x000000C2 : 0x00E0 Sleep(0.1); // 0x000000D2 : 0x00F8 ++SendIndex; // 0x000000DA : 0x0100 goto JL00D0; // 0x000000DF : 0x0107 } ClientSendAcknowledge(); // 0x000000E2 : 0x010A Sleep(1.0); // 0x000000E6 : 0x0110 goto JL004F; // 0x000000EE : 0x0118 }if ( ClientAckSkinNum < CustomChars.Length ) // 0x000000F1 : 0x011B { ClientReceiveChar(CustomChars[ClientAckSkinNum],ClientAckSkinNum); // 0x000000FD : 0x012B Sleep(0.151); // 0x0000010B : 0x0141 goto JL011B; // 0x00000113 : 0x0149 } } GotoState('None'); // 0x00000116 : 0x014C}È äàæå åñëè âû òóò ðàññòàâèòå label, òî êîä íå îòêîìïèëèòñÿ. Áóäåò ïðàâèëüíî òàêAuto state RepSetup{Begin: if( Level.NetMode==NM_Client ) Stop; Sleep(1.f); NetUpdateFrequency = 0.5f; if( NetConnection(StatObject.PlayerOwner.Player)!=None ) // Network client. { // Now MAKE SURE client receives the full inventory list. while( ClientAccknowledged[0]<ShopInventory.Length || ClientAccknowledged[1]<ShopCategories.Length ) { for( SendIndex=0; SendIndex<ShopInventory.Length; ++SendIndex ) { ClientReceiveWeapon(SendIndex,ShopInventory[SendIndex].PC,ShopInventory[SendIndex].CatNum); Sleep(0.1f); } for( SendIndex=0; SendIndex<ShopCategories.Length; ++SendIndex ) { ClientReceiveCategory(SendIndex,ShopCategories[SendIndex]); Sleep(0.1f); } ClientSendAcknowledge(); Sleep(1.f); } // Send client all the custom characters. while( ClientAckSkinNum<CustomChars.Length ) { ClientReceiveChar(CustomChars[ClientAckSkinNum],ClientAckSkinNum); Sleep(0.15f); } } GoToState('');}Çäåñü âñå goto çàìåíåíû íà while è for.
5.
Çäåñü íå âñå îøèáêè, êîòîðûå äîïóñêàåò ïðîãðàììà ïðè äåêîìïèëÿöèè, òðåáóåòñÿ ìíîãî âðåìåíè, òåðïåíèÿ è âíèìàíèÿ, ÷òîá âñå èõ èñïðàâèòü âðó÷íóþ.  îñíîâíîì ïîìîãàþò èñõîäíèêè ñàìîé èãðû, òàì ìîæíî íàéòè ïî÷òè âñå ïåðåìåííûå, ôóíêöèè è òàê äàëåå è ïðîñëåäèòü, ãäå áûëà äîïóùåíà îøèáêà. Åñòü áîëåå ëó÷øèå ïðîãðàììû, ÷åì UT Package Tool, òåì áîëåå îíè áåñïëàòíû, êàê ñî ñâîèìè ïëþñàìè, òàê è ìèíóñû òîæå èìåþòñÿ, â äðóãîé ïðîãðàììå íå íàäî ïðîäåëûâàòü ñòîëüêî ìíîãî ðó÷íîé ðàáîòû, íå íàäî ñàìîìó óæå ïðîïèñûâàòü label, êîïèðîâàòü defaultproperties è òàê äàëåå, íî æóòêî ñìóùàåò îäèí ôàêò, ÷òî îïÿòü æå íå ïðàâèëüíî ðàññòàâëÿåò îêîí÷àíèÿ êàêèõ-íèáóäü öèêëîâ, óñëîâèé, ýòî çíàêè {}, èç-çà ÷åãî êîä ìîæåò îêàçàòüñÿ äàëåêî íå òåì, ÷òî æåëàëè, õîòÿ è ìåíüøå ðàáîòû, à ñ äðóãîé ñòîðîíû â UT Package Tool íàìíîãî áîëüøå ðó÷íîé ðàáîòû, íî â òî âðåìÿ åùå íå ðàçó íå ïîäâîäèë. Åñëè ïûòàòüñÿ äåêîìïèëèòü ïîëíîñòüþ âåñü ñåðâåð, òî ýòî ìîæåò çàíÿòü íåñêîëüêî äíåé, ìîæåò è íåäåëþ òàêèì ñïîñîáîì, çàâèñèò îò ñëîæíîñòè ñàìîãî ñåðâåðà, íî à åñëè ãîâîðèòü î êàêîì-íèáóäü îðóæèè, çîìáè, ñêèíà, òî ìîæíî óïðàâèòüñÿ î÷åíü äàæå áûñòðî, ïðè óñëîâèè, åñëè àíèìàöèÿ íóæíîé èíôîðìàöèè íå óïàêîâàíà â áîëüøîé ïàê, ãäå óäàëåíà èíôîðìàöèÿ î ìåøàõ, ÷òî ïðèâîäèò ê íåâîçìîæíîñòè ðàñïàêîâàòü ïàê è âûòÿíóòü îò òóäà íóæíóþ èíôîðìàöèþ ñ ïîñëåäóþùåé óïàêîâêîé â ñîáñòâåííûé ïàê, íî ýòî òîëüêî îòíîñèòüñÿ ê àíèìàöèè, åñëè è ñóùåñòâóåò ëåêàðñòâî, òî ìíå îíî íå èçâåñòíî. Òàê èëè èíà÷å, ìîæíî â êðàéíåì ñëó÷àå èñïîëüçîâàòü âåñü ïàê, êîòîðûé íåëüçÿ ðàñïàêîâàòü, ïðîñòî íå ìíîãèå ïîéäóò íà òî, ÷òîá èñïîëüçîâàòü îäèí ñêèí èç , ê ïðèìåðó, äåñÿòè, êîòîðûå íàõîäÿòñÿ â ýòîì ïàêå. Êîíå÷íî, ìîæíî ïîïûòàòüñÿ óäàëèòü âñþ íåíóæíóþ èíôîðìàöèþ ñ ïàêà ñðåäñòâàìè Killing Floor SDK, è ñîõðàíèòü òîëüêî íóæíóþ, íî îïÿòü æå, åñëè â ýòîì ïàêå âøèò êëàññ, êîòîðûé ññûëàåòñÿ íà äàííóþ àíèìàöèþ, òî SDK ñêàæåò, ÷òî íå ìîæåò óäàëèòü ìåø, òàê êàê îíà èñïîëüçóåòñÿ.