* Added password change support (references #95)
* Fixed 64bit support * Repaired line endings * Bumped protocol version
This commit is contained in:
		
							parent
							
								
									9676549ac3
								
							
						
					
					
						commit
						829a604c30
					
				@ -17,11 +17,11 @@
 | 
			
		||||
    <VersionInfo>
 | 
			
		||||
      <UseVersionInfo Value="True"/>
 | 
			
		||||
      <MinorVersionNr Value="6"/>
 | 
			
		||||
      <RevisionNr Value="3"/>
 | 
			
		||||
      <BuildNr Value="241"/>
 | 
			
		||||
      <StringTable CompanyName="AKS DataBasis" ProductName="CentrED" InternalName="CentrED" LegalCopyright="(c) 2012 Andreas Schneider" ProductVersion="0.6.3" FileDescription="UO CentrED" OriginalFilename="CentrED.exe"/>
 | 
			
		||||
      <RevisionNr Value="4"/>
 | 
			
		||||
      <BuildNr Value="245"/>
 | 
			
		||||
      <StringTable CompanyName="AKS DataBasis" FileDescription="UO CentrED" InternalName="CentrED" LegalCopyright="(c) 2013 Andreas Schneider" OriginalFilename="CentrED.exe" ProductName="CentrED" ProductVersion="0.6.4"/>
 | 
			
		||||
    </VersionInfo>
 | 
			
		||||
    <BuildModes Count="3">
 | 
			
		||||
    <BuildModes Count="4">
 | 
			
		||||
      <Item1 Name="default" Default="True"/>
 | 
			
		||||
      <Item2 Name="Release Win32">
 | 
			
		||||
        <MacroValues Count="1">
 | 
			
		||||
@ -127,9 +127,61 @@
 | 
			
		||||
          </Other>
 | 
			
		||||
        </CompilerOptions>
 | 
			
		||||
      </Item3>
 | 
			
		||||
      <Item4 Name="Release Linux GTK2 x64">
 | 
			
		||||
        <MacroValues Count="1">
 | 
			
		||||
          <Macro2 Name="LCLWidgetType" Value="gtk2"/>
 | 
			
		||||
        </MacroValues>
 | 
			
		||||
        <CompilerOptions>
 | 
			
		||||
          <Version Value="11"/>
 | 
			
		||||
          <Target>
 | 
			
		||||
            <Filename Value="../bin/CentrED"/>
 | 
			
		||||
          </Target>
 | 
			
		||||
          <SearchPaths>
 | 
			
		||||
            <IncludeFiles Value="$(ProjOutDir);../Imaging;.."/>
 | 
			
		||||
            <OtherUnitFiles Value="..;../UOLib;../MulProvider;../Imaging;../Imaging/JpegLib;../Imaging/ZLib;Tools"/>
 | 
			
		||||
            <UnitOutputDirectory Value="../obj/$(TargetCPU)-$(TargetOS)"/>
 | 
			
		||||
            <SrcPath Value="$(LazarusDir)/lcl;$(LazarusDir)/lcl/interfaces/$(LCLWidgetType);..;../UOLib;../MulProvider;../Imaging;../Imaging/JpegLib;../Imaging/ZLib;Tools"/>
 | 
			
		||||
          </SearchPaths>
 | 
			
		||||
          <Parsing>
 | 
			
		||||
            <SyntaxOptions>
 | 
			
		||||
              <CStyleOperator Value="False"/>
 | 
			
		||||
            </SyntaxOptions>
 | 
			
		||||
          </Parsing>
 | 
			
		||||
          <CodeGeneration>
 | 
			
		||||
            <SmartLinkUnit Value="True"/>
 | 
			
		||||
            <TargetCPU Value="x86_64"/>
 | 
			
		||||
            <TargetOS Value="linux"/>
 | 
			
		||||
            <Optimizations>
 | 
			
		||||
              <OptimizationLevel Value="3"/>
 | 
			
		||||
            </Optimizations>
 | 
			
		||||
          </CodeGeneration>
 | 
			
		||||
          <Linking>
 | 
			
		||||
            <Debugging>
 | 
			
		||||
              <GenerateDebugInfo Value="False"/>
 | 
			
		||||
              <UseLineInfoUnit Value="False"/>
 | 
			
		||||
              <StripSymbols Value="True"/>
 | 
			
		||||
            </Debugging>
 | 
			
		||||
            <LinkSmart Value="True"/>
 | 
			
		||||
            <Options>
 | 
			
		||||
              <Win32>
 | 
			
		||||
                <GraphicApplication Value="True"/>
 | 
			
		||||
              </Win32>
 | 
			
		||||
            </Options>
 | 
			
		||||
          </Linking>
 | 
			
		||||
          <Other>
 | 
			
		||||
            <CompilerMessages>
 | 
			
		||||
              <IgnoredMessages idx4079="True" idx4080="True" idx4081="True" idx5024="True" idx5028="True"/>
 | 
			
		||||
              <UseMsgFile Value="True"/>
 | 
			
		||||
            </CompilerMessages>
 | 
			
		||||
            <CustomOptions Value="-FE../bin/
 | 
			
		||||
-dNoLogging"/>
 | 
			
		||||
            <CompilerPath Value="$(CompPath)"/>
 | 
			
		||||
          </Other>
 | 
			
		||||
        </CompilerOptions>
 | 
			
		||||
      </Item4>
 | 
			
		||||
      <SharedMatrixOptions Count="2">
 | 
			
		||||
        <Item1 ID="851019893220" Modes="Release Win32" Type="IDEMacro" MacroName="LCLWidgetType" Value="win32"/>
 | 
			
		||||
        <Item2 ID="521965364444" Modes="Release Linux GTK2 x86" Type="IDEMacro" MacroName="LCLWidgetType" Value="gtk2"/>
 | 
			
		||||
        <Item2 ID="521965364444" Modes="Release Linux GTK2 x86,Release Linux GTK2 x64" Type="IDEMacro" MacroName="LCLWidgetType" Value="gtk2"/>
 | 
			
		||||
      </SharedMatrixOptions>
 | 
			
		||||
    </BuildModes>
 | 
			
		||||
    <PublishOptions>
 | 
			
		||||
@ -172,7 +224,7 @@
 | 
			
		||||
        <MinVersion Major="4" Minor="5" Release="1" Valid="True"/>
 | 
			
		||||
      </Item6>
 | 
			
		||||
    </RequiredPackages>
 | 
			
		||||
    <Units Count="48">
 | 
			
		||||
    <Units Count="49">
 | 
			
		||||
      <Unit0>
 | 
			
		||||
        <Filename Value="CentrED.lpr"/>
 | 
			
		||||
        <IsPartOfProject Value="True"/>
 | 
			
		||||
@ -190,6 +242,7 @@
 | 
			
		||||
        <Filename Value="UdmNetwork.pas"/>
 | 
			
		||||
        <IsPartOfProject Value="True"/>
 | 
			
		||||
        <ComponentName Value="dmNetwork"/>
 | 
			
		||||
        <HasResources Value="True"/>
 | 
			
		||||
        <ResourceBaseClass Value="DataModule"/>
 | 
			
		||||
        <UnitName Value="UdmNetwork"/>
 | 
			
		||||
      </Unit2>
 | 
			
		||||
@ -197,6 +250,7 @@
 | 
			
		||||
        <Filename Value="UfrmLogin.pas"/>
 | 
			
		||||
        <IsPartOfProject Value="True"/>
 | 
			
		||||
        <ComponentName Value="frmLogin"/>
 | 
			
		||||
        <HasResources Value="True"/>
 | 
			
		||||
        <ResourceBaseClass Value="Form"/>
 | 
			
		||||
        <UnitName Value="UfrmLogin"/>
 | 
			
		||||
      </Unit3>
 | 
			
		||||
@ -455,6 +509,14 @@
 | 
			
		||||
        <IsPartOfProject Value="True"/>
 | 
			
		||||
        <UnitName Value="UContnrExt"/>
 | 
			
		||||
      </Unit47>
 | 
			
		||||
      <Unit48>
 | 
			
		||||
        <Filename Value="UfrmChangePassword.pas"/>
 | 
			
		||||
        <IsPartOfProject Value="True"/>
 | 
			
		||||
        <ComponentName Value="frmChangePassword"/>
 | 
			
		||||
        <HasResources Value="True"/>
 | 
			
		||||
        <ResourceBaseClass Value="Form"/>
 | 
			
		||||
        <UnitName Value="UfrmChangePassword"/>
 | 
			
		||||
      </Unit48>
 | 
			
		||||
    </Units>
 | 
			
		||||
  </ProjectOptions>
 | 
			
		||||
  <CompilerOptions>
 | 
			
		||||
 | 
			
		||||
@ -141,6 +141,7 @@ initialization
 | 
			
		||||
  //$06-$0B --> handled by TLandscape
 | 
			
		||||
  //$0C --> ClientHandling, done by TfrmMain
 | 
			
		||||
  //$0D --> RadarMapHandling, done by TfrmRadarMap
 | 
			
		||||
  //$0E --> LargeScaleCommands, done by TfrmLargeScaleCommands
 | 
			
		||||
finalization
 | 
			
		||||
  for i := 0 to $FF do
 | 
			
		||||
    if PacketHandlers[i] <> nil then
 | 
			
		||||
 | 
			
		||||
@ -21,7 +21,7 @@
 | 
			
		||||
 * CDDL HEADER END
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 *      Portions Copyright 2009 Andreas Schneider
 | 
			
		||||
 *      Portions Copyright 2013 Andreas Schneider
 | 
			
		||||
 *)
 | 
			
		||||
unit UPackets;
 | 
			
		||||
 | 
			
		||||
@ -134,6 +134,12 @@ type
 | 
			
		||||
    constructor Create(AUsername: string);
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
  { TChangePasswordPacket }
 | 
			
		||||
 | 
			
		||||
  TChangePasswordPacket = class(TPacket)
 | 
			
		||||
    constructor Create(AOldPassword, ANewPassword: String);
 | 
			
		||||
  end;
 | 
			
		||||
  
 | 
			
		||||
  { TRequestRadarChecksumPacket }
 | 
			
		||||
 | 
			
		||||
  TRequestRadarChecksumPacket = class(TPacket)
 | 
			
		||||
@ -346,6 +352,16 @@ begin
 | 
			
		||||
  FStream.WriteStringNull(AUsername);
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
{ TChangePasswordPacket }
 | 
			
		||||
 | 
			
		||||
constructor TChangePasswordPacket.Create(AOldPassword, ANewPassword: String);
 | 
			
		||||
begin
 | 
			
		||||
  inherited Create($0C, 0);
 | 
			
		||||
  FStream.WriteByte($08);
 | 
			
		||||
  FStream.WriteStringNull(AOldPassword);
 | 
			
		||||
  FStream.WriteStringNull(ANewPassword);
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
{ TRequestRadarChecksumPacket }
 | 
			
		||||
 | 
			
		||||
constructor TRequestRadarChecksumPacket.Create;
 | 
			
		||||
 | 
			
		||||
@ -78,7 +78,8 @@ uses
 | 
			
		||||
  UGameResources, UfrmAccountControl, UfrmEditAccount, UfrmDrawSettings,
 | 
			
		||||
  UfrmBoundaries, UfrmElevateSettings, UfrmConfirmation, UfrmMoveSettings,
 | 
			
		||||
  UfrmAbout, UfrmHueSettings, UfrmRadar, UfrmLargeScaleCommand,
 | 
			
		||||
  UfrmVirtualLayer, UfrmFilter, UfrmRegionControl, UfrmLightlevel;
 | 
			
		||||
  UfrmVirtualLayer, UfrmFilter, UfrmRegionControl, UfrmLightlevel,
 | 
			
		||||
  UfrmChangePassword;
 | 
			
		||||
  
 | 
			
		||||
{$I version.inc}
 | 
			
		||||
 | 
			
		||||
@ -212,6 +213,7 @@ begin
 | 
			
		||||
          frmVirtualLayer := TfrmVirtualLayer.Create(frmMain);
 | 
			
		||||
          frmLightlevel := TfrmLightlevel.Create(frmMain);
 | 
			
		||||
          frmAbout := TfrmAbout.Create(frmMain);
 | 
			
		||||
          frmChangePassword := TfrmChangePassword.Create(frmMain);
 | 
			
		||||
          frmMain.Show;
 | 
			
		||||
          frmInitialize.Hide;
 | 
			
		||||
          tmNoOp.Enabled := True;
 | 
			
		||||
@ -308,6 +310,7 @@ begin
 | 
			
		||||
  FreeAndNil(frmLargeScaleCommand);
 | 
			
		||||
  FreeAndNil(frmRadarMap);
 | 
			
		||||
  FreeAndNil(frmLightlevel);
 | 
			
		||||
  FreeAndNil(frmChangePassword);
 | 
			
		||||
 | 
			
		||||
  if frmMain <> nil then
 | 
			
		||||
  begin
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										129
									
								
								Client/UfrmChangePassword.lfm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										129
									
								
								Client/UfrmChangePassword.lfm
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,129 @@
 | 
			
		||||
object frmChangePassword: TfrmChangePassword
 | 
			
		||||
  Left = 283
 | 
			
		||||
  Height = 145
 | 
			
		||||
  Top = 193
 | 
			
		||||
  Width = 315
 | 
			
		||||
  BorderStyle = bsDialog
 | 
			
		||||
  Caption = 'Change Password'
 | 
			
		||||
  ClientHeight = 145
 | 
			
		||||
  ClientWidth = 315
 | 
			
		||||
  OnShow = FormShow
 | 
			
		||||
  Position = poMainFormCenter
 | 
			
		||||
  LCLVersion = '1.3'
 | 
			
		||||
  object Label1: TLabel
 | 
			
		||||
    AnchorSideTop.Control = edOldPwd
 | 
			
		||||
    AnchorSideTop.Side = asrCenter
 | 
			
		||||
    AnchorSideRight.Control = edOldPwd
 | 
			
		||||
    Left = 32
 | 
			
		||||
    Height = 15
 | 
			
		||||
    Top = 13
 | 
			
		||||
    Width = 88
 | 
			
		||||
    Anchors = [akTop, akRight]
 | 
			
		||||
    BorderSpacing.Right = 8
 | 
			
		||||
    Caption = 'Old Password:'
 | 
			
		||||
    ParentColor = False
 | 
			
		||||
  end
 | 
			
		||||
  object Label2: TLabel
 | 
			
		||||
    AnchorSideTop.Control = edNewPwd
 | 
			
		||||
    AnchorSideTop.Side = asrCenter
 | 
			
		||||
    AnchorSideRight.Control = edNewPwd
 | 
			
		||||
    Left = 26
 | 
			
		||||
    Height = 15
 | 
			
		||||
    Top = 46
 | 
			
		||||
    Width = 94
 | 
			
		||||
    Anchors = [akTop, akRight]
 | 
			
		||||
    BorderSpacing.Right = 8
 | 
			
		||||
    Caption = 'New Password:'
 | 
			
		||||
    ParentColor = False
 | 
			
		||||
  end
 | 
			
		||||
  object lblNewPwdRepeat: TLabel
 | 
			
		||||
    AnchorSideTop.Control = edNewPwdRepeat
 | 
			
		||||
    AnchorSideTop.Side = asrCenter
 | 
			
		||||
    AnchorSideRight.Control = edNewPwdRepeat
 | 
			
		||||
    Left = 9
 | 
			
		||||
    Height = 15
 | 
			
		||||
    Top = 79
 | 
			
		||||
    Width = 111
 | 
			
		||||
    Anchors = [akTop, akRight]
 | 
			
		||||
    BorderSpacing.Right = 8
 | 
			
		||||
    Caption = 'Repeat Password:'
 | 
			
		||||
    ParentColor = False
 | 
			
		||||
  end
 | 
			
		||||
  object edOldPwd: TEdit
 | 
			
		||||
    Left = 128
 | 
			
		||||
    Height = 25
 | 
			
		||||
    Top = 8
 | 
			
		||||
    Width = 176
 | 
			
		||||
    EchoMode = emPassword
 | 
			
		||||
    PasswordChar = '*'
 | 
			
		||||
    TabOrder = 0
 | 
			
		||||
  end
 | 
			
		||||
  object edNewPwd: TEdit
 | 
			
		||||
    AnchorSideLeft.Control = edOldPwd
 | 
			
		||||
    AnchorSideTop.Control = edOldPwd
 | 
			
		||||
    AnchorSideTop.Side = asrBottom
 | 
			
		||||
    AnchorSideRight.Control = edOldPwd
 | 
			
		||||
    AnchorSideRight.Side = asrBottom
 | 
			
		||||
    Left = 128
 | 
			
		||||
    Height = 25
 | 
			
		||||
    Top = 41
 | 
			
		||||
    Width = 176
 | 
			
		||||
    Anchors = [akTop, akLeft, akRight]
 | 
			
		||||
    BorderSpacing.Top = 8
 | 
			
		||||
    EchoMode = emPassword
 | 
			
		||||
    OnChange = edNewPwdChange
 | 
			
		||||
    PasswordChar = '*'
 | 
			
		||||
    TabOrder = 1
 | 
			
		||||
  end
 | 
			
		||||
  object edNewPwdRepeat: TEdit
 | 
			
		||||
    AnchorSideLeft.Control = edNewPwd
 | 
			
		||||
    AnchorSideTop.Control = edNewPwd
 | 
			
		||||
    AnchorSideTop.Side = asrBottom
 | 
			
		||||
    AnchorSideRight.Control = edNewPwd
 | 
			
		||||
    AnchorSideRight.Side = asrBottom
 | 
			
		||||
    Left = 128
 | 
			
		||||
    Height = 25
 | 
			
		||||
    Top = 74
 | 
			
		||||
    Width = 176
 | 
			
		||||
    Anchors = [akTop, akLeft, akRight]
 | 
			
		||||
    BorderSpacing.Top = 8
 | 
			
		||||
    EchoMode = emPassword
 | 
			
		||||
    OnChange = edNewPwdChange
 | 
			
		||||
    PasswordChar = '*'
 | 
			
		||||
    TabOrder = 2
 | 
			
		||||
  end
 | 
			
		||||
  object btnOK: TButton
 | 
			
		||||
    AnchorSideTop.Control = btnCancel
 | 
			
		||||
    AnchorSideRight.Control = btnCancel
 | 
			
		||||
    Left = 149
 | 
			
		||||
    Height = 25
 | 
			
		||||
    Top = 112
 | 
			
		||||
    Width = 75
 | 
			
		||||
    Anchors = [akTop, akRight]
 | 
			
		||||
    BorderSpacing.Right = 8
 | 
			
		||||
    Caption = '&OK'
 | 
			
		||||
    Default = True
 | 
			
		||||
    Enabled = False
 | 
			
		||||
    ModalResult = 1
 | 
			
		||||
    OnClick = btnOKClick
 | 
			
		||||
    TabOrder = 3
 | 
			
		||||
  end
 | 
			
		||||
  object btnCancel: TButton
 | 
			
		||||
    AnchorSideRight.Control = Owner
 | 
			
		||||
    AnchorSideRight.Side = asrBottom
 | 
			
		||||
    AnchorSideBottom.Control = Owner
 | 
			
		||||
    AnchorSideBottom.Side = asrBottom
 | 
			
		||||
    Left = 232
 | 
			
		||||
    Height = 25
 | 
			
		||||
    Top = 112
 | 
			
		||||
    Width = 75
 | 
			
		||||
    Anchors = [akRight, akBottom]
 | 
			
		||||
    BorderSpacing.Right = 8
 | 
			
		||||
    BorderSpacing.Bottom = 8
 | 
			
		||||
    Cancel = True
 | 
			
		||||
    Caption = 'Cancel'
 | 
			
		||||
    ModalResult = 2
 | 
			
		||||
    OnClick = btnCancelClick
 | 
			
		||||
    TabOrder = 4
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										81
									
								
								Client/UfrmChangePassword.pas
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								Client/UfrmChangePassword.pas
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,81 @@
 | 
			
		||||
unit UfrmChangePassword;
 | 
			
		||||
 | 
			
		||||
{$mode objfpc}{$H+}
 | 
			
		||||
 | 
			
		||||
interface
 | 
			
		||||
 | 
			
		||||
uses
 | 
			
		||||
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
 | 
			
		||||
 | 
			
		||||
type
 | 
			
		||||
 | 
			
		||||
  { TfrmChangePassword }
 | 
			
		||||
 | 
			
		||||
  TfrmChangePassword = class(TForm)
 | 
			
		||||
    btnOK: TButton;
 | 
			
		||||
    btnCancel: TButton;
 | 
			
		||||
    edOldPwd: TEdit;
 | 
			
		||||
    edNewPwd: TEdit;
 | 
			
		||||
    edNewPwdRepeat: TEdit;
 | 
			
		||||
    Label1: TLabel;
 | 
			
		||||
    Label2: TLabel;
 | 
			
		||||
    lblNewPwdRepeat: TLabel;
 | 
			
		||||
    procedure btnCancelClick(Sender: TObject);
 | 
			
		||||
    procedure btnOKClick(Sender: TObject);
 | 
			
		||||
    procedure edNewPwdChange(Sender: TObject);
 | 
			
		||||
    procedure FormShow(Sender: TObject);
 | 
			
		||||
  private
 | 
			
		||||
    { private declarations }
 | 
			
		||||
  public
 | 
			
		||||
    { public declarations }
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
var
 | 
			
		||||
  frmChangePassword: TfrmChangePassword;
 | 
			
		||||
 | 
			
		||||
implementation
 | 
			
		||||
 | 
			
		||||
uses
 | 
			
		||||
  UdmNetwork, UPackets, UEnums;
 | 
			
		||||
 | 
			
		||||
{$R *.lfm}
 | 
			
		||||
 | 
			
		||||
{ TfrmChangePassword }
 | 
			
		||||
 | 
			
		||||
procedure TfrmChangePassword.FormShow(Sender: TObject);
 | 
			
		||||
begin
 | 
			
		||||
  edOldPwd.Text := '';
 | 
			
		||||
  edNewPwd.Text := '';
 | 
			
		||||
  edNewPwdRepeat.Text := '';
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TfrmChangePassword.btnCancelClick(Sender: TObject);
 | 
			
		||||
begin
 | 
			
		||||
  Close;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TfrmChangePassword.btnOKClick(Sender: TObject);
 | 
			
		||||
begin
 | 
			
		||||
  dmNetwork.Send(TChangePasswordPacket.Create(edOldPwd.Text,
 | 
			
		||||
    edNewPwd.Text));
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TfrmChangePassword.edNewPwdChange(Sender: TObject);
 | 
			
		||||
var
 | 
			
		||||
  pwdValid: Boolean;
 | 
			
		||||
begin
 | 
			
		||||
  if edNewPwd.Text <> edNewPwdRepeat.Text then
 | 
			
		||||
  begin
 | 
			
		||||
    pwdValid := False;
 | 
			
		||||
    lblNewPwdRepeat.Font.Color := clRed;
 | 
			
		||||
  end else
 | 
			
		||||
  begin
 | 
			
		||||
    pwdValid := True;
 | 
			
		||||
    lblNewPwdRepeat.Font.Color := clDefault;
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
  btnOK.Enabled := (Length(edNewPwd.Text) > 0) and pwdValid;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
end.
 | 
			
		||||
 | 
			
		||||
@ -5,7 +5,7 @@ object frmMain: TfrmMain
 | 
			
		||||
  Width = 755
 | 
			
		||||
  ActiveControl = oglGameWindow
 | 
			
		||||
  Caption = 'UO CentrED'
 | 
			
		||||
  ClientHeight = 559
 | 
			
		||||
  ClientHeight = 558
 | 
			
		||||
  ClientWidth = 755
 | 
			
		||||
  Constraints.MinHeight = 500
 | 
			
		||||
  Constraints.MinWidth = 750
 | 
			
		||||
@ -23,7 +23,7 @@ object frmMain: TfrmMain
 | 
			
		||||
  object pnlBottom: TPanel
 | 
			
		||||
    Left = 0
 | 
			
		||||
    Height = 31
 | 
			
		||||
    Top = 528
 | 
			
		||||
    Top = 527
 | 
			
		||||
    Width = 755
 | 
			
		||||
    Align = alBottom
 | 
			
		||||
    BevelOuter = bvNone
 | 
			
		||||
@ -34,7 +34,7 @@ object frmMain: TfrmMain
 | 
			
		||||
      Left = 11
 | 
			
		||||
      Height = 13
 | 
			
		||||
      Top = 7
 | 
			
		||||
      Width = 9
 | 
			
		||||
      Width = 11
 | 
			
		||||
      Caption = 'X:'
 | 
			
		||||
      ParentColor = False
 | 
			
		||||
    end
 | 
			
		||||
@ -42,7 +42,7 @@ object frmMain: TfrmMain
 | 
			
		||||
      Left = 88
 | 
			
		||||
      Height = 13
 | 
			
		||||
      Top = 7
 | 
			
		||||
      Width = 8
 | 
			
		||||
      Width = 10
 | 
			
		||||
      Caption = 'Y:'
 | 
			
		||||
      ParentColor = False
 | 
			
		||||
    end
 | 
			
		||||
@ -50,15 +50,15 @@ object frmMain: TfrmMain
 | 
			
		||||
      Left = 240
 | 
			
		||||
      Height = 13
 | 
			
		||||
      Top = 7
 | 
			
		||||
      Width = 3
 | 
			
		||||
      Width = 4
 | 
			
		||||
      Caption = ' '
 | 
			
		||||
      ParentColor = False
 | 
			
		||||
    end
 | 
			
		||||
    object lblTip: TLabel
 | 
			
		||||
      Left = 524
 | 
			
		||||
      Left = 501
 | 
			
		||||
      Height = 31
 | 
			
		||||
      Top = 0
 | 
			
		||||
      Width = 223
 | 
			
		||||
      Width = 246
 | 
			
		||||
      Align = alRight
 | 
			
		||||
      Alignment = taRightJustify
 | 
			
		||||
      BorderSpacing.Right = 8
 | 
			
		||||
@ -67,10 +67,10 @@ object frmMain: TfrmMain
 | 
			
		||||
      ParentColor = False
 | 
			
		||||
    end
 | 
			
		||||
    object lblTipC: TLabel
 | 
			
		||||
      Left = 502
 | 
			
		||||
      Left = 473
 | 
			
		||||
      Height = 31
 | 
			
		||||
      Top = 0
 | 
			
		||||
      Width = 22
 | 
			
		||||
      Width = 28
 | 
			
		||||
      Align = alRight
 | 
			
		||||
      Caption = 'Tip: '
 | 
			
		||||
      Font.Height = -11
 | 
			
		||||
@ -81,7 +81,7 @@ object frmMain: TfrmMain
 | 
			
		||||
    end
 | 
			
		||||
    object edX: TSpinEdit
 | 
			
		||||
      Left = 24
 | 
			
		||||
      Height = 21
 | 
			
		||||
      Height = 25
 | 
			
		||||
      Top = 3
 | 
			
		||||
      Width = 55
 | 
			
		||||
      MaxValue = 100000
 | 
			
		||||
@ -89,7 +89,7 @@ object frmMain: TfrmMain
 | 
			
		||||
    end
 | 
			
		||||
    object edY: TSpinEdit
 | 
			
		||||
      Left = 104
 | 
			
		||||
      Height = 21
 | 
			
		||||
      Height = 25
 | 
			
		||||
      Top = 3
 | 
			
		||||
      Width = 52
 | 
			
		||||
      MaxValue = 100000
 | 
			
		||||
@ -108,7 +108,7 @@ object frmMain: TfrmMain
 | 
			
		||||
  end
 | 
			
		||||
  object pcLeft: TPageControl
 | 
			
		||||
    Left = 0
 | 
			
		||||
    Height = 504
 | 
			
		||||
    Height = 503
 | 
			
		||||
    Top = 24
 | 
			
		||||
    Width = 224
 | 
			
		||||
    ActivePage = tsTiles
 | 
			
		||||
@ -117,16 +117,16 @@ object frmMain: TfrmMain
 | 
			
		||||
    TabOrder = 1
 | 
			
		||||
    object tsTiles: TTabSheet
 | 
			
		||||
      Caption = 'Tiles'
 | 
			
		||||
      ClientHeight = 478
 | 
			
		||||
      ClientWidth = 216
 | 
			
		||||
      ClientHeight = 472
 | 
			
		||||
      ClientWidth = 218
 | 
			
		||||
      object lblFilter: TLabel
 | 
			
		||||
        AnchorSideLeft.Control = cbTerrain
 | 
			
		||||
        AnchorSideLeft.Side = asrBottom
 | 
			
		||||
        AnchorSideTop.Control = cbTerrain
 | 
			
		||||
        Left = 75
 | 
			
		||||
        Left = 89
 | 
			
		||||
        Height = 13
 | 
			
		||||
        Top = 8
 | 
			
		||||
        Width = 29
 | 
			
		||||
        Width = 31
 | 
			
		||||
        BorderSpacing.Left = 16
 | 
			
		||||
        Caption = 'Filter:'
 | 
			
		||||
        ParentColor = False
 | 
			
		||||
@ -140,10 +140,10 @@ object frmMain: TfrmMain
 | 
			
		||||
        AnchorSideRight.Side = asrBottom
 | 
			
		||||
        AnchorSideBottom.Control = spTileList
 | 
			
		||||
        Left = 4
 | 
			
		||||
        Height = 240
 | 
			
		||||
        Height = 224
 | 
			
		||||
        Hint = '-'
 | 
			
		||||
        Top = 50
 | 
			
		||||
        Width = 208
 | 
			
		||||
        Top = 60
 | 
			
		||||
        Width = 210
 | 
			
		||||
        Anchors = [akTop, akLeft, akRight, akBottom]
 | 
			
		||||
        BorderSpacing.Left = 4
 | 
			
		||||
        BorderSpacing.Top = 4
 | 
			
		||||
@ -200,12 +200,12 @@ object frmMain: TfrmMain
 | 
			
		||||
        AnchorSideBottom.Side = asrBottom
 | 
			
		||||
        Left = 0
 | 
			
		||||
        Height = 183
 | 
			
		||||
        Top = 295
 | 
			
		||||
        Width = 216
 | 
			
		||||
        Top = 289
 | 
			
		||||
        Width = 218
 | 
			
		||||
        Anchors = [akTop, akLeft, akRight, akBottom]
 | 
			
		||||
        Caption = 'Random pool'
 | 
			
		||||
        ClientHeight = 165
 | 
			
		||||
        ClientWidth = 212
 | 
			
		||||
        ClientHeight = 169
 | 
			
		||||
        ClientWidth = 216
 | 
			
		||||
        TabOrder = 1
 | 
			
		||||
        object btnAddRandom: TSpeedButton
 | 
			
		||||
          AnchorSideLeft.Control = gbRandom
 | 
			
		||||
@ -359,10 +359,10 @@ object frmMain: TfrmMain
 | 
			
		||||
        object btnRandomPresetSave: TSpeedButton
 | 
			
		||||
          AnchorSideTop.Control = cbRandomPreset
 | 
			
		||||
          AnchorSideRight.Control = btnRandomPresetDelete
 | 
			
		||||
          Left = 160
 | 
			
		||||
          Left = 164
 | 
			
		||||
          Height = 22
 | 
			
		||||
          Hint = 'Save Preset'
 | 
			
		||||
          Top = 140
 | 
			
		||||
          Top = 138
 | 
			
		||||
          Width = 22
 | 
			
		||||
          Anchors = [akTop, akRight]
 | 
			
		||||
          BorderSpacing.Right = 4
 | 
			
		||||
@ -411,10 +411,10 @@ object frmMain: TfrmMain
 | 
			
		||||
          AnchorSideTop.Control = btnRandomPresetSave
 | 
			
		||||
          AnchorSideRight.Control = gbRandom
 | 
			
		||||
          AnchorSideRight.Side = asrBottom
 | 
			
		||||
          Left = 186
 | 
			
		||||
          Left = 190
 | 
			
		||||
          Height = 22
 | 
			
		||||
          Hint = 'Delete Preset'
 | 
			
		||||
          Top = 140
 | 
			
		||||
          Top = 138
 | 
			
		||||
          Width = 22
 | 
			
		||||
          Anchors = [akTop, akRight]
 | 
			
		||||
          BorderSpacing.Right = 4
 | 
			
		||||
@ -469,9 +469,9 @@ object frmMain: TfrmMain
 | 
			
		||||
          AnchorSideBottom.Control = cbRandomPreset
 | 
			
		||||
          Cursor = 63
 | 
			
		||||
          Left = 4
 | 
			
		||||
          Height = 112
 | 
			
		||||
          Height = 110
 | 
			
		||||
          Top = 24
 | 
			
		||||
          Width = 204
 | 
			
		||||
          Width = 208
 | 
			
		||||
          Anchors = [akTop, akLeft, akRight, akBottom]
 | 
			
		||||
          BorderSpacing.Left = 4
 | 
			
		||||
          BorderSpacing.Top = 2
 | 
			
		||||
@ -517,14 +517,14 @@ object frmMain: TfrmMain
 | 
			
		||||
          AnchorSideBottom.Control = gbRandom
 | 
			
		||||
          AnchorSideBottom.Side = asrBottom
 | 
			
		||||
          Left = 4
 | 
			
		||||
          Height = 21
 | 
			
		||||
          Top = 140
 | 
			
		||||
          Width = 152
 | 
			
		||||
          Height = 27
 | 
			
		||||
          Top = 138
 | 
			
		||||
          Width = 156
 | 
			
		||||
          Anchors = [akLeft, akRight, akBottom]
 | 
			
		||||
          BorderSpacing.Left = 4
 | 
			
		||||
          BorderSpacing.Right = 4
 | 
			
		||||
          BorderSpacing.Bottom = 4
 | 
			
		||||
          ItemHeight = 13
 | 
			
		||||
          ItemHeight = 0
 | 
			
		||||
          OnChange = cbRandomPresetChange
 | 
			
		||||
          Sorted = True
 | 
			
		||||
          Style = csDropDownList
 | 
			
		||||
@ -538,8 +538,8 @@ object frmMain: TfrmMain
 | 
			
		||||
        Cursor = crVSplit
 | 
			
		||||
        Left = 0
 | 
			
		||||
        Height = 5
 | 
			
		||||
        Top = 290
 | 
			
		||||
        Width = 216
 | 
			
		||||
        Top = 284
 | 
			
		||||
        Width = 218
 | 
			
		||||
        Align = alNone
 | 
			
		||||
        Anchors = [akLeft, akRight, akBottom]
 | 
			
		||||
        ResizeAnchor = akBottom
 | 
			
		||||
@ -549,10 +549,10 @@ object frmMain: TfrmMain
 | 
			
		||||
        AnchorSideRight.Side = asrBottom
 | 
			
		||||
        AnchorSideBottom.Control = vdtTiles
 | 
			
		||||
        AnchorSideBottom.Side = asrBottom
 | 
			
		||||
        Left = 108
 | 
			
		||||
        Height = 21
 | 
			
		||||
        Left = 110
 | 
			
		||||
        Height = 23
 | 
			
		||||
        Hint = 'Append S or T to restrict the search to Statics or Terrain.'
 | 
			
		||||
        Top = 261
 | 
			
		||||
        Top = 253
 | 
			
		||||
        Width = 96
 | 
			
		||||
        Anchors = [akRight, akBottom]
 | 
			
		||||
        BorderSpacing.Right = 8
 | 
			
		||||
@ -571,10 +571,10 @@ object frmMain: TfrmMain
 | 
			
		||||
        AnchorSideTop.Side = asrBottom
 | 
			
		||||
        AnchorSideRight.Control = tsTiles
 | 
			
		||||
        AnchorSideRight.Side = asrBottom
 | 
			
		||||
        Left = 75
 | 
			
		||||
        Height = 21
 | 
			
		||||
        Left = 89
 | 
			
		||||
        Height = 23
 | 
			
		||||
        Top = 21
 | 
			
		||||
        Width = 125
 | 
			
		||||
        Width = 113
 | 
			
		||||
        Anchors = [akTop, akLeft, akRight]
 | 
			
		||||
        BorderSpacing.Right = 16
 | 
			
		||||
        OnEditingDone = edFilterEditingDone
 | 
			
		||||
@ -585,10 +585,10 @@ object frmMain: TfrmMain
 | 
			
		||||
        AnchorSideLeft.Side = asrCenter
 | 
			
		||||
        AnchorSideTop.Control = cbTerrain
 | 
			
		||||
        AnchorSideTop.Side = asrBottom
 | 
			
		||||
        Left = 5
 | 
			
		||||
        Height = 19
 | 
			
		||||
        Top = 27
 | 
			
		||||
        Width = 53
 | 
			
		||||
        Left = 3
 | 
			
		||||
        Height = 24
 | 
			
		||||
        Top = 32
 | 
			
		||||
        Width = 71
 | 
			
		||||
        Caption = 'Statics'
 | 
			
		||||
        Checked = True
 | 
			
		||||
        OnChange = cbStaticsChange
 | 
			
		||||
@ -599,9 +599,9 @@ object frmMain: TfrmMain
 | 
			
		||||
        AnchorSideLeft.Control = tsTiles
 | 
			
		||||
        AnchorSideTop.Control = tsTiles
 | 
			
		||||
        Left = 4
 | 
			
		||||
        Height = 19
 | 
			
		||||
        Height = 24
 | 
			
		||||
        Top = 8
 | 
			
		||||
        Width = 55
 | 
			
		||||
        Width = 69
 | 
			
		||||
        BorderSpacing.Left = 4
 | 
			
		||||
        BorderSpacing.Top = 8
 | 
			
		||||
        Caption = 'Terrain'
 | 
			
		||||
@ -613,8 +613,8 @@ object frmMain: TfrmMain
 | 
			
		||||
    end
 | 
			
		||||
    object tsClients: TTabSheet
 | 
			
		||||
      Caption = 'Clients'
 | 
			
		||||
      ClientHeight = 478
 | 
			
		||||
      ClientWidth = 216
 | 
			
		||||
      ClientHeight = 472
 | 
			
		||||
      ClientWidth = 218
 | 
			
		||||
      object lbClients: TListBox
 | 
			
		||||
        Left = 0
 | 
			
		||||
        Height = 478
 | 
			
		||||
@ -624,14 +624,16 @@ object frmMain: TfrmMain
 | 
			
		||||
        ItemHeight = 0
 | 
			
		||||
        OnDblClick = mnuGoToClientClick
 | 
			
		||||
        PopupMenu = pmClients
 | 
			
		||||
        ScrollWidth = 214
 | 
			
		||||
        Sorted = True
 | 
			
		||||
        TabOrder = 0
 | 
			
		||||
        TopIndex = -1
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    object tsLocations: TTabSheet
 | 
			
		||||
      Caption = 'Locations'
 | 
			
		||||
      ClientHeight = 478
 | 
			
		||||
      ClientWidth = 216
 | 
			
		||||
      ClientHeight = 472
 | 
			
		||||
      ClientWidth = 218
 | 
			
		||||
      object btnClearLocations: TSpeedButton
 | 
			
		||||
        AnchorSideLeft.Control = btnDeleteLocation
 | 
			
		||||
        AnchorSideLeft.Side = asrBottom
 | 
			
		||||
@ -1027,7 +1029,7 @@ object frmMain: TfrmMain
 | 
			
		||||
    AnchorSideBottom.Control = spChat
 | 
			
		||||
    Left = 224
 | 
			
		||||
    Height = 22
 | 
			
		||||
    Top = 392
 | 
			
		||||
    Top = 391
 | 
			
		||||
    Width = 531
 | 
			
		||||
    Anchors = [akLeft, akRight, akBottom]
 | 
			
		||||
    BevelInner = bvRaised
 | 
			
		||||
@ -1040,7 +1042,7 @@ object frmMain: TfrmMain
 | 
			
		||||
      Left = 10
 | 
			
		||||
      Height = 18
 | 
			
		||||
      Top = 2
 | 
			
		||||
      Width = 100
 | 
			
		||||
      Width = 113
 | 
			
		||||
      Align = alLeft
 | 
			
		||||
      BorderSpacing.Left = 8
 | 
			
		||||
      Caption = 'Chat and Messages'
 | 
			
		||||
@ -1061,7 +1063,7 @@ object frmMain: TfrmMain
 | 
			
		||||
    AnchorSideBottom.Control = pnlBottom
 | 
			
		||||
    Left = 224
 | 
			
		||||
    Height = 109
 | 
			
		||||
    Top = 419
 | 
			
		||||
    Top = 418
 | 
			
		||||
    Width = 531
 | 
			
		||||
    Anchors = [akTop, akLeft, akRight, akBottom]
 | 
			
		||||
    BevelOuter = bvNone
 | 
			
		||||
@ -1072,7 +1074,7 @@ object frmMain: TfrmMain
 | 
			
		||||
    object vstChat: TVirtualStringTree
 | 
			
		||||
      Cursor = 63
 | 
			
		||||
      Left = 0
 | 
			
		||||
      Height = 88
 | 
			
		||||
      Height = 86
 | 
			
		||||
      Top = 0
 | 
			
		||||
      Width = 531
 | 
			
		||||
      Align = alClient
 | 
			
		||||
@ -1092,7 +1094,7 @@ object frmMain: TfrmMain
 | 
			
		||||
        item
 | 
			
		||||
          Position = 2
 | 
			
		||||
          Text = 'Message'
 | 
			
		||||
          Width = 377
 | 
			
		||||
          Width = 379
 | 
			
		||||
        end>
 | 
			
		||||
      Header.DefaultHeight = 17
 | 
			
		||||
      Header.MainColumn = 2
 | 
			
		||||
@ -1110,8 +1112,8 @@ object frmMain: TfrmMain
 | 
			
		||||
    end
 | 
			
		||||
    object edChat: TEdit
 | 
			
		||||
      Left = 0
 | 
			
		||||
      Height = 21
 | 
			
		||||
      Top = 88
 | 
			
		||||
      Height = 23
 | 
			
		||||
      Top = 86
 | 
			
		||||
      Width = 531
 | 
			
		||||
      Align = alBottom
 | 
			
		||||
      OnKeyPress = edChatKeyPress
 | 
			
		||||
@ -1126,7 +1128,7 @@ object frmMain: TfrmMain
 | 
			
		||||
    Cursor = crVSplit
 | 
			
		||||
    Left = 224
 | 
			
		||||
    Height = 5
 | 
			
		||||
    Top = 414
 | 
			
		||||
    Top = 413
 | 
			
		||||
    Width = 531
 | 
			
		||||
    Align = alNone
 | 
			
		||||
    Anchors = [akLeft, akRight, akBottom]
 | 
			
		||||
@ -1143,7 +1145,7 @@ object frmMain: TfrmMain
 | 
			
		||||
    AnchorSideRight.Side = asrBottom
 | 
			
		||||
    AnchorSideBottom.Control = pnlChatHeader
 | 
			
		||||
    Left = 224
 | 
			
		||||
    Height = 368
 | 
			
		||||
    Height = 367
 | 
			
		||||
    Top = 24
 | 
			
		||||
    Width = 531
 | 
			
		||||
    Anchors = [akTop, akLeft, akRight, akBottom]
 | 
			
		||||
@ -1164,6 +1166,13 @@ object frmMain: TfrmMain
 | 
			
		||||
    top = 33
 | 
			
		||||
    object mnuCentrED: TMenuItem
 | 
			
		||||
      Caption = '&CentrED'
 | 
			
		||||
      object mnuChangePassword: TMenuItem
 | 
			
		||||
        Caption = '&Change Password'
 | 
			
		||||
        OnClick = mnuChangePasswordClick
 | 
			
		||||
      end
 | 
			
		||||
      object mnuSeparator1: TMenuItem
 | 
			
		||||
        Caption = '-'
 | 
			
		||||
      end
 | 
			
		||||
      object mnuDisconnect: TMenuItem
 | 
			
		||||
        Caption = '&Disconnect'
 | 
			
		||||
        Bitmap.Data = {
 | 
			
		||||
@ -1205,9 +1214,6 @@ object frmMain: TfrmMain
 | 
			
		||||
        ImageIndex = 0
 | 
			
		||||
        OnClick = mnuDisconnectClick
 | 
			
		||||
      end
 | 
			
		||||
      object mnuSeparator1: TMenuItem
 | 
			
		||||
        Caption = '-'
 | 
			
		||||
      end
 | 
			
		||||
      object mnuExit: TMenuItem
 | 
			
		||||
        Caption = 'E&xit'
 | 
			
		||||
        OnClick = mnuExitClick
 | 
			
		||||
 | 
			
		||||
@ -103,6 +103,7 @@ type
 | 
			
		||||
    lblY: TLabel;
 | 
			
		||||
    lbClients: TListBox;
 | 
			
		||||
    MainMenu1: TMainMenu;
 | 
			
		||||
    mnuChangePassword: TMenuItem;
 | 
			
		||||
    mnuWhiteBackground: TMenuItem;
 | 
			
		||||
    mnuSecurityQuestion: TMenuItem;
 | 
			
		||||
    mnuShowAnimations: TMenuItem;
 | 
			
		||||
@ -222,6 +223,7 @@ type
 | 
			
		||||
    procedure lblChatHeaderCaptionClick(Sender: TObject);
 | 
			
		||||
    procedure lblChatHeaderCaptionMouseEnter(Sender: TObject);
 | 
			
		||||
    procedure lblChatHeaderCaptionMouseLeave(Sender: TObject);
 | 
			
		||||
    procedure mnuChangePasswordClick(Sender: TObject);
 | 
			
		||||
    procedure mnuAboutClick(Sender: TObject);
 | 
			
		||||
    procedure mnuAccountControlClick(Sender: TObject);
 | 
			
		||||
    procedure mnuDisconnectClick(Sender: TObject);
 | 
			
		||||
@ -407,7 +409,7 @@ uses
 | 
			
		||||
  UfrmBoundaries, UfrmElevateSettings, UfrmConfirmation, UfrmMoveSettings,
 | 
			
		||||
  UfrmAbout, UPacketHandlers, UfrmHueSettings, UfrmRadar, UfrmLargeScaleCommand,
 | 
			
		||||
  UfrmLogin, UResourceManager, UfrmVirtualLayer, UfrmFilter, UfrmRegionControl,
 | 
			
		||||
  Logging, LConvEncoding, LCLType, UfrmLightlevel;
 | 
			
		||||
  Logging, LConvEncoding, LCLType, UfrmLightlevel, UfrmChangePassword;
 | 
			
		||||
 | 
			
		||||
type
 | 
			
		||||
  TGLArrayf4 = array[0..3] of GLfloat;
 | 
			
		||||
@ -1417,6 +1419,11 @@ begin
 | 
			
		||||
  lblChatHeaderCaption.Font.Underline := False;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TfrmMain.mnuChangePasswordClick(Sender: TObject);
 | 
			
		||||
begin
 | 
			
		||||
  frmChangePassword.ShowModal;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TfrmMain.mnuAboutClick(Sender: TObject);
 | 
			
		||||
begin
 | 
			
		||||
  frmAbout.ShowModal;
 | 
			
		||||
@ -3060,6 +3067,7 @@ var
 | 
			
		||||
  i: Integer;
 | 
			
		||||
  accessLevel: TAccessLevel;
 | 
			
		||||
  accessChangedListener: TAccessChangedListener;
 | 
			
		||||
  pwdChangeStatus: TPasswordChangeStatus;
 | 
			
		||||
begin
 | 
			
		||||
  case ABuffer.ReadByte of
 | 
			
		||||
    $01: //client connected
 | 
			
		||||
@ -3117,6 +3125,23 @@ begin
 | 
			
		||||
        for accessChangedListener in FAccessChangedListeners.Reversed do
 | 
			
		||||
          accessChangedListener(accessLevel);
 | 
			
		||||
      end;
 | 
			
		||||
    $08: //password change status
 | 
			
		||||
      begin
 | 
			
		||||
        pwdChangeStatus := TPasswordChangeStatus(ABuffer.ReadByte);
 | 
			
		||||
        case pwdChangeStatus of
 | 
			
		||||
          pcSuccess:
 | 
			
		||||
            Messagedlg('Password Change', 'Your password has been changed', mtInformation, [mbOK], 0);
 | 
			
		||||
          pcOldPwInvalid:
 | 
			
		||||
            Messagedlg('Password Change', 'The old password is wrong.' + sLineBreak +
 | 
			
		||||
              'Your password has NOT been changed.', mtWarning, [mbOK], 0);
 | 
			
		||||
          pcNewPwInvalid:
 | 
			
		||||
            Messagedlg('Password Change', 'The new password is not allowed.' + sLineBreak +
 | 
			
		||||
              'Your password has NOT been changed.', mtWarning, [mbOK], 0);
 | 
			
		||||
          pcIdentical:
 | 
			
		||||
            Messagedlg('Password Change', 'The new password matched the old password.' + sLineBreak +
 | 
			
		||||
              'Your password has NOT been changed.', mtWarning, [mbOK], 0);
 | 
			
		||||
        end;
 | 
			
		||||
      end;
 | 
			
		||||
  end;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -336,7 +336,7 @@ implementation
 | 
			
		||||
uses
 | 
			
		||||
{$IF Defined(LCL)}
 | 
			
		||||
  {$IF Defined(LCLGTK2)}
 | 
			
		||||
    GLib2, GDK2, GTK2, GTKDef, GTKProc,
 | 
			
		||||
    GLib2, GDK2, GTK2, Gtk2Def, Gtk2Proc,
 | 
			
		||||
  {$ELSEIF Defined(LCLGTK)}
 | 
			
		||||
    GDK, GTK, GTKDef, GTKProc,
 | 
			
		||||
  {$IFEND}
 | 
			
		||||
 | 
			
		||||
@ -21,7 +21,7 @@
 | 
			
		||||
 * CDDL HEADER END
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 *      Portions Copyright 2008 Andreas Schneider
 | 
			
		||||
 *      Portions Copyright 2013 Andreas Schneider
 | 
			
		||||
 *)
 | 
			
		||||
unit UAccount;
 | 
			
		||||
 | 
			
		||||
@ -37,7 +37,7 @@ type
 | 
			
		||||
  { TAccount }
 | 
			
		||||
 | 
			
		||||
  TAccount = class(TObject, ISerializable, IInvalidate)
 | 
			
		||||
    constructor Create(AOwner: IInvalidate; AName, APasswordHash: string;
 | 
			
		||||
    constructor Create(AOwner: IInvalidate; AName, APassword: string;
 | 
			
		||||
      AAccessLevel: TAccessLevel; ARegions: TStringList);
 | 
			
		||||
    constructor Deserialize(AOwner: IInvalidate; AElement: TDOMElement);
 | 
			
		||||
    destructor Destroy; override;
 | 
			
		||||
@ -58,7 +58,9 @@ type
 | 
			
		||||
    property PasswordHash: string read FPasswordHash write SetPasswordHash;
 | 
			
		||||
    property LastPos: TPoint read FLastPos write SetLastPos;
 | 
			
		||||
    property Regions: TStringList read FRegions;
 | 
			
		||||
    function CheckPassword(APassword: String): Boolean;
 | 
			
		||||
    procedure Invalidate;
 | 
			
		||||
    procedure UpdatePassword(APassword: String);
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
  { TAccountList }
 | 
			
		||||
@ -79,17 +81,17 @@ type
 | 
			
		||||
implementation
 | 
			
		||||
 | 
			
		||||
uses
 | 
			
		||||
  UCEDServer, UConfig;
 | 
			
		||||
  UCEDServer, UConfig, md5;
 | 
			
		||||
 | 
			
		||||
{ TAccount }
 | 
			
		||||
 | 
			
		||||
constructor TAccount.Create(AOwner: IInvalidate; AName, APasswordHash: string;
 | 
			
		||||
constructor TAccount.Create(AOwner: IInvalidate; AName, APassword: string;
 | 
			
		||||
  AAccessLevel: TAccessLevel; ARegions: TStringList);
 | 
			
		||||
begin
 | 
			
		||||
  inherited Create;
 | 
			
		||||
  FOwner := AOwner;
 | 
			
		||||
  FName := AName;
 | 
			
		||||
  FPasswordHash := APasswordHash;
 | 
			
		||||
  FPasswordHash := MD5Print(MD5String(APassword));
 | 
			
		||||
  FAccessLevel := AAccessLevel;
 | 
			
		||||
  if ARegions <> nil then
 | 
			
		||||
    FRegions := ARegions
 | 
			
		||||
@ -154,11 +156,27 @@ begin
 | 
			
		||||
  Invalidate;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
function TAccount.CheckPassword(APassword: String): Boolean;
 | 
			
		||||
var
 | 
			
		||||
  testHash: String;
 | 
			
		||||
begin
 | 
			
		||||
  //Since I want to change to PBKDF2 sometime, we compare strings instead
 | 
			
		||||
  //of MD5Digest, so we can (later) check what type of hash the string has
 | 
			
		||||
  //been created with.
 | 
			
		||||
  testHash := MD5Print(MD5String(APassword));
 | 
			
		||||
  Result := FPasswordHash = testHash;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TAccount.Invalidate;
 | 
			
		||||
begin
 | 
			
		||||
  FOwner.Invalidate;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TAccount.UpdatePassword(APassword: String);
 | 
			
		||||
begin
 | 
			
		||||
  PasswordHash := MD5Print(MD5String(APassword));
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TAccount.Serialize(AElement: TDOMElement);
 | 
			
		||||
var
 | 
			
		||||
  i: Integer;
 | 
			
		||||
 | 
			
		||||
@ -21,7 +21,7 @@
 | 
			
		||||
 * CDDL HEADER END
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 *      Portions Copyright 2008 Andreas Schneider
 | 
			
		||||
 *      Portions Copyright 2013 Andreas Schneider
 | 
			
		||||
 *)
 | 
			
		||||
unit UAdminHandling;
 | 
			
		||||
 | 
			
		||||
@ -88,7 +88,7 @@ var
 | 
			
		||||
implementation
 | 
			
		||||
 | 
			
		||||
uses
 | 
			
		||||
  md5, UCEDServer, UPackets, UClientHandling;
 | 
			
		||||
  UCEDServer, UPackets, UClientHandling;
 | 
			
		||||
 | 
			
		||||
procedure AdminBroadcast(AAccessLevel: TAccessLevel; APacket: TPacket);
 | 
			
		||||
var
 | 
			
		||||
@ -146,7 +146,7 @@ begin
 | 
			
		||||
  if account <> nil then
 | 
			
		||||
  begin
 | 
			
		||||
    if password <> '' then
 | 
			
		||||
      account.PasswordHash := MD5Print(MD5String(password));
 | 
			
		||||
      account.UpdatePassword(password);
 | 
			
		||||
 | 
			
		||||
    account.AccessLevel := accessLevel;
 | 
			
		||||
 | 
			
		||||
@ -181,8 +181,8 @@ begin
 | 
			
		||||
      for i := 0 to regionCount - 1 do
 | 
			
		||||
        regions.Add(ABuffer.ReadStringNull);
 | 
			
		||||
 | 
			
		||||
      account := TAccount.Create(Config.Accounts, username,
 | 
			
		||||
        MD5Print(MD5String(password)), accessLevel, regions);
 | 
			
		||||
      account := TAccount.Create(Config.Accounts, username, password,
 | 
			
		||||
        accessLevel, regions);
 | 
			
		||||
 | 
			
		||||
      Config.Accounts.Add(account);
 | 
			
		||||
      Config.Accounts.Invalidate;
 | 
			
		||||
 | 
			
		||||
@ -217,7 +217,7 @@ begin
 | 
			
		||||
  try
 | 
			
		||||
    buffer := ANetState.ReceiveQueue;
 | 
			
		||||
    buffer.Position := 0;
 | 
			
		||||
    while (buffer.Size >= 1) and ANetState.Socket.Connected do
 | 
			
		||||
    while (buffer.Size >= 1) and (ANetState.Socket.ConnectionStatus = scConnected) do
 | 
			
		||||
    begin
 | 
			
		||||
      packetID := buffer.ReadByte;
 | 
			
		||||
      packetHandler := PacketHandlers[packetID];
 | 
			
		||||
@ -268,7 +268,7 @@ begin
 | 
			
		||||
    netState := TNetState(FTCPServer.Iterator.UserData);
 | 
			
		||||
    if netState <> nil then
 | 
			
		||||
    begin
 | 
			
		||||
      if FTCPServer.Iterator.Connected then
 | 
			
		||||
      if FTCPServer.Iterator.ConnectionStatus = scConnected then
 | 
			
		||||
      begin
 | 
			
		||||
        if (SecondsBetween(netState.LastAction, Now) > 120) then
 | 
			
		||||
        begin
 | 
			
		||||
@ -326,7 +326,7 @@ begin
 | 
			
		||||
    while FTCPServer.IterNext do
 | 
			
		||||
    begin
 | 
			
		||||
      netState := TNetState(FTCPServer.Iterator.UserData);
 | 
			
		||||
      if (netState <> nil) and (FTCPServer.Iterator.Connected) then
 | 
			
		||||
      if (netState <> nil) and (FTCPServer.Iterator.ConnectionStatus = scConnected) then
 | 
			
		||||
      begin
 | 
			
		||||
        netState.SendQueue.Seek(0, soFromEnd);
 | 
			
		||||
        netState.SendQueue.CopyFrom(APacket.Stream, 0);
 | 
			
		||||
@ -340,7 +340,7 @@ end;
 | 
			
		||||
 | 
			
		||||
procedure TCEDServer.Disconnect(ASocket: TLSocket);
 | 
			
		||||
begin
 | 
			
		||||
  if ASocket.Connected then
 | 
			
		||||
  if ASocket.ConnectionStatus = scConnected then
 | 
			
		||||
  begin
 | 
			
		||||
    ASocket.Disconnect;
 | 
			
		||||
    //OnDisconnect(ASocket);
 | 
			
		||||
 | 
			
		||||
@ -71,6 +71,12 @@ type
 | 
			
		||||
    constructor Create(AAccount: TAccount);
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
  { TPasswordChangeStatusPacket }
 | 
			
		||||
 | 
			
		||||
  TPasswordChangeStatusPacket = class(TPacket)
 | 
			
		||||
    constructor Create(AResult: TPasswordChangeStatus);
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
procedure OnClientHandlerPacket(ABuffer: TEnhancedMemoryStream;
 | 
			
		||||
  ANetState: TNetState);
 | 
			
		||||
procedure OnUpdateClientPosPacket(ABuffer: TEnhancedMemoryStream;
 | 
			
		||||
@ -79,6 +85,8 @@ procedure OnChatMessagePacket(ABuffer: TEnhancedMemoryStream;
 | 
			
		||||
  ANetState: TNetState);
 | 
			
		||||
procedure OnGotoClientPosPacket(ABuffer: TEnhancedMemoryStream;
 | 
			
		||||
  ANetState: TNetState);
 | 
			
		||||
procedure OnChangePasswordPacket(ABuffer: TEnhancedMemoryStream;
 | 
			
		||||
  ANetState: TNetState);
 | 
			
		||||
 | 
			
		||||
procedure WriteAccountRestrictions(AStream: TEnhancedMemoryStream;
 | 
			
		||||
  AAccount: TAccount);
 | 
			
		||||
@ -130,6 +138,44 @@ begin
 | 
			
		||||
      TSetClientPosPacket.Create(account.LastPos));
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure OnChangePasswordPacket(ABuffer: TEnhancedMemoryStream;
 | 
			
		||||
  ANetState: TNetState);
 | 
			
		||||
var
 | 
			
		||||
  oldPwd, newPwd: String;
 | 
			
		||||
begin
 | 
			
		||||
  oldPwd := ABuffer.ReadStringNull;
 | 
			
		||||
  newPwd := ABuffer.ReadStringNull;
 | 
			
		||||
  if ANetState.Account.CheckPassword(oldPwd) then
 | 
			
		||||
  begin
 | 
			
		||||
    //Check if the passwords actually differ. Changing them isn't allowed
 | 
			
		||||
    //otherwise. Might be open for configuration, though.
 | 
			
		||||
    if oldPwd <> newPwd then
 | 
			
		||||
    begin
 | 
			
		||||
      //Just a simple restriction to disallow too easy passwords.
 | 
			
		||||
      //TODO: Configurable restrictions
 | 
			
		||||
      if Length(newPwd) >= 4 then
 | 
			
		||||
      begin
 | 
			
		||||
        //Everything fine, update the password and report success.
 | 
			
		||||
        ANetState.Account.UpdatePassword(newPwd);
 | 
			
		||||
        CEDServerInstance.SendPacket(ANetState,
 | 
			
		||||
          TPasswordChangeStatusPacket.Create(pcSuccess));
 | 
			
		||||
      end else
 | 
			
		||||
      begin
 | 
			
		||||
        CEDServerInstance.SendPacket(ANetState,
 | 
			
		||||
          TPasswordChangeStatusPacket.Create(pcNewPwInvalid));
 | 
			
		||||
      end;
 | 
			
		||||
    end else
 | 
			
		||||
    begin
 | 
			
		||||
      CEDServerInstance.SendPacket(ANetState,
 | 
			
		||||
        TPasswordChangeStatusPacket.Create(pcIdentical));
 | 
			
		||||
    end;
 | 
			
		||||
  end else
 | 
			
		||||
  begin
 | 
			
		||||
    CEDServerInstance.SendPacket(ANetState,
 | 
			
		||||
      TPasswordChangeStatusPacket.Create(pcOldPwInvalid));
 | 
			
		||||
  end;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure WriteAccountRestrictions(AStream: TEnhancedMemoryStream;
 | 
			
		||||
  AAccount: TAccount);
 | 
			
		||||
var
 | 
			
		||||
@ -236,6 +282,15 @@ begin
 | 
			
		||||
  WriteAccountRestrictions(FStream, AAccount);
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
{ TPasswordChangeStatusPacket }
 | 
			
		||||
 | 
			
		||||
constructor TPasswordChangeStatusPacket.Create(AResult: TPasswordChangeStatus);
 | 
			
		||||
begin
 | 
			
		||||
  inherited Create($0C, 0);
 | 
			
		||||
  FStream.WriteByte($08);
 | 
			
		||||
  FStream.WriteByte(Byte(AResult));
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
{$WARNINGS OFF}
 | 
			
		||||
var
 | 
			
		||||
  i: Integer;
 | 
			
		||||
@ -246,6 +301,7 @@ initialization
 | 
			
		||||
  ClientPacketHandlers[$04] := TPacketHandler.Create(0, @OnUpdateClientPosPacket);
 | 
			
		||||
  ClientPacketHandlers[$05] := TPacketHandler.Create(0, @OnChatMessagePacket);
 | 
			
		||||
  ClientPacketHandlers[$06] := TPacketHandler.Create(0, @OnGotoClientPosPacket);
 | 
			
		||||
  ClientPacketHandlers[$08] := TPacketHandler.Create(0, @OnChangePasswordPacket);
 | 
			
		||||
finalization
 | 
			
		||||
  for i := 0 to $FF do
 | 
			
		||||
    if ClientPacketHandlers[i] <> nil then
 | 
			
		||||
 | 
			
		||||
@ -21,7 +21,7 @@
 | 
			
		||||
 * CDDL HEADER END
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 *      Portions Copyright 2008 Andreas Schneider
 | 
			
		||||
 *      Portions Copyright 2013 Andreas Schneider
 | 
			
		||||
 *)
 | 
			
		||||
unit UConfig;
 | 
			
		||||
 | 
			
		||||
@ -30,8 +30,8 @@ unit UConfig;
 | 
			
		||||
interface
 | 
			
		||||
 | 
			
		||||
uses
 | 
			
		||||
  Classes, SysUtils, DOM, XMLRead, XMLWrite, md5, Keyboard, UAccount,
 | 
			
		||||
  UXmlHelper, UInterfaces, UEnums, URegions;
 | 
			
		||||
  Classes, SysUtils, DOM, XMLRead, XMLWrite, Keyboard, UAccount, UXmlHelper,
 | 
			
		||||
  UInterfaces, UEnums, URegions;
 | 
			
		||||
 | 
			
		||||
type
 | 
			
		||||
 | 
			
		||||
@ -292,8 +292,8 @@ begin
 | 
			
		||||
  until stringValue <> '';
 | 
			
		||||
  Write  ('Password [hidden]: ');
 | 
			
		||||
  password := QueryPassword;
 | 
			
		||||
  FAccounts.Add(TAccount.Create(FAccounts, stringValue,
 | 
			
		||||
    MD5Print(MD5String(password)), alAdministrator, nil));
 | 
			
		||||
  FAccounts.Add(TAccount.Create(FAccounts, stringValue, password,
 | 
			
		||||
    alAdministrator, nil));
 | 
			
		||||
  
 | 
			
		||||
  FChanged := True;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
@ -21,7 +21,7 @@
 | 
			
		||||
 * CDDL HEADER END
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 *      Portions Copyright 2008 Andreas Schneider
 | 
			
		||||
 *      Portions Copyright 2013 Andreas Schneider
 | 
			
		||||
 *)
 | 
			
		||||
unit UConnectionHandling;
 | 
			
		||||
 | 
			
		||||
@ -63,7 +63,7 @@ var
 | 
			
		||||
implementation
 | 
			
		||||
 | 
			
		||||
uses
 | 
			
		||||
  md5, UCEDServer, UClientHandling, UPackets;
 | 
			
		||||
  UCEDServer, UClientHandling, UPackets;
 | 
			
		||||
 | 
			
		||||
procedure OnConnectionHandlerPacket(ABuffer: TEnhancedMemoryStream; ANetState: TNetState);
 | 
			
		||||
var
 | 
			
		||||
@ -77,19 +77,19 @@ end;
 | 
			
		||||
procedure OnLoginRequestPacket(ABuffer: TEnhancedMemoryStream;
 | 
			
		||||
  ANetState: TNetState);
 | 
			
		||||
var
 | 
			
		||||
  username, passwordHash: string;
 | 
			
		||||
  username, password: string;
 | 
			
		||||
  account: TAccount;
 | 
			
		||||
  netState: TNetState;
 | 
			
		||||
  invalid: Boolean;
 | 
			
		||||
begin
 | 
			
		||||
  username := ABuffer.ReadStringNull;
 | 
			
		||||
  passwordHash := MD5Print(MD5String(ABuffer.ReadStringNull));
 | 
			
		||||
  password := ABuffer.ReadStringNull;
 | 
			
		||||
  account := Config.Accounts.Find(username);
 | 
			
		||||
  if account <> nil then
 | 
			
		||||
  begin
 | 
			
		||||
    if account.AccessLevel > alNone then
 | 
			
		||||
    begin
 | 
			
		||||
      if account.PasswordHash = passwordHash then
 | 
			
		||||
      if account.CheckPassword(password) then
 | 
			
		||||
      begin
 | 
			
		||||
        invalid := False;
 | 
			
		||||
        CEDServerInstance.TCPServer.IterReset;
 | 
			
		||||
 | 
			
		||||
@ -139,7 +139,7 @@ begin
 | 
			
		||||
    begin
 | 
			
		||||
      subscriptions := CEDServerInstance.Landscape.BlockSubscriptions[ACoords[i].X, ACoords[i].Y];
 | 
			
		||||
      subscriptions.Delete(ANetState);
 | 
			
		||||
      subscriptions.Add(Integer(ANetState), ANetState);
 | 
			
		||||
      subscriptions.Add(PtrInt(ANetState), ANetState);
 | 
			
		||||
      if ANetState.Subscriptions.IndexOf(subscriptions) = -1 then
 | 
			
		||||
        ANetState.Subscriptions.Add(subscriptions);
 | 
			
		||||
    end;
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,4 @@
 | 
			
		||||
<?xml version="1.0"?>
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<CONFIG>
 | 
			
		||||
  <ProjectOptions>
 | 
			
		||||
    <Version Value="9"/>
 | 
			
		||||
@ -13,9 +13,9 @@
 | 
			
		||||
    <VersionInfo>
 | 
			
		||||
      <UseVersionInfo Value="True"/>
 | 
			
		||||
      <MinorVersionNr Value="6"/>
 | 
			
		||||
      <RevisionNr Value="3"/>
 | 
			
		||||
      <RevisionNr Value="4"/>
 | 
			
		||||
      <BuildNr Value="240"/>
 | 
			
		||||
      <StringTable CompanyName="AKS DataBasis" ProductName="CentrED" InternalName="CentrED Server" LegalCopyright="(c) 2012 Andreas Schneider" ProductVersion="0.6.3" FileDescription="CentrED Server" OriginalFilename="cedserver.exe"/>
 | 
			
		||||
      <StringTable CompanyName="AKS DataBasis" FileDescription="CentrED Server" InternalName="CentrED Server" LegalCopyright="(c) 2013 Andreas Schneider" OriginalFilename="cedserver.exe" ProductName="CentrED" ProductVersion="0.6.4"/>
 | 
			
		||||
    </VersionInfo>
 | 
			
		||||
    <BuildModes Count="3">
 | 
			
		||||
      <Item1 Name="default" Default="True"/>
 | 
			
		||||
@ -69,7 +69,7 @@
 | 
			
		||||
      </Item2>
 | 
			
		||||
      <Item3 Name="Release Win32">
 | 
			
		||||
        <MacroValues Count="1">
 | 
			
		||||
          <Macro1 Name="LCLWidgetType" Value="win32"/>
 | 
			
		||||
          <Macro2 Name="LCLWidgetType" Value="win32"/>
 | 
			
		||||
        </MacroValues>
 | 
			
		||||
        <CompilerOptions>
 | 
			
		||||
          <Version Value="11"/>
 | 
			
		||||
@ -115,6 +115,10 @@
 | 
			
		||||
          </Other>
 | 
			
		||||
        </CompilerOptions>
 | 
			
		||||
      </Item3>
 | 
			
		||||
      <SharedMatrixOptions Count="2">
 | 
			
		||||
        <Item1 ID="285940101796" Modes="Release Linux i686" Type="IDEMacro" MacroName="LCLWidgetType" Value="gtk2"/>
 | 
			
		||||
        <Item2 ID="285439860087" Modes="Release Win32" Type="IDEMacro" MacroName="LCLWidgetType" Value="win32"/>
 | 
			
		||||
      </SharedMatrixOptions>
 | 
			
		||||
    </BuildModes>
 | 
			
		||||
    <PublishOptions>
 | 
			
		||||
      <Version Value="2"/>
 | 
			
		||||
@ -231,7 +235,6 @@
 | 
			
		||||
    <Parsing>
 | 
			
		||||
      <SyntaxOptions>
 | 
			
		||||
        <CStyleOperator Value="False"/>
 | 
			
		||||
        <UseAnsiStrings Value="False"/>
 | 
			
		||||
      </SyntaxOptions>
 | 
			
		||||
    </Parsing>
 | 
			
		||||
    <Linking>
 | 
			
		||||
 | 
			
		||||
@ -118,7 +118,7 @@ var
 | 
			
		||||
  length: Integer;
 | 
			
		||||
begin
 | 
			
		||||
  Result := '';
 | 
			
		||||
  buffer := Pointer(LongInt(Memory) + Position);
 | 
			
		||||
  buffer := Pointer(PtrInt(Memory) + Position);
 | 
			
		||||
  length := 0;
 | 
			
		||||
  while (buffer[length] <> #0) and (length < (Size - Position)) do
 | 
			
		||||
  begin
 | 
			
		||||
@ -138,7 +138,7 @@ var
 | 
			
		||||
  length: Integer;
 | 
			
		||||
begin
 | 
			
		||||
  Result := '';
 | 
			
		||||
  buffer := Pointer(LongInt(FMemory) + FPosition);
 | 
			
		||||
  buffer := Pointer(PtrInt(FMemory) + FPosition);
 | 
			
		||||
  length := 0;
 | 
			
		||||
  while (length < ALength) and (length < (FSize - (FPosition - FLockOffset))) do
 | 
			
		||||
  begin
 | 
			
		||||
@ -158,7 +158,7 @@ var
 | 
			
		||||
  length: Integer;
 | 
			
		||||
begin
 | 
			
		||||
  Result := '';
 | 
			
		||||
  buffer := Pointer(LongInt(FMemory) + FPosition);
 | 
			
		||||
  buffer := Pointer(PtrInt(FMemory) + FPosition);
 | 
			
		||||
  length := 0;
 | 
			
		||||
  while (buffer^[length] <> 0) and (length < (FSize - (FPosition - FLockOffset))) do
 | 
			
		||||
  begin
 | 
			
		||||
 | 
			
		||||
@ -57,6 +57,11 @@ type
 | 
			
		||||
  TDeleteRegionStatus = (drNotFound = 0,
 | 
			
		||||
                         drDeleted  = 1);
 | 
			
		||||
 | 
			
		||||
  TPasswordChangeStatus = (pcSuccess      = 0,
 | 
			
		||||
                           pcOldPwInvalid = 1,
 | 
			
		||||
                           pcNewPwInvalid = 2,
 | 
			
		||||
                           pcIdentical    = 3);
 | 
			
		||||
                       
 | 
			
		||||
function GetAccessLevelString(AAccessLevel: TAccessLevel): string;
 | 
			
		||||
 | 
			
		||||
implementation
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								bin/CentrED.dat
									
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								bin/CentrED.dat
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							@ -1,2 +1,2 @@
 | 
			
		||||
const
 | 
			
		||||
  ProtocolVersion = 6;
 | 
			
		||||
  ProtocolVersion = 7;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user