Mirrors Edge - MonsOlympus - 05-23-2012
Im not sure entirely whats going on here but there is alot of decompiler output in the scripts in tdgame.u and there is alot of script missing.
sample:
Code: event Activated()
{
local UIScene LocalScene;
local WorldInfo WI;
local TdPlayerController PC;
local int CurrentDifficulty;
local TdProfileSettings Profile;
WI = GetWorldInfo();
// End:0x58 Loop:False
if(class<TdSPLevelRace>(WI.switch(return @NULL) != none != ) != @NULL.@NULL) != @NULL || return)
{
{
{
{
{
{
}
}
}
// Failed to decompile this line:
/* JumpIfNotToken
NativeFunctionToken NativeFunctionToken MetaCastToken ContextToken
ContextToken LocalVariableToken NativeFunctionToken NativeFunctionToken
SwitchToken ReturnToken LocalVariableToken NativeFunctionToken
NoObjectToken EndFunctionParmsToken SkipToken NativeFunctionToken
MetaCastToken ContextToken ContextToken LocalVariableToken
NativeFunctionToken NativeFunctionToken SwitchToken ReturnToken
LocalVariableToken NativeFunctionToken NoObjectToken EndFunctionParmsToken
EndFunctionParmsToken ReturnToken NothingToken IteratorToken
ContextToken LocalVariableToken NativeFunctionToken NativeFunctionToken
ObjectConstToken LocalVariableToken EndFunctionParmsToken NativeFunctionToken
LocalVariableToken LocalVariableToken UnknownExprToken LocalVariableToken
LocalVariableToken LocalVariableToken EndFunctionParmsToken ContextToken
LocalVariableToken LocalVariableToken LocalVariableToken NativeFunctionToken
UnknownExprToken LocalVariableToken LocalVariableToken UnknownExprToken
LocalVariableToken SkipToken ContextToken LocalVariableToken
LocalVariableToken LocalVariableToken LocalVariableToken LocalVariableToken
LocalVariableToken NativeFunctionToken NativeFunctionToken NativeFunctionToken
JumpToken LocalVariableToken NativeFunctionToken EndFunctionParmsToken
LetToken InstanceVariableToken VirtualFunctionToken EndFunctionParmsToken
JumpIfNotToken NativeFunctionToken InstanceVariableToken NoObjectToken
EndFunctionParmsToken LetToken LocalVariableToken ContextToken
InstanceVariableToken NativeFunctionToken NativeFunctionToken NameConstToken
InstanceVariableToken EndFunctionParmsToken JumpIfNotToken NativeFunctionToken
LocalVariableToken NoObjectToken EndFunctionParmsToken FinalFunctionToken
EndFunctionParmsToken JumpToken LetDelegateToken ContextToken
LocalVariableToken NativeFunctionToken NativeFunctionToken DelegatePropertyToken
LocalVariableToken LocalVariableToken LocalVariableToken LocalVariableToken
NoParmToken NoParmToken EndFunctionParmsToken ReturnToken
NothingToken */
// Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
}
RE: Mirrors Edge - eliot - 05-23-2012
That looks funky Could you send me this file? I don't have Mirrors Edge installed anymore :/
RE: Mirrors Edge - MonsOlympus - 05-27-2012
Well its not just the one its the entire package that comes up with all these decompiler dumps in the scripts. Would you like me to send the scripts or the package?
RE: Mirrors Edge - eliot - 05-28-2012
I'd like the Core.u and Engine.u to ensure that it works.
RE: Mirrors Edge - MonsOlympus - 05-29-2012
[REMOVED]
Here you go, this should be everything you need.
RE: Mirrors Edge - eliot - 12-14-2012
Thanks!
This is fixed in 1.2.
RE: Mirrors Edge - qualia - 08-27-2014
Hello
I´ve been messing with "Gears of War PC" lately, and I keep bumping into very similar line:
"....
// Failed to decompile this line:
/* ReturnToken NothingToken */
// Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
...."
i.e.:
Code: /*******************************************************************************
* WarCombatAction_Wretch_Melee generated by Eliot.UELib using UE Explorer.
* Eliot.UELib © 2009-2014 Eliot van Uytfanghe. All rights reserved.
* http://eliotvu.com
*
* All rights belong to their respective owners.
*******************************************************************************/
class WarCombatAction_Wretch_Melee extends WarCombatAction_Melee
config(AI)
hidecategories(Navigation,Movement,Collision);
static function NotifyReceivedDamage(WarAI_Drone AI, int Damage, Pawn DamageInstigator, Vector LastInstigatorLoc)
{
local class<WarCombatAction> Action;
local bool bLightDamage, bHeavyDamage;
local float Pct, EvadeChance;
bLightDamage = AI.DamageReceivedInAction > (default.LightDamagePercentage * float(AI.MyWP.DefaultHealth));
bHeavyDamage = AI.DamageReceivedInAction > (default.HeavyDamagePercentage * float(AI.MyWP.DefaultHealth));
// End:0x194
if(AI.MyWP.SpecialMove == 0)
{
// End:0x105
if(bHeavyDamage && GetActionAndCover(AI, 'EvaluateCover_Fallback', class'WarCombatAction_Retreat', Action, string(default.Class) @ string(GetFuncName())))
{
AI.TransitionTo(Action, "Received heavy damage");
goto J0x194;
// End:0x194
if((bLightDamage && DamageInstigator != none) && AI.CanEvade())
{
}
EvadeChance = 0.250;
Pct = FRand();
// End:0x194
if(Pct < EvadeChance)
{
AI.DoEvade(AI.GetBestEvadeDir(AI.MyWP.Location, DamageInstigator), true);
//return;
// Failed to decompile this line:
/* ReturnToken NothingToken */
// Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
}
}
}
}
defaultproperties
{
Components(0)=SpriteComponent'Default__WarCombatAction_Wretch_Melee.Sprite'
}
or
Code: /*******************************************************************************
* Pawn_GeistWretch generated by Eliot.UELib using UE Explorer.
* Eliot.UELib © 2009-2014 Eliot van Uytfanghe. All rights reserved.
* http://eliotvu.com
*
* All rights belong to their respective owners.
*******************************************************************************/
class Pawn_GeistWretch extends WarPawn
abstract
native
config(Pawn)
hidecategories(Navigation);
var bool bWaitForKnockOff;
var bool bSuicidal;
var bool bFleshTimer;
var WarPawn Victim;
var float LeapSpeed;
var repnotify Vector ReplicatedFloor;
replication
{
// Pos:0x000
if(Physics == 8)
ReplicatedFloor
}
simulated function Destroyed()
{
super.Destroyed();
// End:0x2C
if(Victim != none)
{
Victim.StopAllBodyStances(0.250);
Victim = none;
}
//return;
}
simulated function KnockDownFromExplosion()
{
//return;
}
simulated function CringeFromExplosion()
{
//return;
}
function bool WarDied(Controller Killer, class<WarDamageType> WarDamageType, Vector HitLocation, WarPawn.EWarDeathType DeathType)
{
// End:0x6A
if((Victim != none) && WarPC(Victim.Controller) != none)
{
WarPC(Victim.Controller).IgnoreMoveInput(false);
WarPC(Victim.Controller).IgnoreLookInput(false);
DeathCry();
return super.WarDied(Killer, WarDamageType, HitLocation, DeathType);
}
//return ReturnValue;
}
simulated function DeathCry()
{
//return;
}
simulated function UpdateMeshBoneControllers(float DeltaTime)
{
//return;
}
function bool DoWallLeap(Actor Target)
{
local Vector JumpVel;
// End:0xD8
if((!bIsCrouched && !bWantsToCrouch) && (Physics == 1) || Physics == 8)
{
// End:0xA4
if(Role == ROLE_Authority)
{
// End:0xA4
if((WorldInfo.Game != none) && WorldInfo.Game.GameDifficulty > float(2))
{
MakeNoise(0.10 * WorldInfo.Game.GameDifficulty);
}
}
SuggestJumpVelocity(JumpVel, Target.Location, Location);
Velocity = JumpVel;
SetPhysics(2);
return true;
return false;
//return ReturnValue;
}
}
function bool SpecialMoveTo(NavigationPoint Start, NavigationPoint End, Actor Next)
{
local ReachSpec CurrentPath;
// End:0x11
if(Start == End)
{
return false;
}
CurrentPath = Start.GetReachSpecTo(End);
// End:0x93
if(CurrentPath != none)
{
// End:0x66
if(CurrentPath.IsA('WallTransReachSpec'))
{
return SpecialMoveTo_WallTrans(Start, End, true);
goto J0x93;
// End:0x93
if(CurrentPath.IsA('FloorToCeilingReachSpec'))
{
}
return SpecialMoveTo_CeilingTrans(Start, End, true);
return super.SpecialMoveTo(Start, End, Next);
}
}
J0x93:
//return ReturnValue;
}
function bool SpecialMoveTo_WallTrans(NavigationPoint Start, NavigationPoint End, bool bDirect)
{
DoWallLeap(End);
Controller.bPreparingMove = true;
return true;
//return ReturnValue;
}
function bool SpecialMoveTo_CeilingTrans(NavigationPoint Start, NavigationPoint End, bool bDirect)
{
local WarAI_Wretch AI;
AI = WarAI_Wretch(Controller);
// End:0x34
if(AI != none)
{
AI.PushState('SubAction_CeilingTransition');
return true;
//return ReturnValue;
}
}
simulated function HitWall(Vector HitNormal, Actor Wall, PrimitiveComponent WallComp)
{
super(Pawn).HitWall(HitNormal, Wall, WallComp);
// End:0x5C
if(IsDoingSpecialMove(58) && HitNormal.Z <= -WalkableFloorZ)
{
SetPhysics(8);
SetBase(Wall, HitNormal);
PlayLandedOnWallSound();
//return;
}
}
simulated event ReplicatedEvent(name VarName)
{
// End:0x21
if(VarName == 'ReplicatedFloor')
{
Floor = ReplicatedFloor;
goto J0x2C;
super.ReplicatedEvent(VarName);
}
//return;
// Failed to decompile this line:
/* ReturnToken
NothingToken */
// Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
}
function bool ShouldDealDamageToEnemy()
{
local Vector VectToEnemy;
VectToEnemy = Controller.Enemy.Location - Location;
// End:0x69
if(VSize(VectToEnemy) > ((CylinderComponent.CollisionRadius + Controller.Enemy.CylinderComponent.CollisionRadius) * 2.50))
{
return false;
}
// End:0x85
if((Normal(VectToEnemy) Dot vector(Rotation)) < 0.0)
{
return false;
}
return true;
//return ReturnValue;
}
function DoPounceAttackDamage()
{
local Weap_WretchMelee Wpn;
// End:0x72
if(IsDoingSpecialMove(55) && ShouldDealDamageToEnemy())
{
Wpn = Weap_WretchMelee(Weapon);
// End:0x72
if(Wpn != none)
{
Wpn.DoMeleeDamage(Controller.Enemy, Controller.Enemy.Location, 0.50);
//return;
}
}
}
function DoSwipeAttackDamage()
{
local Weap_WretchMelee Wpn;
// End:0x72
if(IsDoingSpecialMove(56) && ShouldDealDamageToEnemy())
{
Wpn = Weap_WretchMelee(Weapon);
// End:0x72
if(Wpn != none)
{
Wpn.DoMeleeDamage(Controller.Enemy, Controller.Enemy.Location, 1.0);
//return;
}
}
}
function DoScreamEffect()
{
local WarPC PC;
// End:0x46
if(IsDoingSpecialMove(57))
{
// End:0x28
foreach WorldInfo.AllControllers(class'WarPC', PC)
{
}
SetTimer(0.50, true, 'LoopScreamEffect');
LoopScreamEffect();
//return;
}
}
function LoopScreamEffect()
{
local WarPawn P;
// End:0xDD
if(IsDoingSpecialMove(57))
{
// End:0xD9
foreach WorldInfo.AllPawns(class'WarPawn', P)
{
// End:0xD8
if(((GetTeam()) != P.GetTeam()) && VSize2D(P.Location - Location) <= 256.0)
{
// End:0xD8
if(P.CanCoverHead() == true)
{
// End:0xB6
if(P.IsHumanControlled())
{
P.DoSpecialMove(26);
goto J0xD8;
P.Controller.PushState('SubAction_CoverHead');
}
goto J0xED;
ClearTimer('LoopScreamEffect');
//return;
// Failed to decompile this line:
/* ReturnToken NothingToken
*/
// Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
}
}
}
}
}
function SoundCue GetSpecificFootStepSound(WarPhysicalMaterialFootSteps FootStepSounds, int FootDown)
{
local SoundCue retval;
// End:0x22
if(FootDown <= 1)
{
retval = FootStepSounds.WretchFootSteps;
}
// End:0x36
else
{
retval = FootStepSounds.WretchHandSteps;
}
return retval;
//return ReturnValue;
}
function PlayFleshSound()
{
bFleshTimer = false;
//return;
}
function SoundCue GetSpecificLandingSound(WarPhysicalMaterialFootSteps FootStepSounds, int FootDown)
{
return GetSpecificFootStepSound(FootStepSounds, FootDown);
//return ReturnValue;
}
function SoundCue GetSpecificSlidingSound(WarPhysicalMaterialFootSteps FootStepSounds)
{
return FootStepSounds.LocustSliding;
//return ReturnValue;
}
simulated function bool CanEngageMelee()
{
return true;
//return ReturnValue;
}
function PlayLandedOnWallSound()
{
//return;
}
function PlayLeapSound()
{
//return;
}
function PlaySwipeAttackSound()
{
//return;
}
function PlaySwipeAttackHitSound()
{
//return;
}
function PlaySwipeAttackMissSound()
{
//return;
}
function PlayLandedOnEnemySound()
{
//return;
}
singular simulated function BaseChange()
{
local WarInterActorAttachableBase Cart;
// End:0x151
if(Role == ROLE_Authority)
{
// End:0x51
if((Base == none) && Physics == 0)
{
// End:0x4E
if(!IsDoingSpecialMove(58) && !IsDoingSpecialMove(59))
{
SetPhysics(2);
}
}
// End:0x11D
else
{
// End:0x11D
if((Pawn(Base) != none) && (DrivenVehicle == none) || !DrivenVehicle.IsBasedOn(Base))
{
// End:0x11D
if(!Pawn(Base).CanBeBaseForPawn(self))
{
Base.TakeDamage(int(((float(1) - (Velocity.Z / float(400))) * Mass) / Pawn(Base).Mass), Controller, Location, 0.50 * Velocity, class'DmgType_Crushed');
JumpOffPawn();
Cart = WarInterActorAttachableBase(Base);
}
}
}
// End:0x151
if(Cart != none)
{
Controller.PushState('SubAction_ClimbCart');
// End:0x185
if(Base != none)
{
// End:0x17A
if(Role == ROLE_Authority)
{
}
}
ReplicatedFloor = Floor;
goto J0x185;
Floor = ReplicatedFloor;
//return;
// Failed to decompile this line:
/* ReturnToken
NothingToken */
// Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
}
}
}
function SetMovementPhysics()
{
// End:0x12
if(WarInterActorAttachableBase(Base) != none)
{
return;
}
super.SetMovementPhysics();
//return;
}
simulated function AttachWeaponToHand(WarWeapon Weap)
{
//return;
}
simulated function AttachWeaponToSlot(WarWeapon W)
{
//return;
}
simulated function AdjustWeaponDueToMirror()
{
//return;
}
simulated function PlayScreamSound()
{
//return;
}
state Dying
{
simulated function BeginState(name PreviousStateName)
{
DoSpecialMove(0);
super.BeginState(PreviousStateName);
//return;
}
stop;
}
defaultproperties
{
LeapSpeed=600.0
SpecialMoveClasses(0)=none
SpecialMoveClasses(1)=class'WarSpecialMove_Wretch_MidLvlJumpOver'
SpecialMoveClasses(2)=none
SpecialMoveClasses(3)=none
SpecialMoveClasses(4)=none
SpecialMoveClasses(5)=none
SpecialMoveClasses(6)=none
SpecialMoveClasses(7)=none
SpecialMoveClasses(8)=class'WarSpecialMove_Wretch_EvadeFwd'
SpecialMoveClasses(9)=class'WarSpecialMove_Wretch_EvadeBwd'
SpecialMoveClasses(10)=class'WarSpecialMove_Wretch_EvadeLt'
SpecialMoveClasses(11)=class'WarSpecialMove_Wretch_EvadeRt'
SpecialMoveClasses(12)=class'WarSpecialMove_Wretch_Run2Cover'
SpecialMoveClasses(13)=class'WarSpecialMove_Wretch_Run2Cover'
SpecialMoveClasses(14)=none
SpecialMoveClasses(15)=none
SpecialMoveClasses(16)=none
SpecialMoveClasses(17)=none
SpecialMoveClasses(18)=none
SpecialMoveClasses(19)=none
SpecialMoveClasses(20)=none
SpecialMoveClasses(21)=none
SpecialMoveClasses(22)=none
SpecialMoveClasses(23)=none
SpecialMoveClasses(24)=none
SpecialMoveClasses(25)=none
SpecialMoveClasses(26)=none
SpecialMoveClasses(27)=none
SpecialMoveClasses(28)=none
SpecialMoveClasses(29)=class'WarSpecialMove_Emerge'
SpecialMoveClasses(30)=class'WarSpecialMove_Emerge'
SpecialMoveClasses(31)=none
SpecialMoveClasses(32)=class'WarSpecialMove_DeathAnim'
SpecialMoveClasses(33)=none
SpecialMoveClasses(34)=none
SpecialMoveClasses(35)=class'WarSpecialMove_Wretch_ChainsawVictim'
SpecialMoveClasses(36)=none
SpecialMoveClasses(37)=none
SpecialMoveClasses(38)=none
SpecialMoveClasses(39)=none
SpecialMoveClasses(40)=none
SpecialMoveClasses(41)=none
SpecialMoveClasses(42)=none
SpecialMoveClasses(43)=none
SpecialMoveClasses(44)=none
SpecialMoveClasses(45)=none
SpecialMoveClasses(46)=none
SpecialMoveClasses(47)=none
SpecialMoveClasses(48)=none
SpecialMoveClasses(49)=none
SpecialMoveClasses(50)=none
SpecialMoveClasses(51)=none
SpecialMoveClasses(52)=none
SpecialMoveClasses(53)=none
SpecialMoveClasses(54)=none
SpecialMoveClasses(55)=class'WarSpecialMove_Wretch_PounceAttack'
SpecialMoveClasses(56)=class'WarSpecialMove_Wretch_SwipeAttack'
SpecialMoveClasses(57)=class'WarSpecialMove_Wretch_Scream'
SpecialMoveClasses(58)=class'WarSpecialMove_Wretch_LeapToCeiling'
SpecialMoveClasses(59)=class'WarSpecialMove_Wretch_DropFromCeiling'
SpecialMoveClasses(60)=class'WarSpecialMove_Wretch_CartClimb'
SpecialMoveClasses(61)=class'WarSpecialMove_Wretch_CartAttack'
SpecialMoveClasses(62)=class'WarSpecialMove_Wretch_ElevatorClimb'
bCanRoadieRun=false
bBlockCamera=false
DefaultInventory(0)=class'Weap_WretchMelee'
DefaultHealth=150
HealthRechargeDelay=0.0
HealthRechargePercentPerSecond=0.0
LocDmgArray(0)=(BoneNameArray=(b_W_Head),BodyPartName=head,fDamageMultiplier=2.0)
LocDmgArray(1)=(BoneNameArray=(b_W_Thigh_L,b_W_Calf_L,b_W_Foot_L),BodyPartName=LeftLeg,fDamageMultiplier=1.0)
LocDmgArray(2)=(BoneNameArray=(b_W_Thigh_R,b_W_Calf_R,b_W_Foot_R),BodyPartName=RightLeg,fDamageMultiplier=1.0)
NeckBoneName=b_W_Neck
PelvisBoneName=b_W_Pelvis
MeleeDamageBoneName=b_W_Spine_02
MinTimeBetweenEvades=2.50
AimAttractors(0)=(OuterRadius=128.0,InnerRadius=32.0,BoneName=b_W_Clavicle_L_)
AimAttractors(1)=(OuterRadius=96.0,InnerRadius=32.0,BoneName=b_W_Head)
FacialAudioComp=AudioComponent'Default__Pawn_GeistWretch.FaceAudioComponent'
HeadIcon=(Texture=Texture2D'Warfare_HUD.HUD_Heads',U=441.0,UL=48.0,VL=63.0)
LightEnvironment=DynamicLightEnvironmentComponent'Default__Pawn_GeistWretch.MyLightEnvironment'
CameraNoRenderCylinder_High=(Radius=50.0,Height=60.0)
CameraNoRenderCylinder_Low=(Radius=50.0,Height=60.0)
bDirectHitWall=true
bCanMantle=true
bCanClimbCeilings=true
bCanSwatTurn=false
bModifyReachSpecCost=true
JumpZ=2100.0
MaxFallSpeed=20000.0
ControllerClass=class'WarAI_Wretch'
begin object name=WarPawnMesh class=SkeletalMeshComponent
LightEnvironment=DynamicLightEnvironmentComponent'Default__Pawn_GeistWretch.MyLightEnvironment'
object end
// Reference: SkeletalMeshComponent'Default__Pawn_GeistWretch.WarPawnMesh'
Mesh=WarPawnMesh
begin object name=CollisionCylinder class=CylinderComponent
CollisionHeight=52.0
object end
// Reference: CylinderComponent'Default__Pawn_GeistWretch.CollisionCylinder'
CylinderComponent=CollisionCylinder
begin object name=CollisionCylinder class=CylinderComponent
CollisionHeight=52.0
object end
// Reference: CylinderComponent'Default__Pawn_GeistWretch.CollisionCylinder'
Components(0)=CollisionCylinder
Components(1)=ArrowComponent'Default__Pawn_GeistWretch.Arrow'
Components(2)=DynamicLightEnvironmentComponent'Default__Pawn_GeistWretch.MyLightEnvironment'
begin object name=WarPawnMesh class=SkeletalMeshComponent
LightEnvironment=DynamicLightEnvironmentComponent'Default__Pawn_GeistWretch.MyLightEnvironment'
object end
// Reference: SkeletalMeshComponent'Default__Pawn_GeistWretch.WarPawnMesh'
Components(3)=WarPawnMesh
Components(4)=AudioComponent'Default__Pawn_GeistWretch.FaceAudioComponent'
begin object name=CollisionCylinder class=CylinderComponent
CollisionHeight=52.0
object end
// Reference: CylinderComponent'Default__Pawn_GeistWretch.CollisionCylinder'
CollisionComponent=CollisionCylinder
RotationRate=(Pitch=100000,Yaw=100000,Roll=100000)
}
These are just examples: its found in many different scripts across the entire codebase. Its the same in version 1.2.2.1 and also in 1.2.6.0. Other games I´ve tried (GoW3, GoWJ, BatmanAA, UDK) do not have such errors (or any AFAIK?).
If its not an issue or a bug within the UE Eplorer, please excuse my ignorance. I´m not a programmer, just very curious and still very new to the entire concept...
Thank you for any information on this.
RE: Mirrors Edge - eliot - 09-14-2014
(08-27-2014, 12:27 AM)qualia Wrote: Hello
I´ve been messing with "Gears of War PC" lately, and I keep bumping into very similar line:
"....
// Failed to decompile this line:
/* ReturnToken NothingToken */
// Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
...."
i.e.:
or
These are just examples: its found in many different scripts across the entire codebase. Its the same in version 1.2.2.1 and also in 1.2.6.0. Other games I´ve tried (GoW3, GoWJ, BatmanAA, UDK) do not have such errors (or any AFAIK?).
If its not an issue or a bug within the UE Eplorer, please excuse my ignorance. I´m not a programmer, just very curious and still very new to the entire concept...
Thank you for any information on this.
Definitely a bug with the deserializing of GoW PC packages.
The following error:
Code: //return;
// Failed to decompile this line:
/* ReturnToken NothingToken */
// Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
Equals to not a big deal if you ask me. I've also noticed other decompilation issues in your examples, where some some code statements are outside of their if, foreach nests, which is also a bug caused by the difference of storage and memory code offset sizes in some games such as GoW PC, overall still quite readable code!, thanks for reporting this issue as I was not aware this one still existed for GoW PC (a lot of games tend to have these issues for the exact same reason which I have to fix specifically as their developers may have made inside changes to the engine that UE Explorer isn't aware of yet).
RE: Mirrors Edge - qualia - 06-16-2015
Thank you for this awesome tool and all the work you put into it. It´s really awesome and amazing! I´m very excited about the next version. Best of luck
|