216 lines
5.2 KiB
Ucode
216 lines
5.2 KiB
Ucode
class ScrnCustomPRI extends LinkedReplicationInfo;
|
|
|
|
var byte BlameCounter;
|
|
var private Material Avatar, ClanIcon, PreNameIcon, PostNameIcon;
|
|
var Color PrefixIconColor, PostfixIconColor;
|
|
var private int TourneyPlayoffs, TourneyWins;
|
|
|
|
var private string SteamID64;
|
|
var private int SteamID32, ClientSteamID32;
|
|
|
|
var private transient byte SteamID64Attempts;
|
|
|
|
//0x0110000100000000 - 76561197960265728
|
|
const SteamUID_Part1 = 76561197;
|
|
const SteamUID_Part2 = 960265728;
|
|
|
|
replication
|
|
{
|
|
reliable if ( bNetDirty && Role == Role_Authority )
|
|
BlameCounter, SteamID32;
|
|
}
|
|
|
|
function PostBeginPlay()
|
|
{
|
|
if ( Level.NetMode == NM_DedicatedServer )
|
|
GotoState('InitPRI');
|
|
}
|
|
|
|
simulated function PostNetReceive()
|
|
{
|
|
super.PostNetReceive();
|
|
|
|
if ( SteamID32 > 0 && SteamID32 != ClientSteamID32 ) {
|
|
ClientSteamID32 = SteamID32;
|
|
SetSteamID32(SteamID32);
|
|
}
|
|
}
|
|
|
|
|
|
// UE2 doesn't support __int64 :(
|
|
final static function int SteamID64_to_32(string sid64)
|
|
{
|
|
local int a, billions;
|
|
|
|
if ( len(sid64) != 17 || left(sid64, 5) != "76561" )
|
|
return 0;
|
|
|
|
billions = int(left(sid64,8)) - SteamUID_Part1;
|
|
a = int(right(sid64,9));
|
|
|
|
if ( a < SteamUID_Part2 ) {
|
|
billions--;
|
|
a += 1000000000;
|
|
}
|
|
a -= SteamUID_Part2;
|
|
|
|
|
|
if ( billions > 4 || (billions == 4 && a >= 294967296) ) { // 2^32
|
|
log("Steam ID too high for 32-bit number: " $ sid64);
|
|
return 0; //
|
|
}
|
|
|
|
if ( billions > 2 || (billions == 2 && a >= 147483648) ) { // 2^31
|
|
// need to set highest (sign) bit to 1
|
|
billions -= 2;
|
|
a -= 147483648;
|
|
a += billions * 1000000000;
|
|
a = a | (1<<31);
|
|
}
|
|
else
|
|
a += billions * 1000000000;
|
|
|
|
return a;
|
|
}
|
|
|
|
final static function string SteamID32_to_64(int sid32)
|
|
{
|
|
local int a, billions;
|
|
local string result;
|
|
|
|
if ( sid32 < 0 ) {
|
|
// negative number mean highest int32 bit is 1 -> 2147483648
|
|
a = sid32 & 0x7FFFFFFF; // unset sign bit
|
|
billions = a / 1000000000;
|
|
a -= billions * 1000000000;
|
|
billions += SteamUID_Part1 + 2;
|
|
a += SteamUID_Part2 + 147483648;
|
|
if ( a > 1000000000 ) {
|
|
billions += a / 1000000000;
|
|
a = a % 1000000000;
|
|
}
|
|
}
|
|
else {
|
|
a = sid32;
|
|
billions = a / 1000000000;
|
|
a -= billions * 1000000000;
|
|
billions += SteamUID_Part1;
|
|
a += SteamUID_Part2;
|
|
if ( a > 1000000000 ) {
|
|
billions++;
|
|
a -= 1000000000;
|
|
}
|
|
}
|
|
result = string(a);
|
|
while ( len(result) < 9 )
|
|
result = "0" $ result;
|
|
result = string(billions) $ result;
|
|
return result;
|
|
}
|
|
|
|
final simulated function SetSteamID64(string value)
|
|
{
|
|
local int a;
|
|
|
|
a = SteamID64_to_32(value);
|
|
if ( a != 0 ) {
|
|
SteamID64 = value;
|
|
SteamID32 = a;
|
|
LoadHighlyDecorated();
|
|
}
|
|
//PlayerController(Owner).ClientMessage("SteamID64="$SteamID64 $ ", SteamID32="$SteamID32);
|
|
}
|
|
function simulated string GetSteamID64()
|
|
{
|
|
return SteamID64;
|
|
}
|
|
|
|
final simulated function SetSteamID32(int value)
|
|
{
|
|
SteamID64 = SteamID32_to_64(value);
|
|
SteamID32 = value;
|
|
LoadHighlyDecorated();
|
|
}
|
|
function simulated int GetSteamID32()
|
|
{
|
|
return SteamID32;
|
|
}
|
|
|
|
final simulated function LoadHighlyDecorated()
|
|
{
|
|
class'ScrnBalance'.static.GetHighlyDecorated(
|
|
SteamID32, Avatar, ClanIcon,
|
|
PreNameIcon, PrefixIconColor, PostNameIcon, PostfixIconColor,
|
|
TourneyPlayoffs, TourneyWins);
|
|
}
|
|
|
|
final static function ScrnCustomPRI FindMe(PlayerReplicationInfo PRI)
|
|
{
|
|
local LinkedReplicationInfo L;
|
|
|
|
if ( PRI == none )
|
|
return none;
|
|
|
|
for( L = PRI.CustomReplicationInfo; L != none; L = L.NextReplicationInfo ) {
|
|
if ( ScrnCustomPRI(L) != none )
|
|
return ScrnCustomPRI(L);
|
|
}
|
|
return none;
|
|
}
|
|
|
|
final simulated function bool IsTourneyMember()
|
|
{
|
|
return TourneyPlayoffs > 0;
|
|
}
|
|
final simulated function int GetPlayoffCount()
|
|
{
|
|
return TourneyPlayoffs;
|
|
}
|
|
final simulated function int GetTourneyWinCount()
|
|
{
|
|
return TourneyWins;
|
|
}
|
|
final simulated function material GetAvatar()
|
|
{
|
|
return Avatar;
|
|
}
|
|
final simulated function material GetClanIcon()
|
|
{
|
|
return ClanIcon;
|
|
}
|
|
final simulated function material GetSpecialIcon()
|
|
{
|
|
if ( Avatar != none )
|
|
return Avatar;
|
|
return ClanIcon;
|
|
}
|
|
final simulated function material GetPreNameIcon()
|
|
{
|
|
return PreNameIcon;
|
|
}
|
|
final simulated function material GetPostNameIcon()
|
|
{
|
|
return PostNameIcon;
|
|
}
|
|
|
|
|
|
state InitPRI
|
|
{
|
|
Begin:
|
|
while ( ++SteamID64Attempts <= 120 ) {
|
|
sleep(1); // give time to execute PostLogin() and set SteamID64
|
|
SteamID64 = PlayerController(Owner).GetPlayerIDHash();
|
|
if ( len(SteamID64) == 17 && left(SteamID64, 5) == "76561" ) {
|
|
SetSteamID64(SteamID64);
|
|
NetUpdateTime = Level.TimeSeconds - 1;
|
|
break;
|
|
}
|
|
}
|
|
GotoState('');
|
|
}
|
|
|
|
defaultproperties
|
|
{
|
|
bNetNotify=True
|
|
}
|