XC_Engine - XC_GameEngine extension for UT99 by Higor.


===========
Setting up:
===========
** REQUIRES AT LEAST XC_CORE VERSION 6
Place XC_Engine binary in your ~UT/System/ directory.
The new GameEngine we want to load has to be specified in UnrealTournament.ini (or it's server equivalent) as follows.

[Engine.Engine]
;GameEngine=Engine.GameEngine
GameEngine=XC_Engine.XC_GameEngine
;NetworkDevice=IpDrv.TcpNetDriver
NetworkDevice=XC_IpDrv.XC_TcpNetDriver

Be adviced, when editing ServerPackages and ServerActors in a XC_Engine server, find the [XC_Engine.XC_GameEngine] entry!!!
Either remove it (and apply on GameEngine), or apply the changes on said (XC_GameEngine) entry instead.

Safe to use in v436-v451, and on ACE servers since most hacks are reverted during online sessions.
Just avoid AnthChecker servers until they have whitelisted this binary.


=================
Global features:
=================
Note:
(Conditional) Means
- (All) in Linux builds
- (Server, Standalone player) In Win32 builds, auto-disables itself when joining a server.

- (Conditional) Existing functions hooks/replacements in runtime to enhance behaviour and fix bugs.
- (Dedicated Server) Moving Brush Tracker in Dedicated servers, specific maps can be ignored.
- (Server) Ability to send 'undownloadable' maps.
- (All) Makes several properties from native only classes visible to UnrealScript, player commands and edit windows (win32). Below table for more info.
- (All) Timing fix for computers that change CPU frequencies (STILL NEEDS DUALCORE FIX INSTALLED!)
- (Conditional) XC_Core natives have their numbered opcodes enabled for use without package dependancy.
- (Conditional) CollidingActors iterator native. (fixed)
- * (Conditional) Dynamic array support for UnrealScript.
- * (Conditional) AddToPackageMap native, packages supporting this feature can autoregister themselves, no need for dynamic loaders.
- * (Conditional) IsInPackageMap native, checks if a package is sent to clients, also checks if it exclusively belongs to ServerPackages list.
* Code compiled with these opcodes should be cross-compatible with Unreal 227.
- (Server) PreLogin hook allows other actors to deny players from joining servers.
- (Server) TravelManager subsystem providing extended inventory handling for Coop games (don't lose items on reconnect).
- (All) Version 451 GET and SET command functionality.
- (Server, pre v451) AdminLogin hook allows other actors to handle admin login requests based on player, included example handling brute forcing.
- (Server, pre v451) Some v451 lag exploit fixes.
- (Client) Automatic cache conversion to desired directories.
- (All) Collision Grid replacing the old hash, per-actor custom primitives support.
- (All) Cleaner map switch by nulling out transient actor references to the main level.
- (Server) Worked around RELIABLE_BUFFER crash on Windows servers.
- (Server) New Relevancy loop code that allows better visibility checks on actor replication, also fixes a few flaws on net priority.
* Adds bNotRelevantToOwner variable to actors, useful for lag compensators.
- (Server) Basic Net driver protections.
- (Server, Win32) LZMA autocompressor can be run on a separate thread as soon as a map is loaded.
- (All) Lower memory usage and faster map cleanup on long games.
- (Server, experimental) Sliding player bug workaround.

=================
XC_IpDrv
Enhanced Net Driver and file downloaders.
=================
Net Driver:
- ICMP unreachable exploit patched.
- Connection limit, kills dataless connections.
- (Experimental) Can connect to redirects via proxy.

HTTP LZMA file downloader.


================
Extra commands.
Check other documentation files for more commands.
================
- EditObject Name=Objectname Skip=skipcount
Client, Win32 only.
Brings up a property editor dialog of an object with a specified name.
Skip= is optional and can be used to bring up a newer objects with said name.

Example: "EditObject Name=MyLevel Skip=1"
Brings up play level's XLevel properties.

Example: "EditObject Name=MyLevel"
Brings up Entry level's XLevel properties.

- DumpObject Name=Objectname
Dumps object in question's memory block into a file (with the object's name).
Only finds the first object with matching name.
If the object is a UFunction, then it will also save a file name FUNCTIONDATA.bin with the script code (serialized TArray<BYTE>).

- LogFields Name=classname
Logs all of the UnrealScript visible properties of the specified class, with property flags, offset, size and array count.
Boolean properties have their bitmask info logged instead of array size.

- LogClassSizes Outer=packagename(optional)
Prints in log a huge list of classes and their size in memory.
If the Outer=packagename parameter isn't used (or fails), it will print all classes's sizes.

- ToggleTimingFix - TimingFix
Toggles the timing fix on/off.
Timing fix is enabled by default and is saved in [XC_Engine.XC_GameEngine] config entry.

- ToggleDebugLogs - DebugLogs
Toggles additional logging, for developers.
Disabled by default, saved in [XC_Engine.XC_GameEngine] config entry.

- ToggleRelevancy - ToggleRelevant
Requires bUseLevelHook.
Toggles XC_Level relevancy loop on net servers, when enabled:
=> Actor consider list is created once per frame instead of every player check.
=> Visibility checks happen less often on relevant actors.
=> Visibility checks go through most transparent/invisible surfaces.
=> Visibility checks are done against a random point of the actor's box.
=> Player, Viewtarget and Player owned actors are given higher priority.
=> Actors that pass relevancy aren't checked again for a short while.

- PreLoginHook actor_name
For code usage, lets an actor register itself in the PreLoginHooks list.

- AdminLoginHook actor_name
For code usage, lets an actor register itself as the AdminLoginHook actor (overrides previous one).

- OctreeDebug Name=actor_name
Prints FCollisionCacus information for an actor (if contained in the Octree system).

- TimeFactor
Displays the Time Manager's current time scaler, if active.
Values other than 1 (or approximate) indicate that XC_Engine is the one responsible
for keeping your game running at normal speed.



===================
Exposed properties:
===================
Additional properties are now visible on certain native classes and their subclasses, these increase the potential functionality of servers and clients running mods coded to access them via GetPropertyText() or GET commands.
= CLASS -> CPP_PropertyName -> UScript_PropertyName (type) (flags)

- GameEngine		-> GLevel		-> Level   (Level)   (const, editconst)
- GameEngine		-> GEntry		-> Entry   (Level)   (const, editconst)

- DemoRecDriver		-> DemoFileName		-> DemoFileName   (string)   (const, editconst)

- LevelBase		-> NetDriver		-> NetDriver   (obj NetDriver)   (const, editconst)
- LevelBase		-> DemoRecDriver	-> DemoRecDriver   (obj NetDriver)   (const, editconst)
- LevelBase		-> Engine		-> Engine   (obj Engine)   (const, editconst)
- LevelBase		-> URL.Protocol		-> URL_Protocol   (string)   (const, editconst)
- LevelBase		-> URL.Host		-> URL_Host   (string)   (const, editconst)
- LevelBase		-> URL.Port		-> URL_Port   (int)   (const, editconst)
- LevelBase		-> URL.Map		-> URL_Map   (string)   (const, editconst)
- LevelBase		-> URL.Op		-> URL_Options   (array<string>)   (const, editconst)
- LevelBase		-> URL.Portal		-> URL_Portal   (string)   (const, editconst)
- LevelBase		-> Actors.Num()		-> ActorListSize   (int)   (const, editconst)
- Level			-> iFirstDynamicActor	-> iFirstDynamicActor   (int)   (const, editconst)
- Level			-> iFirstNetRelevantActor -> iFirstNetRelevantActor   (int)   (const, editconst)

- NetDriver		-> ClientConnections	-> ClientConnections   (array<obj NetConnection>)   (const, editconst)
- NetDriver		-> ServerConnection	-> ServerConnection   (obj NetConnection)   (const, editconst)

New property:
- Actor			-> bNotRelevantToOwner	->bNotRelevantToOwner   (bool)

====================================
Functions patched/hooked in runtime:
====================================
== *U* means Unrealscript patching
== *N* means Native hook

*N* Actor.GetMapName		-> Cache map list for faster subsequent retrieval, can be sorted globally or by folder.
*N* Actor.PlayerCanSeeMe	-> Crash fix.
*U* PlayerPawn.GetWeapon	-> Subclasses are eligible.
*N* PlayerPawn.ViewClass	-> Lag fix.
*N* PlayerPawn.ViewPlayerNum	-> Lag fix, UTPure method on spectators (parameter is player ID, not team ID).
*N* PlayerPawn.ViewPlayer	-> Partial name search support.
*N* PlayerPawn.TeamSay		-> Support for message macros %w %W %a %A %h %H %z %Z (z=zone)
*U* ScriptedPawn.SetEnemy	-> Monsters attack bots, can be disabled.
*U* Bot.SetOrders		-> ScriptWarning fixed.
*U* Weapon.ForceFire	-> Unreal 1 weapons can be fired in online play.
*U* Weapon.ForceAltFire -> Unreal 1 weapons can be alt-fired in online play.
*U* UT_Eightball.NormalFire.Tick -> ScriptWarning fixed.
*N* ChallengeVoicePack.PlayerSpeech -> Log warning fixes, global response messages (add -1 to bind), player names on some status messages, MonsterHunt uses Domination cues.
*N* UWindowList.Sort		-> Super fast, doesn't crash practice session when map count exceeds ~4000

=============================
Own XC_GameEngine properties:
=============================
- XC_Version   (int)   (const, editconst)
Stored in defaults, accesible via "GET INI:ENGINE.ENGINE.GAMEENGINE XC_VERSION"
Also accesible via "XC_Engine" console command.

- bHackingTracker   (bool)   (const, editconst)
Indicates that XC_GameEngine is handling the moving brush tracker.
Only true in Dedicated servers where the loaded map has movers.

- bDisableTimingFix   (bool)   (config)   (default=false)
Disables timing fix.

- bDisableBrushTracker   (bool)   (config)   (default=false)
Disables XC_Engine's addition of Brush Tracker.

- bSortMaplistByFolder   (bool)   (config)   (default=false)
Sort the map cache alphabetically by folder.

- bSortMaplistGlobal   (bool)   (config)   (default=false)
Sort the entire map cache alphabetically. This overrides the previous setting.

- bAutoTravelManager   (bool)   (config)   (default=true)
TravelManager rebuilds the travel lists every two seconds.

- bCacheConvertAtJoin   (bool)   (config)   (default=false)
Copy and rename cache files from current server into it's corresponding system paths.

- bFasterUpload   (bool)   (config)   (default=true)
Forces a temporary NetSpeed of 1000001 on incoming clients for non-redirected downloads, reverts when finished.
The initial NetSpeed value is stored in ConfiguredNetSpeed during file download.

- bCollisionHashHook   (bool)   (config)   (default=true)
Initializes levels using the FCollisionCacus octree system instead of the FCollisionHash.

- bEnableDebugLogs   (bool)   (config)   (default=false)
Displays additional logs aimed at developers.

- bUseSetEnemyHook   (bool)   (config)   (default=true)
Let user allow XC_Engine to modify UnrealShare.SetEnemy function.

- NoBrushTrackerFix   (array<string>)   (config)
List of maps we want to exclude from using the brush tracker fixer (only works in dedicated server mode), ex (~UT.ini):
NoBrushTrackerFix=CTF-Niven
NoBrushTrackerFix=etc...

- bUseLevelHook   (bool)   (config)   (default=true)
Hooks the level object after map load, allows it to execute XC_Engine code.

- bForceLevelHook   (bool)   (config)   (default=false)
Forces level hook if net client.

- bUseNewRelevancy   (bool)   (config)   (default=true)
Requires bUseLevelHook=True. See: - ToggleRelevancy - ToggleRelevant commands

- PreLoginHooks   (Actor[12])   (const, editconst)
List of actors currently registered on PreLoginHooks.
These actors already passed the checks needed to be in this list.

- AdminLoginHook   (actor)   (const, editconst)
Actor handling AdminLogin requests, already passed the checks needed to function.

- bHTTP_DLMGR   (bool)   (const, editconst)
HTTP Downloader replacer status, only true during join process while retrieving server packages info.

- bAutoCompressLZMA   (bool)   (config)   (default=false)
Spawns a thread to LZMA compress every package loaded by the server.
To be used in conjunction with XC_Core's XC_ChannelDownload.


=================
Credits:
=================
I would like to thank my fellow betatesters
- Chamberly
- ~V~
- Nelsona
- SC]-[LONG_{HoF}
- $carface (and the legions of Siege players)
Would also like to thank:
- AnthRAX, for allowing a linux build to be possible.
- SicilianKill, for that v436 Linux server.

And all of Cham's development server visitors for the help in bugfixing this.
And to the website owners where I downloaded very educational sample codes of Unreal Engine 2 and 3 (lol!)