diff --git a/Client/CentrED.lpi b/Client/CentrED.lpi
index 02c97c4..ca7ca5c 100644
--- a/Client/CentrED.lpi
+++ b/Client/CentrED.lpi
@@ -40,7 +40,7 @@
-
+
@@ -164,6 +164,7 @@
+
@@ -218,6 +219,16 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/Client/CentrED.lpr b/Client/CentrED.lpr
index 21b295f..3def0b4 100644
--- a/Client/CentrED.lpr
+++ b/Client/CentrED.lpr
@@ -38,7 +38,8 @@ uses
UfrmElevateSettings, UOverlayUI, UResourceManager, UfrmConfirmation,
UfrmMoveSettings, UfrmAbout, UfrmHueSettings, UfrmRadar,
UfrmLargeScaleCommand, UfrmVirtualLayer, UfrmFilter, UfrmTileInfo,
- UGUIPlatformUtils, UPlatformTypes, UfrmRegionControl;
+ UGUIPlatformUtils, UPlatformTypes, UfrmRegionControl, UPackets,
+ UPacketHandlers;
{$IFDEF Windows}
{$R *.res}
diff --git a/Client/Tools/UfrmFilter.lfm b/Client/Tools/UfrmFilter.lfm
index 0c5dee7..92fbce8 100644
--- a/Client/Tools/UfrmFilter.lfm
+++ b/Client/Tools/UfrmFilter.lfm
@@ -11,6 +11,7 @@ object frmFilter: TfrmFilter
ClientWidth = 236
Font.Height = -11
OnCreate = FormCreate
+ OnDestroy = FormDestroy
OnShow = FormShow
LCLVersion = '0.9.25'
object rgFilterType: TRadioGroup
@@ -56,7 +57,7 @@ object frmFilter: TfrmFilter
object Label1: TLabel
Left = 4
Height = 28
- Top = 29
+ Top = 28
Width = 216
Align = alTop
BorderSpacing.Around = 4
@@ -69,15 +70,14 @@ object frmFilter: TfrmFilter
Tag = 1
Cursor = 63
Left = 4
- Height = 151
- Top = 61
+ Height = 152
+ Top = 60
Width = 216
Align = alClient
BorderSpacing.Around = 4
BorderStyle = bsSingle
DefaultNodeHeight = 44
DragType = dtVCL
- Header.Font.Height = -11
Header.Options = [hoColumnResize, hoDrag, hoVisible]
Header.ParentFont = True
Header.Style = hsFlatButtons
@@ -214,7 +214,7 @@ object frmFilter: TfrmFilter
end
object cbTileFilter: TCheckBox
Left = 4
- Height = 21
+ Height = 20
Top = 4
Width = 216
Align = alTop
@@ -240,7 +240,7 @@ object frmFilter: TfrmFilter
TabOrder = 2
object cbHueFilter: TCheckBox
Left = 4
- Height = 21
+ Height = 20
Top = 4
Width = 216
Align = alTop
@@ -252,14 +252,13 @@ object frmFilter: TfrmFilter
object vdtHues: TVirtualDrawTree
Cursor = 63
Left = 4
- Height = 118
- Top = 29
+ Height = 119
+ Top = 28
Width = 216
Align = alClient
BorderSpacing.Around = 4
BorderStyle = bsSingle
Header.AutoSizeIndex = 2
- Header.Font.Height = -11
Header.Options = [hoAutoResize, hoColumnResize, hoDrag, hoVisible]
Header.ParentFont = True
Header.Style = hsFlatButtons
diff --git a/Client/Tools/UfrmFilter.pas b/Client/Tools/UfrmFilter.pas
index 788daa2..9c59904 100644
--- a/Client/Tools/UfrmFilter.pas
+++ b/Client/Tools/UfrmFilter.pas
@@ -61,6 +61,7 @@ type
procedure btnClearClick(Sender: TObject);
procedure btnDeleteClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
+ procedure FormDestroy(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure mnuUncheckHuesClick(Sender: TObject);
procedure mnuCheckHuesClick(Sender: TObject);
@@ -308,6 +309,11 @@ begin
//FCheckedHues.Bits[0] := True;
end;
+procedure TfrmFilter.FormDestroy(Sender: TObject);
+begin
+ if FCheckedHues <> nil then FreeAndNil(FCheckedHues);
+end;
+
procedure TfrmFilter.btnDeleteClick(Sender: TObject);
begin
vdtFilter.DeleteSelectedNodes;
diff --git a/Client/UfrmAccountControl.lfm b/Client/UfrmAccountControl.lfm
index df38592..2fb7491 100644
--- a/Client/UfrmAccountControl.lfm
+++ b/Client/UfrmAccountControl.lfm
@@ -77,7 +77,6 @@ object frmAccountControl: TfrmAccountControl
Width = 369
Align = alClient
Header.AutoSizeIndex = 1
- Header.Font.Height = -11
Header.Options = [hoColumnResize, hoDrag, hoVisible]
Header.ParentFont = True
Header.Style = hsPlates
@@ -89,6 +88,7 @@ object frmAccountControl: TfrmAccountControl
TreeOptions.PaintOptions = [toShowButtons, toShowDropmark, toThemeAware, toUseBlendedImages]
TreeOptions.SelectionOptions = [toFullRowSelect]
OnDblClick = vstAccountsDblClick
+ OnFreeNode = vstAccountsFreeNode
OnGetText = vstAccountsGetText
OnGetImageIndex = vstAccountsGetImageIndex
Columns = <
diff --git a/Client/UfrmAccountControl.pas b/Client/UfrmAccountControl.pas
index 9a2434b..c4da68b 100644
--- a/Client/UfrmAccountControl.pas
+++ b/Client/UfrmAccountControl.pas
@@ -56,6 +56,7 @@ type
procedure tbDeleteUserClick(Sender: TObject);
procedure tbRefreshClick(Sender: TObject);
procedure vstAccountsDblClick(Sender: TObject);
+ procedure vstAccountsFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
procedure vstAccountsGetImageIndex(Sender: TBaseVirtualTree;
Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
var Ghosted: Boolean; var ImageIndex: Integer);
@@ -83,6 +84,7 @@ type
TAccountInfo = record
Username: string;
AccessLevel: TAccessLevel;
+ Regions: TStringList;
end;
{ TModifyUserPacket }
@@ -226,6 +228,16 @@ begin
tbEditUserClick(Sender);
end;
+procedure TfrmAccountControl.vstAccountsFreeNode(Sender: TBaseVirtualTree;
+ Node: PVirtualNode);
+var
+ accountInfo: PAccountInfo;
+begin
+ accountInfo := vstAccounts.GetNodeData(Node);
+ accountInfo^.Username := '';
+ if accountInfo^.Regions <> nil then FreeAndNil(accountInfo^.Regions);
+end;
+
procedure TfrmAccountControl.vstAccountsGetImageIndex(Sender: TBaseVirtualTree;
Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
var Ghosted: Boolean; var ImageIndex: Integer);
@@ -265,6 +277,7 @@ var
modifyStatus: TModifyUserStatus;
username: string;
accountInfo: PAccountInfo;
+ i, regions: Integer;
begin
modifyStatus := TModifyUserStatus(ABuffer.ReadByte);
username := ABuffer.ReadStringNull;
@@ -275,6 +288,11 @@ begin
accountInfo := vstAccounts.GetNodeData(node);
accountInfo^.Username := username;
accountInfo^.AccessLevel := TAccessLevel(ABuffer.ReadByte);
+ accountInfo^.Regions := TStringList.Create;
+ regions := ABuffer.ReadByte;
+ for i := 0 to regions - 1 do
+ accountInfo^.Regions.Add(ABuffer.ReadStringNull);
+
Messagedlg('Success', Format('The user "%s" has been added.', [username]),
mtInformation, [mbOK], 0);
end;
@@ -285,6 +303,11 @@ begin
begin
accountInfo := vstAccounts.GetNodeData(node);
accountInfo^.AccessLevel := TAccessLevel(ABuffer.ReadByte);
+ accountInfo^.Regions.Clear;
+ regions := ABuffer.ReadByte;
+ for i := 0 to regions - 1 do
+ accountInfo^.Regions.Add(ABuffer.ReadStringNull);
+
Messagedlg('Success', Format('The user "%s" has been modified.', [username]),
mtInformation, [mbOK], 0);
end;
@@ -325,7 +348,7 @@ procedure TfrmAccountControl.OnListUsersPacket(ABuffer: TEnhancedMemoryStream);
var
node: PVirtualNode;
accountInfo: PAccountInfo;
- i, count: Word;
+ i, j, count, regions: Word;
begin
vstAccounts.BeginUpdate;
vstAccounts.Clear;
@@ -336,6 +359,10 @@ begin
accountInfo := vstAccounts.GetNodeData(node);
accountInfo^.Username := ABuffer.ReadStringNull;
accountInfo^.AccessLevel := TAccessLevel(ABuffer.ReadByte);
+ accountInfo^.Regions := TStringList.Create;
+ regions := ABuffer.ReadByte;
+ for j := 0 to regions - 1 do
+ accountInfo^.Regions.Add(ABuffer.ReadStringNull);
end;
vstAccounts.EndUpdate;
end;
diff --git a/Client/UfrmEditAccount.lfm b/Client/UfrmEditAccount.lfm
index 6a5e54d..eaef55f 100644
--- a/Client/UfrmEditAccount.lfm
+++ b/Client/UfrmEditAccount.lfm
@@ -1,115 +1,180 @@
object frmEditAccount: TfrmEditAccount
Left = 290
- Height = 186
+ Height = 214
Top = 171
- Width = 266
- ActiveControl = edUsername
+ Width = 261
+ ActiveControl = PageControl1
BorderIcons = [biSystemMenu]
BorderStyle = bsDialog
Caption = 'Edit Account'
- ClientHeight = 186
- ClientWidth = 266
+ ClientHeight = 214
+ ClientWidth = 261
Font.Height = -11
Position = poOwnerFormCenter
LCLVersion = '0.9.25'
- object lblPasswordHint: TLabel
- Left = 96
- Height = 28
- Top = 72
- Width = 160
- AutoSize = False
- Caption = 'Leave empty to leave the password unchanged.'
- Enabled = False
- ParentColor = False
- ParentFont = True
- WordWrap = True
- end
- object lblUsername: TLabel
- Left = 16
- Height = 14
- Top = 20
- Width = 58
- Caption = 'Username:'
- ParentColor = False
- ParentFont = True
- end
- object lblPassword: TLabel
- Left = 16
- Height = 14
- Top = 52
- Width = 54
- Caption = 'Password:'
- ParentColor = False
- ParentFont = True
- end
- object lblAccessLevel: TLabel
- Left = 16
- Height = 14
- Top = 116
- Width = 63
- Caption = 'Accesslevel:'
- ParentColor = False
- ParentFont = True
- end
- object btnOK: TButton
- Left = 93
- Height = 25
- Top = 152
- Width = 75
- BorderSpacing.InnerBorder = 4
- Caption = 'OK'
- Default = True
- ModalResult = 1
+ object PageControl1: TPageControl
+ Height = 173
+ Width = 261
+ ActivePage = tsGeneral
+ Align = alClient
ParentFont = True
+ TabIndex = 0
TabOrder = 0
+ object tsGeneral: TTabSheet
+ Caption = 'General'
+ ClientHeight = 142
+ ClientWidth = 257
+ ParentFont = True
+ object lblPasswordHint: TLabel
+ Left = 86
+ Height = 28
+ Top = 64
+ Width = 160
+ AutoSize = False
+ Caption = 'Leave empty to leave the password unchanged.'
+ Enabled = False
+ ParentColor = False
+ ParentFont = True
+ WordWrap = True
+ end
+ object lblUsername: TLabel
+ Left = 6
+ Height = 13
+ Top = 12
+ Width = 64
+ Caption = 'Username:'
+ ParentColor = False
+ ParentFont = True
+ end
+ object lblPassword: TLabel
+ Left = 6
+ Height = 13
+ Top = 44
+ Width = 61
+ Caption = 'Password:'
+ ParentColor = False
+ ParentFont = True
+ end
+ object lblAccessLevel: TLabel
+ Left = 6
+ Height = 13
+ Top = 108
+ Width = 71
+ Caption = 'Accesslevel:'
+ ParentColor = False
+ ParentFont = True
+ end
+ object edUsername: TEdit
+ Left = 86
+ Height = 23
+ Top = 8
+ Width = 160
+ Color = clBtnFace
+ ParentFont = True
+ ReadOnly = True
+ TabOrder = 0
+ end
+ object edPassword: TEdit
+ Left = 86
+ Height = 23
+ Top = 40
+ Width = 160
+ EchoMode = emPassword
+ ParentFont = True
+ PasswordChar = '*'
+ TabOrder = 1
+ end
+ object cbAccessLevel: TComboBox
+ Left = 86
+ Height = 23
+ Top = 104
+ Width = 160
+ AutoCompleteText = [cbactEndOfLineComplete, cbactSearchAscending]
+ Items.Strings = (
+ 'None'
+ 'Viewer'
+ 'Normal'
+ 'Administrator'
+ )
+ MaxLength = 0
+ ParentFont = True
+ Style = csDropDownList
+ TabOrder = 2
+ end
+ end
+ object tsRegions: TTabSheet
+ Caption = 'Regions'
+ ClientHeight = 142
+ ClientWidth = 257
+ ParentFont = True
+ object Label1: TLabel
+ Left = 8
+ Height = 13
+ Top = 8
+ Width = 241
+ Align = alTop
+ BorderSpacing.Left = 8
+ BorderSpacing.Top = 8
+ BorderSpacing.Right = 8
+ BorderSpacing.Bottom = 4
+ Caption = 'Allowed Regions:'
+ ParentColor = False
+ ParentFont = True
+ end
+ object CheckListBox1: TCheckListBox
+ Left = 8
+ Height = 109
+ Top = 25
+ Width = 241
+ Align = alClient
+ BorderSpacing.Left = 8
+ BorderSpacing.Top = 4
+ BorderSpacing.Right = 8
+ BorderSpacing.Bottom = 8
+ ItemHeight = 10
+ ParentFont = True
+ TabOrder = 0
+ TopIndex = -1
+ end
+ end
end
- object btnCancel: TButton
- Left = 181
+ object Panel1: TPanel
+ Left = 8
Height = 25
- Top = 152
- Width = 75
- BorderSpacing.InnerBorder = 4
- Cancel = True
- Caption = 'Cancel'
- ModalResult = 2
+ Top = 181
+ Width = 245
+ Align = alBottom
+ BorderSpacing.Around = 8
+ BevelOuter = bvNone
+ ClientHeight = 25
+ ClientWidth = 245
ParentFont = True
TabOrder = 1
- end
- object edUsername: TEdit
- Left = 96
- Height = 23
- Top = 16
- Width = 160
- Color = clBtnFace
- ParentFont = True
- ReadOnly = True
- TabOrder = 2
- end
- object edPassword: TEdit
- Left = 96
- Height = 23
- Top = 48
- Width = 160
- EchoMode = emPassword
- ParentFont = True
- PasswordChar = '*'
- TabOrder = 3
- end
- object cbAccessLevel: TComboBox
- Left = 96
- Height = 29
- Top = 112
- Width = 160
- AutoCompleteText = [cbactEndOfLineComplete, cbactSearchAscending]
- Items.Strings = (
- 'None'
- 'Viewer'
- 'Normal'
- 'Administrator'
- )
- MaxLength = 0
- ParentFont = True
- Style = csDropDownList
- TabOrder = 4
+ object btnCancel: TButton
+ Left = 170
+ Height = 25
+ Width = 75
+ Align = alRight
+ BorderSpacing.Left = 4
+ BorderSpacing.InnerBorder = 4
+ Cancel = True
+ Caption = 'Cancel'
+ ModalResult = 2
+ ParentFont = True
+ TabOrder = 0
+ end
+ object btnOK: TButton
+ Left = 91
+ Height = 25
+ Width = 75
+ Align = alRight
+ BorderSpacing.Right = 4
+ BorderSpacing.InnerBorder = 4
+ Caption = 'OK'
+ Default = True
+ ModalResult = 1
+ ParentFont = True
+ TabOrder = 1
+ end
end
end
diff --git a/Client/UfrmEditAccount.pas b/Client/UfrmEditAccount.pas
index 97aa953..08ac44c 100644
--- a/Client/UfrmEditAccount.pas
+++ b/Client/UfrmEditAccount.pas
@@ -31,22 +31,28 @@ interface
uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls,
- UEnums;
+ UEnums, ComCtrls, ExtCtrls, CheckLst;
type
{ TfrmEditAccount }
- TfrmEditAccount = class(TForm)
- btnOK: TButton;
- btnCancel: TButton;
- cbAccessLevel: TComboBox;
- edUsername: TEdit;
- edPassword: TEdit;
- lblUsername: TLabel;
- lblPassword: TLabel;
- lblAccessLevel: TLabel;
- lblPasswordHint: TLabel;
+ TfrmEditAccount = class(TForm)
+ btnCancel: TButton;
+ btnOK: TButton;
+ cbAccessLevel: TComboBox;
+ CheckListBox1: TCheckListBox;
+ edPassword: TEdit;
+ edUsername: TEdit;
+ Label1: TLabel;
+ lblAccessLevel: TLabel;
+ lblPassword: TLabel;
+ lblPasswordHint: TLabel;
+ lblUsername: TLabel;
+ PageControl1: TPageControl;
+ Panel1: TPanel;
+ tsGeneral: TTabSheet;
+ tsRegions: TTabSheet;
public
function GetAccessLevel: TAccessLevel;
procedure SetAccessLevel(AAccessLevel: TAccessLevel);
diff --git a/Client/UfrmLargeScaleCommand.lfm b/Client/UfrmLargeScaleCommand.lfm
index 84d93c6..482b28b 100644
--- a/Client/UfrmLargeScaleCommand.lfm
+++ b/Client/UfrmLargeScaleCommand.lfm
@@ -1,11 +1,11 @@
object frmLargeScaleCommand: TfrmLargeScaleCommand
Left = 290
- Height = 390
+ Height = 397
Top = 171
Width = 620
- ActiveControl = vstActions
+ ActiveControl = vdtDeleteStaticsTiles
Caption = 'Large Scale Commands'
- ClientHeight = 390
+ ClientHeight = 397
ClientWidth = 620
Constraints.MinHeight = 390
Constraints.MinWidth = 620
@@ -18,21 +18,21 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
LCLVersion = '0.9.25'
object nbActions: TNotebook
Left = 152
- Height = 360
+ Height = 364
Width = 468
Align = alClient
- PageIndex = 5
+ PageIndex = 4
ParentFont = True
ShowTabs = False
TabOrder = 0
object pgArea: TPage
Caption = 'pgArea'
- ClientWidth = 464
- ClientHeight = 356
+ ClientWidth = 468
+ ClientHeight = 360
ParentFont = True
object sbArea: TScrollBox
- Height = 356
- Width = 464
+ Height = 360
+ Width = 468
Align = alClient
TabOrder = 0
object pbArea: TPaintBox
@@ -46,8 +46,8 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
end
object pgCopyMove: TPage
Caption = 'Copy/Move'
- ClientWidth = 464
- ClientHeight = 356
+ ClientWidth = 468
+ ClientHeight = 360
ParentFont = True
object rgCMAction: TRadioGroup
Left = 12
@@ -64,8 +64,8 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
ChildSizing.ShrinkVertical = crsScaleChilds
ChildSizing.Layout = cclLeftToRightThenTopToBottom
ChildSizing.ControlsPerLine = 2
- ClientHeight = 23
- ClientWidth = 180
+ ClientHeight = 40
+ ClientWidth = 184
Columns = 2
ItemIndex = 0
Items.Strings = (
@@ -132,8 +132,8 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
end
object pgModifyAltitude: TPage
Caption = 'Modify altitude'
- ClientWidth = 464
- ClientHeight = 356
+ ClientWidth = 468
+ ClientHeight = 360
ParentFont = True
object Label2: TLabel
Left = 28
@@ -218,18 +218,18 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
end
object pgDrawTerrain: TPage
Caption = 'Draw Terrain'
- ClientWidth = 464
- ClientHeight = 356
+ ClientWidth = 468
+ ClientHeight = 360
ParentFont = True
object gbDrawTerrainTiles: TGroupBox
Left = 8
- Height = 340
+ Height = 344
Top = 8
Width = 225
Align = alLeft
BorderSpacing.Around = 8
Caption = 'Tiles'
- ClientHeight = 323
+ ClientHeight = 328
ClientWidth = 221
ParentFont = True
TabOrder = 0
@@ -250,7 +250,7 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
Tag = 1
Cursor = 63
Left = 4
- Height = 231
+ Height = 236
Top = 62
Width = 213
Align = alClient
@@ -260,7 +260,6 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
DefaultNodeHeight = 44
DragMode = dmAutomatic
DragType = dtVCL
- Header.Font.Height = -11
Header.Options = [hoColumnResize, hoDrag, hoVisible]
Header.ParentFont = True
Header.Style = hsFlatButtons
@@ -289,7 +288,7 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
end
object pnlDrawTerrainTilesControls: TPanel
Height = 26
- Top = 297
+ Top = 302
Width = 221
Align = alBottom
BevelOuter = bvNone
@@ -399,23 +398,23 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
object pgDeleteStatics: TPage
Caption = 'Delete statics'
ClientWidth = 464
- ClientHeight = 356
+ ClientHeight = 360
ParentFont = True
object gbDeleteStaticsTiles: TGroupBox
Left = 8
- Height = 340
+ Height = 344
Top = 8
Width = 225
Align = alLeft
BorderSpacing.Around = 8
Caption = 'Tiles'
- ClientHeight = 323
+ ClientHeight = 327
ClientWidth = 221
ParentFont = True
TabOrder = 0
object lblDeleteStaticsTilesDesc: TLabel
Left = 4
- Height = 64
+ Height = 73
Width = 213
Align = alTop
BorderSpacing.Left = 4
@@ -423,13 +422,15 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
BorderSpacing.Bottom = 4
Caption = 'Drag statics tiles from the main window and drop them on the list. Only statics matching these tiles will be deleted. If the list is empty, every static will be deleted.'
ParentColor = False
+ ParentFont = True
WordWrap = True
end
object vdtDeleteStaticsTiles: TVirtualDrawTree
Tag = 1
+ Cursor = 63
Left = 4
- Height = 225
- Top = 68
+ Height = 220
+ Top = 77
Width = 213
Align = alClient
BorderSpacing.Left = 4
@@ -438,7 +439,6 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
DefaultNodeHeight = 44
DragMode = dmAutomatic
DragType = dtVCL
- Header.Font.Height = -11
Header.Options = [hoColumnResize, hoDrag, hoVisible]
Header.ParentFont = True
Header.Style = hsFlatButtons
@@ -467,7 +467,7 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
end
object pnlDrawTerrainTilesControls2: TPanel
Height = 26
- Top = 297
+ Top = 301
Width = 221
Align = alBottom
BevelOuter = bvNone
@@ -632,17 +632,17 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
object pgInsertStatics: TPage
Caption = 'Insert statics'
ClientWidth = 464
- ClientHeight = 356
+ ClientHeight = 360
ParentFont = True
object gbInserStaticsTiles: TGroupBox
Left = 8
- Height = 340
+ Height = 344
Top = 8
Width = 225
Align = alLeft
BorderSpacing.Around = 8
Caption = 'Tiles'
- ClientHeight = 323
+ ClientHeight = 327
ClientWidth = 221
ParentFont = True
TabOrder = 0
@@ -662,7 +662,7 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
object vdtInsertStaticsTiles: TVirtualDrawTree
Tag = 1
Left = 4
- Height = 231
+ Height = 235
Top = 62
Width = 213
Align = alClient
@@ -672,7 +672,6 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
DefaultNodeHeight = 44
DragMode = dmAutomatic
DragType = dtVCL
- Header.Font.Height = -11
Header.Options = [hoColumnResize, hoDrag, hoVisible]
Header.ParentFont = True
Header.Style = hsFlatButtons
@@ -701,7 +700,7 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
end
object pnlDrawTerrainTilesControls1: TPanel
Height = 26
- Top = 297
+ Top = 301
Width = 221
Align = alBottom
BevelOuter = bvNone
@@ -900,11 +899,11 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
end
end
object pnlLeft: TPanel
- Height = 360
+ Height = 364
Width = 152
Align = alLeft
BevelOuter = bvNone
- ClientHeight = 360
+ ClientHeight = 364
ClientWidth = 152
ParentFont = True
TabOrder = 1
@@ -924,7 +923,6 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
Height = 136
Width = 152
Align = alTop
- Header.Font.Height = -11
Header.Options = [hoAutoResize, hoVisible]
Header.ParentFont = True
Header.Style = hsFlatButtons
@@ -945,7 +943,7 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
object pnlAreaControls: TPanel
Left = 4
Height = 82
- Top = 274
+ Top = 278
Width = 144
Align = alBottom
BorderSpacing.Around = 4
@@ -1161,7 +1159,7 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
end
object vstArea: TVirtualStringTree
Left = 4
- Height = 121
+ Height = 125
Top = 149
Width = 144
Align = alClient
@@ -1180,22 +1178,23 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
end
end
object pnlControls: TPanel
- Height = 30
- Top = 360
- Width = 620
+ Left = 4
+ Height = 25
+ Top = 368
+ Width = 612
Align = alBottom
+ BorderSpacing.Around = 4
BevelOuter = bvNone
- ClientHeight = 30
- ClientWidth = 620
+ ClientHeight = 25
+ ClientWidth = 612
ParentFont = True
TabOrder = 2
object btnExecute: TButton
- Left = 484
- Height = 22
- Top = 4
+ Left = 480
+ Height = 25
Width = 64
Align = alRight
- BorderSpacing.Around = 4
+ BorderSpacing.Right = 4
BorderSpacing.InnerBorder = 4
Caption = 'Execute'
OnClick = btnExecuteClick
@@ -1203,12 +1202,11 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
TabOrder = 0
end
object btnClose: TButton
- Left = 552
- Height = 22
- Top = 4
+ Left = 548
+ Height = 25
Width = 64
Align = alRight
- BorderSpacing.Around = 4
+ BorderSpacing.Left = 4
BorderSpacing.InnerBorder = 4
Caption = 'Close'
OnClick = btnCloseClick
diff --git a/Client/UfrmLargeScaleCommand.pas b/Client/UfrmLargeScaleCommand.pas
index bd81305..d50b5a4 100644
--- a/Client/UfrmLargeScaleCommand.pas
+++ b/Client/UfrmLargeScaleCommand.pas
@@ -21,7 +21,7 @@
* CDDL HEADER END
*
*
- * Portions Copyright 2007 Andreas Schneider
+ * Portions Copyright 2008 Andreas Schneider
*)
unit UfrmLargeScaleCommand;
@@ -163,7 +163,7 @@ type
AStream: TEnhancedMemoryStream);
public
{ public declarations }
- end;
+ end;
var
frmLargeScaleCommand: TfrmLargeScaleCommand;
@@ -197,25 +197,25 @@ begin
AddNode(3, 'Delete statics');
AddNode(4, 'Insert statics');
vstActions.Selected[vstActions.GetFirst] := True;
-
+
vstArea.NodeDataSize := SizeOf(TRect);
-
+
pbArea.Width := frmRadarMap.Radar.Width;
pbArea.Height := frmRadarMap.Radar.Height;
seX1.MaxValue := ResMan.Landscape.CellWidth;
seX2.MaxValue := ResMan.Landscape.CellWidth;
seY1.MaxValue := ResMan.Landscape.CellHeight;
seY2.MaxValue := ResMan.Landscape.CellHeight;
-
+
vdtTerrainTiles.NodeDataSize := SizeOf(TTileInfo);
vdtInsertStaticsTiles.NodeDataSize := SizeOf(TTileInfo);
vdtDeleteStaticsTiles.NodeDataSize := SizeOf(TTileInfo);
-
+
seCMOffsetX.MinValue := -ResMan.Landscape.CellWidth;
seCMOffsetX.MaxValue := ResMan.Landscape.CellWidth;
seCMOffsetY.MinValue := -ResMan.Landscape.CellHeight;
seCMOffsetY.MaxValue := ResMan.Landscape.CellHeight;
-
+
frmRadarMap.Dependencies.Add(pbArea);
end;
@@ -385,7 +385,7 @@ begin
stream.WriteBoolean(cbCMEraseTarget.Checked);
end else
stream.WriteBoolean(False);
-
+
//Modify altitude
node := FindNode(1);
if vstActions.CheckState[node] = csCheckedNormal then
@@ -403,7 +403,7 @@ begin
end;
end else
stream.WriteBoolean(False);
-
+
//Draw terrain
node := FindNode(2);
if vstActions.CheckState[node] = csCheckedNormal then
@@ -412,7 +412,7 @@ begin
SerializeTiles(vdtTerrainTiles, stream);
end else
stream.WriteBoolean(False);
-
+
//Delete statics
node := FindNode(3);
if vstActions.CheckState[node] = csCheckedNormal then
@@ -423,7 +423,7 @@ begin
stream.WriteShortInt(Max(seDeleteStaticsZ1.Value, seDeleteStaticsZ2.Value));
end else
stream.WriteBoolean(False);
-
+
//Insert statics
node := FindNode(4);
if vstActions.CheckState[node] = csCheckedNormal then
@@ -441,7 +441,7 @@ begin
stream.WriteByte(2);
end else
stream.WriteBoolean(False);
-
+
dmNetwork.Send(TCompressedPacket.Create(packet));
Close;
end;
diff --git a/Client/UfrmLogin.lfm b/Client/UfrmLogin.lfm
index f4c9390..78115d3 100644
--- a/Client/UfrmLogin.lfm
+++ b/Client/UfrmLogin.lfm
@@ -16,8 +16,8 @@ object frmLogin: TfrmLogin
ShowInTaskBar = stAlways
LCLVersion = '0.9.25'
object lblCopyright: TLabel
- Height = 23
- Top = 242
+ Height = 24
+ Top = 241
Width = 489
Align = alBottom
Alignment = taCenter
@@ -427,7 +427,6 @@ object frmLogin: TfrmLogin
NumGlyphs = 1
ParentColor = False
ParentFont = True
- ReadOnly = True
TabOrder = 0
end
end
diff --git a/Client/UfrmMain.lfm b/Client/UfrmMain.lfm
index 7974867..2e79066 100644
--- a/Client/UfrmMain.lfm
+++ b/Client/UfrmMain.lfm
@@ -3,9 +3,9 @@ object frmMain: TfrmMain
Height = 603
Top = 144
Width = 766
- ActiveControl = cbTerrain
+ ActiveControl = pcLeft
Caption = 'UO CentrED'
- ClientHeight = 578
+ ClientHeight = 574
ClientWidth = 766
Constraints.MinHeight = 603
Constraints.MinWidth = 766
@@ -21,7 +21,7 @@ object frmMain: TfrmMain
WindowState = wsMaximized
object pnlBottom: TPanel
Height = 31
- Top = 547
+ Top = 543
Width = 766
Align = alBottom
BevelOuter = bvNone
@@ -31,25 +31,25 @@ object frmMain: TfrmMain
TabOrder = 0
object lblX: TLabel
Left = 11
- Height = 14
+ Height = 13
Top = 7
- Width = 11
+ Width = 12
Caption = 'X:'
ParentColor = False
ParentFont = True
end
object lblY: TLabel
Left = 88
- Height = 14
+ Height = 13
Top = 7
- Width = 10
+ Width = 12
Caption = 'Y:'
ParentColor = False
ParentFont = True
end
object lblTileInfo: TLabel
Left = 240
- Height = 14
+ Height = 13
Top = 7
Width = 4
Caption = ' '
@@ -57,9 +57,9 @@ object frmMain: TfrmMain
ParentFont = True
end
object lblTip: TLabel
- Left = 528
+ Left = 519
Height = 31
- Width = 230
+ Width = 239
Align = alRight
Alignment = taRightJustify
BorderSpacing.Right = 8
@@ -69,14 +69,15 @@ object frmMain: TfrmMain
ParentFont = True
end
object lblTipC: TLabel
- Left = 505
+ Left = 490
Height = 31
- Width = 23
+ Width = 29
Align = alRight
Caption = 'Tip: '
+ Font.Height = -11
+ Font.Style = [fsBold]
Layout = tlCenter
ParentColor = False
- ParentFont = True
end
object edX: TSpinEdit
Left = 24
@@ -109,7 +110,7 @@ object frmMain: TfrmMain
end
end
object pcLeft: TPageControl
- Height = 523
+ Height = 519
Top = 24
Width = 224
ActivePage = tsTiles
@@ -119,7 +120,7 @@ object frmMain: TfrmMain
TabOrder = 1
object tsTiles: TTabSheet
Caption = 'Tiles'
- ClientHeight = 494
+ ClientHeight = 488
ClientWidth = 220
ParentFont = True
object pnlTileListSettings: TPanel
@@ -133,18 +134,18 @@ object frmMain: TfrmMain
TabOrder = 0
object lblFilter: TLabel
Left = 84
- Height = 14
+ Height = 13
Top = 8
- Width = 30
+ Width = 33
Caption = 'Filter:'
ParentColor = False
ParentFont = True
end
object cbTerrain: TCheckBox
Left = 4
- Height = 21
+ Height = 20
Top = 8
- Width = 64
+ Width = 66
Caption = 'Terrain'
Checked = True
OnChange = cbTerrainChange
@@ -154,9 +155,9 @@ object frmMain: TfrmMain
end
object cbStatics: TCheckBox
Left = 4
- Height = 21
+ Height = 20
Top = 32
- Width = 63
+ Width = 64
Caption = 'Statics'
Checked = True
OnChange = cbStaticsChange
@@ -176,7 +177,7 @@ object frmMain: TfrmMain
end
object vdtTiles: TVirtualDrawTree
Tag = 1
- Height = 240
+ Height = 234
Top = 56
Width = 220
Align = alClient
@@ -184,7 +185,6 @@ object frmMain: TfrmMain
DragMode = dmAutomatic
DragType = dtVCL
Header.AutoSizeIndex = 2
- Header.Font.Height = -11
Header.MainColumn = 2
Header.Options = [hoVisible]
Header.ParentFont = True
@@ -221,24 +221,23 @@ object frmMain: TfrmMain
end
object gbRandom: TGroupBox
Height = 193
- Top = 301
+ Top = 295
Width = 220
Align = alBottom
Caption = 'Random pool'
- ClientHeight = 178
+ ClientHeight = 176
ClientWidth = 216
ParentFont = True
TabOrder = 2
object vdtRandom: TVirtualDrawTree
Tag = 1
Cursor = 63
- Height = 126
+ Height = 124
Top = 22
Width = 216
Align = alClient
DefaultNodeHeight = 44
DragType = dtVCL
- Header.Font.Height = -11
Header.Options = [hoColumnResize, hoDrag, hoVisible]
Header.ParentFont = True
Header.Style = hsFlatButtons
@@ -421,7 +420,7 @@ object frmMain: TfrmMain
object pnlRandomPreset: TPanel
Left = 4
Height = 22
- Top = 152
+ Top = 150
Width = 208
Align = alBottom
BorderSpacing.Around = 4
@@ -541,7 +540,7 @@ object frmMain: TfrmMain
object spTileList: TSplitter
Cursor = crVSplit
Height = 5
- Top = 296
+ Top = 290
Width = 220
Align = alBottom
ResizeAnchor = akBottom
@@ -564,12 +563,12 @@ object frmMain: TfrmMain
end
object tsClients: TTabSheet
Caption = 'Clients'
- ClientHeight = 494
- ClientWidth = 220
+ ClientHeight = 519
+ ClientWidth = 224
ParentFont = True
object lbClients: TListBox
- Height = 494
- Width = 220
+ Height = 519
+ Width = 224
Align = alClient
OnDblClick = mnuGoToClientClick
ParentFont = True
@@ -581,20 +580,19 @@ object frmMain: TfrmMain
end
object tsLocations: TTabSheet
Caption = 'Locations'
- ClientHeight = 494
- ClientWidth = 220
+ ClientHeight = 519
+ ClientWidth = 224
ParentFont = True
object vstLocations: TVirtualStringTree
Cursor = 63
Left = 4
- Height = 458
+ Height = 483
Top = 4
- Width = 212
+ Width = 216
Align = alClient
BorderSpacing.Around = 4
BorderStyle = bsSingle
Header.AutoSizeIndex = 1
- Header.Font.Height = -11
Header.Options = [hoAutoResize, hoColumnResize, hoDrag, hoVisible]
Header.ParentFont = True
Header.Style = hsFlatButtons
@@ -604,6 +602,7 @@ object frmMain: TfrmMain
TreeOptions.PaintOptions = [toShowButtons, toShowDropmark, toThemeAware, toUseBlendedImages]
TreeOptions.SelectionOptions = [toFullRowSelect]
OnDblClick = vstLocationsDblClick
+ OnFreeNode = vstLocationsFreeNode
OnGetText = vstLocationsGetText
OnLoadNode = vstLocationsLoadNode
OnNewText = vstLocationsNewText
@@ -615,20 +614,20 @@ object frmMain: TfrmMain
end
item
Position = 1
- Width = 133
+ Width = 141
WideText = 'Name'
end>
end
object pnlLocationControls: TPanel
Left = 4
Height = 24
- Top = 466
- Width = 212
+ Top = 491
+ Width = 216
Align = alBottom
BorderSpacing.Around = 4
BevelOuter = bvNone
ClientHeight = 24
- ClientWidth = 212
+ ClientWidth = 216
ParentFont = True
TabOrder = 1
object btnClearLocations: TSpeedButton
@@ -952,17 +951,17 @@ object frmMain: TfrmMain
end
object pnlMain: TPanel
Left = 224
- Height = 523
+ Height = 519
Top = 24
Width = 542
Align = alClient
BevelOuter = bvNone
- ClientHeight = 523
+ ClientHeight = 519
ClientWidth = 542
ParentFont = True
TabOrder = 3
object oglGameWindow: TOpenGLControl
- Height = 372
+ Height = 368
Width = 542
Align = alClient
OnDblClick = oglGameWindowDblClick
@@ -976,7 +975,7 @@ object frmMain: TfrmMain
end
object pnlChatHeader: TPanel
Height = 24
- Top = 372
+ Top = 368
Width = 542
Align = alBottom
BevelInner = bvRaised
@@ -1004,7 +1003,7 @@ object frmMain: TfrmMain
end
object pnlChat: TPanel
Height = 122
- Top = 401
+ Top = 397
Width = 542
Align = alBottom
BevelOuter = bvNone
@@ -1014,11 +1013,11 @@ object frmMain: TfrmMain
TabOrder = 1
Visible = False
object vstChat: TVirtualStringTree
+ Cursor = 63
Height = 99
Width = 542
Align = alClient
Header.AutoSizeIndex = 2
- Header.Font.Height = -11
Header.MainColumn = 2
Header.Options = [hoAutoResize, hoColumnResize, hoDrag, hoVisible]
Header.ParentFont = True
@@ -1060,7 +1059,7 @@ object frmMain: TfrmMain
object spChat: TSplitter
Cursor = crVSplit
Height = 5
- Top = 396
+ Top = 392
Width = 542
Align = alBottom
AutoSnap = False
@@ -1252,6 +1251,10 @@ object frmMain: TfrmMain
ImageIndex = 3
OnClick = mnuAccountControlClick
end
+ object mnuRegionControl: TMenuItem
+ Caption = '&Region Management'
+ OnClick = mnuRegionControlClick
+ end
object mnuLargeScaleCommands: TMenuItem
Caption = 'Large Scale Commands'
Bitmap.Data = {
diff --git a/Client/UfrmMain.pas b/Client/UfrmMain.pas
index 9ef4a22..829becb 100644
--- a/Client/UfrmMain.pas
+++ b/Client/UfrmMain.pas
@@ -252,6 +252,8 @@ type
const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
TextType: TVSTTextType);
procedure vstLocationsDblClick(Sender: TObject);
+ procedure vstLocationsFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode
+ );
procedure vstLocationsGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
procedure vstLocationsLoadNode(Sender: TBaseVirtualTree;
@@ -1406,6 +1408,15 @@ begin
end;
end;
+procedure TfrmMain.vstLocationsFreeNode(Sender: TBaseVirtualTree;
+ Node: PVirtualNode);
+var
+ locationInfo: PLocationInfo;
+begin
+ locationInfo := Sender.GetNodeData(Node);
+ locationInfo^.Name := '';
+end;
+
procedure TfrmMain.vstLocationsGetText(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
var CellText: WideString);
diff --git a/Client/UfrmRegionControl.lfm b/Client/UfrmRegionControl.lfm
index 3a25512..835fdf5 100644
--- a/Client/UfrmRegionControl.lfm
+++ b/Client/UfrmRegionControl.lfm
@@ -1,11 +1,11 @@
object frmRegionControl: TfrmRegionControl
- Left = 367
- Height = 390
- Top = 268
+ Left = 247
+ Height = 392
+ Top = 139
Width = 620
- ActiveControl = vstGroups
+ ActiveControl = vstRegions
Caption = 'Region Control'
- ClientHeight = 390
+ ClientHeight = 392
ClientWidth = 620
Font.Height = -11
OnCreate = FormCreate
@@ -14,11 +14,11 @@ object frmRegionControl: TfrmRegionControl
Position = poOwnerFormCenter
LCLVersion = '0.9.25'
object Panel1: TPanel
- Height = 360
+ Height = 359
Width = 160
- Anchors = [akTop, akLeft, akBottom]
+ Align = alLeft
Caption = 'Panel1'
- ClientHeight = 360
+ ClientHeight = 359
ClientWidth = 160
ParentFont = True
TabOrder = 0
@@ -37,7 +37,7 @@ object frmRegionControl: TfrmRegionControl
object pnlAreaControls: TPanel
Left = 5
Height = 82
- Top = 273
+ Top = 272
Width = 150
Align = alBottom
BorderSpacing.Around = 4
@@ -72,6 +72,7 @@ object frmRegionControl: TfrmRegionControl
Hint = 'Add area'
Width = 23
Color = clBtnFace
+ Enabled = False
Glyph.Data = {
36040000424D3604000000000000360000002800000010000000100000000100
2000000000000004000064000000640000000000000000000000000000000000
@@ -119,6 +120,7 @@ object frmRegionControl: TfrmRegionControl
Hint = 'Delete area'
Width = 23
Color = clBtnFace
+ Enabled = False
Glyph.Data = {
36040000424D3604000000000000360000002800000010000000100000000100
2000000000000004000064000000640000000000000000000000000000000000
@@ -166,6 +168,7 @@ object frmRegionControl: TfrmRegionControl
Hint = 'Delete all areas'
Width = 23
Color = clBtnFace
+ Enabled = False
Glyph.Data = {
36040000424D3604000000000000360000002800000010000000100000000100
2000000000000004000064000000640000000000000000000000000000000000
@@ -250,7 +253,7 @@ object frmRegionControl: TfrmRegionControl
end
object vstArea: TVirtualStringTree
Left = 5
- Height = 119
+ Height = 118
Top = 150
Width = 150
Align = alClient
@@ -268,46 +271,46 @@ object frmRegionControl: TfrmRegionControl
OnGetText = vstAreaGetText
Columns = <>
end
- object vstGroups: TVirtualStringTree
+ object vstRegions: TVirtualStringTree
Left = 1
Height = 136
Top = 1
Width = 158
Align = alTop
- Header.Font.Height = -11
Header.Options = [hoAutoResize, hoVisible]
Header.ParentFont = True
Header.Style = hsFlatButtons
ParentFont = True
- PopupMenu = pmGroup
+ PopupMenu = pmRegions
TabOrder = 2
TreeOptions.MiscOptions = [toCheckSupport, toFullRepaintOnResize, toInitOnSave, toToggleOnDblClick, toWheelPanning]
TreeOptions.PaintOptions = [toShowButtons, toShowDropmark, toThemeAware, toUseBlendedImages]
TreeOptions.SelectionOptions = [toFullRowSelect]
- OnChange = vstGroupsChange
- OnEditing = vstGroupsOnEditing
- OnGetText = vstGroupsGetText
- OnNewText = vstGroupsNewText
+ OnChange = vstRegionsChange
+ OnEditing = vstRegionsOnEditing
+ OnFreeNode = vstRegionsFreeNode
+ OnGetText = vstRegionsGetText
+ OnNewText = vstRegionsNewText
Columns = <
item
Width = 158
- WideText = 'Groups'
+ WideText = 'Regions'
end>
end
end
object Panel2: TPanel
Left = 160
- Height = 361
+ Height = 359
Width = 460
- Anchors = [akTop, akLeft, akRight, akBottom]
+ Align = alClient
Caption = 'Panel2'
- ClientHeight = 361
+ ClientHeight = 359
ClientWidth = 460
ParentFont = True
TabOrder = 1
object sbArea: TScrollBox
Left = 1
- Height = 359
+ Height = 357
Top = 1
Width = 458
Align = alClient
@@ -323,20 +326,24 @@ object frmRegionControl: TfrmRegionControl
end
end
object Panel3: TPanel
- Height = 30
- Top = 360
- Width = 620
- Anchors = [akLeft, akRight, akBottom]
- ClientHeight = 30
- ClientWidth = 620
+ Left = 4
+ Height = 25
+ Top = 363
+ Width = 612
+ Align = alBottom
+ BorderSpacing.Around = 4
+ BevelOuter = bvNone
+ ClientHeight = 25
+ ClientWidth = 612
ParentFont = True
TabOrder = 2
object btnExit: TButton
- Left = 551
- Height = 22
- Top = 4
+ Left = 548
+ Height = 25
Width = 64
+ Align = alRight
Anchors = [akTop, akRight]
+ BorderSpacing.Left = 4
Caption = 'Exit'
OnClick = btnCloseClick
ParentFont = True
@@ -344,10 +351,11 @@ object frmRegionControl: TfrmRegionControl
end
object btnSave: TButton
Left = 480
- Height = 22
- Top = 4
+ Height = 25
Width = 64
+ Align = alRight
Anchors = [akTop, akRight]
+ BorderSpacing.Right = 4
Caption = 'Save'
Enabled = False
OnClick = btnSaveClick
@@ -355,14 +363,14 @@ object frmRegionControl: TfrmRegionControl
TabOrder = 1
end
end
- object pmGroup: TPopupMenu
+ object pmRegions: TPopupMenu
left = 48
top = 43
- object mnuAddGroup: TMenuItem
+ object mnuAddRegion: TMenuItem
Caption = 'Add'
OnClick = acAddGroup
end
- object mnuRemoveGroup: TMenuItem
+ object mnuRemoveRegion: TMenuItem
Caption = 'Remove'
OnClick = accRemoveGroup
end
diff --git a/Client/UfrmRegionControl.pas b/Client/UfrmRegionControl.pas
index 8e4243b..579cbd9 100644
--- a/Client/UfrmRegionControl.pas
+++ b/Client/UfrmRegionControl.pas
@@ -32,8 +32,7 @@ interface
uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, CheckLst,
VirtualTrees, ExtCtrls, ImagingComponents, StdCtrls, Buttons, Spin, LCLIntf,
- math, UPlatformTypes, UEnhancedMemoryStream, Menus,contnrs, UInterfaces,
- URectList;
+ math, UPlatformTypes, UEnhancedMemoryStream, Menus, contnrs, URectList;
type
TAreaMoveType = (amLeft, amTop, amRight, amBottom);
@@ -50,20 +49,20 @@ type
Label1: TLabel;
lblX: TLabel;
lblY: TLabel;
- mnuAddGroup: TMenuItem;
- mnuRemoveGroup: TMenuItem;
+ mnuAddRegion: TMenuItem;
+ mnuRemoveRegion: TMenuItem;
Panel1: TPanel;
Panel2: TPanel;
Panel3: TPanel;
pbArea: TPaintBox;
pnlAreaControls: TPanel;
- pmGroup: TPopupMenu;
+ pmRegions: TPopupMenu;
sbArea: TScrollBox;
seX1: TSpinEdit;
seX2: TSpinEdit;
seY1: TSpinEdit;
seY2: TSpinEdit;
- vstGroups: TVirtualStringTree;
+ vstRegions: TVirtualStringTree;
vstArea: TVirtualStringTree;
procedure acAddGroup(Sender: TObject);
procedure accRemoveGroup(Sender: TObject);
@@ -84,12 +83,13 @@ type
procedure vstAreaChange(Sender: TBaseVirtualTree; Node: PVirtualNode);
procedure vstAreaGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
- procedure vstGroupsChange(Sender: TBaseVirtualTree; Node: PVirtualNode);
- procedure vstGroupsGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
+ procedure vstRegionsChange(Sender: TBaseVirtualTree; Node: PVirtualNode);
+ procedure vstRegionsFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
+ procedure vstRegionsGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
- procedure vstGroupsNewText(Sender: TBaseVirtualTree; Node: PVirtualNode;
+ procedure vstRegionsNewText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; const NewText: WideString);
- procedure vstGroupsOnEditing(Sender: TBaseVirtualTree; Node: PVirtualNode;
+ procedure vstRegionsOnEditing(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; var Allowed: Boolean);
protected
FLastX: Integer;
@@ -142,13 +142,13 @@ var
node: PVirtualNode;
regionInfo: PRegionInfo;
begin
- vstGroups.BeginUpdate;
- vstGroups.Clear;
+ vstRegions.BeginUpdate;
+ vstRegions.Clear;
regionCount := ABuffer.ReadByte;
for i := 0 to regionCount - 1 do
begin
- node := vstGroups.AddChild(nil);
- regionInfo := vstGroups.GetNodeData(node);
+ node := vstRegions.AddChild(nil);
+ regionInfo := vstRegions.GetNodeData(node);
regionInfo^.Name := ABuffer.ReadStringNull;
regionInfo^.Areas := TRectList.Create;
areaCount := ABuffer.ReadByte;
@@ -161,7 +161,7 @@ begin
regionInfo^.Areas.Add(x1, y1, x2, y2);
end;
end;
- vstGroups.EndUpdate;
+ vstRegions.EndUpdate;
end;
@@ -175,11 +175,11 @@ begin
seY2.MaxValue := ResMan.Landscape.CellHeight;
vstArea.NodeDataSize := SizeOf(TRect);
- vstGroups.NodeDataSize := SizeOf(TRegionInfo);
+ vstRegions.NodeDataSize := SizeOf(TRegionInfo);
frmRadarMap.Dependencies.Add(pbArea);
- AdminPacketHandlers[$09] := TPacketHandler.Create(0, @OnListRegionsPacket);
+ AdminPacketHandlers[$0A] := TPacketHandler.Create(0, @OnListRegionsPacket);
end;
procedure TfrmRegionControl.btnDeleteAreaClick(Sender: TObject);
@@ -187,11 +187,11 @@ var
infoGroup: PRegionInfo;
i: Integer;
begin
- if vstGroups.GetFirstSelected <> nil then
+ if vstRegions.GetFirstSelected <> nil then
begin
- infoGroup := vstGroups.GetNodeData(vstGroups.GetFirstSelected);
+ infoGroup := vstRegions.GetNodeData(vstRegions.GetFirstSelected);
infoGroup^.Areas.Delete(vstArea.AbsoluteIndex(vstArea.GetFirstSelected));
- vstGroupsChange(vstGroups, vstGroups.GetFirstSelected);
+ vstRegionsChange(vstRegions, vstRegions.GetFirstSelected);
end;
end;
@@ -209,15 +209,15 @@ begin
stream.Position := stream.Size;
stream.WriteByte($09);
- groupCount := Min(vstGroups.RootNodeCount, 255);
+ groupCount := Min(vstRegions.RootNodeCount, 255);
stream.WriteByte(groupCount);
if groupCount = 0 then Exit;
i := 0;
- node := vstGroups.GetFirst;
+ node := vstRegions.GetFirst;
while (node <> nil) and (i < groupCount) do
begin
- groupInfo := vstGroups.GetNodeData(node);
+ groupInfo := vstRegions.GetNodeData(node);
stream.WriteStringNull(groupInfo^.Name);
areaCount:=Min(groupInfo^.Areas.Count,255);
stream.WriteByte(areaCount);
@@ -229,7 +229,7 @@ begin
stream.WriteWord(Max(Left, Right));
stream.WriteWord(Max(Top, Bottom));
end;
- node := vstGroups.GetNext(node);
+ node := vstRegions.GetNext(node);
Inc(i);
end;
dmNetwork.Send(TCompressedPacket.Create(packet));
@@ -241,48 +241,53 @@ var
node : PVirtualNode;
infoGroup : PRegionInfo;
begin
- node := vstGroups.AddChild(nil);
- infoGroup := vstGroups.GetNodeData(node);
+ node := vstRegions.AddChild(nil);
+ infoGroup := vstRegions.GetNodeData(node);
infoGroup^.Name := 'Unnamed';
infoGroup^.Areas := TRectList.Create;
end;
procedure TfrmRegionControl.accRemoveGroup(Sender: TObject);
begin
- vstGroups.DeleteSelectedNodes;
- vstGroupsChange(vstGroups, nil);
+ vstRegions.DeleteSelectedNodes;
+ vstRegionsChange(vstRegions, nil);
end;
procedure TfrmRegionControl.btnAddAreaClick(Sender: TObject);
var
- node: PVirtualNode;
- nodeInfo: ^TRect;
- infoGroup : PRegionInfo;
+ node, selected: PVirtualNode;
+ areaInfo: ^TRect;
+ regionInfo: PRegionInfo;
begin
- infoGroup:=vstGroups.GetNodeData(vstGroups.GetFirstSelected);
- node := vstArea.AddChild(nil);
- nodeInfo := vstArea.GetNodeData(node);
- nodeInfo^.Left := 0;
- nodeInfo^.Top := 0;
- nodeInfo^.Right := 0;
- nodeInfo^.Bottom := 0;
- infoGroup^.Areas.Add(0, 0, 0, 0);
- vstArea.ClearSelection;
- vstArea.Selected[node] := True;
- vstArea.FocusedNode := node;
+ selected := vstRegions.GetFirstSelected;
+ if selected <> nil then
+ begin
+ regionInfo := vstRegions.GetNodeData(selected);
+ node := vstArea.AddChild(nil);
+ areaInfo := vstArea.GetNodeData(node);
+ areaInfo^.Left := 0;
+ areaInfo^.Top := 0;
+ areaInfo^.Right := 0;
+ areaInfo^.Bottom := 0;
+ regionInfo^.Areas.Add(0, 0, 0, 0);
+ vstArea.ClearSelection;
+ vstArea.Selected[node] := True;
+ vstArea.FocusedNode := node;
+ end;
end;
procedure TfrmRegionControl.btnClearAreaClick(Sender: TObject);
var
- infoGroup: PRegionInfo;
- infoArea : TRect;
+ regionNode: PVirtualNode;
+ regionInfo: PRegionInfo;
i: Integer;
begin
- if vstGroups.GetFirstSelected <> nil then
+ regionNode := vstRegions.GetFirstSelected;
+ if regionNode <> nil then
begin
- infoGroup := vstGroups.GetNodeData(vstGroups.GetFirstSelected);
- infoGroup^.Areas.Clear;
- vstGroupsChange(vstGroups, vstGroups.GetFirstSelected);
+ regionInfo := vstRegions.GetNodeData(regionNode);
+ regionInfo^.Areas.Clear;
+ vstRegionsChange(vstRegions, vstRegions.GetFirstSelected);
end;
end;
@@ -294,7 +299,7 @@ end;
procedure TfrmRegionControl.FormDestroy(Sender: TObject);
begin
frmRadarMap.Dependencies.Remove(pbArea);
- if AdminPacketHandlers[$09] <> nil then FreeAndNil(AdminPacketHandlers[$09]);
+ if AdminPacketHandlers[$0A] <> nil then FreeAndNil(AdminPacketHandlers[$0A]);
end;
procedure TfrmRegionControl.FormShow(Sender: TObject);
@@ -306,50 +311,50 @@ end;
procedure TfrmRegionControl.pbAreaMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
- node, match: PVirtualNode;
- nodeInfo: ^TRect;
+ areaNode, regionNode, match: PVirtualNode;
+ areaInfo: ^TRect;
p: TPoint;
i: Integer;
- infoArea: TRect;
- infoGroup: PRegionInfo;
+ regionInfo: PRegionInfo;
begin
FAreaMove := [];
p := Point(X * 8, Y * 8);
match := nil;
- node := vstArea.GetFirst;
- while node <> nil do
+ areaNode := vstArea.GetFirst;
+ while areaNode <> nil do //find the last matching area
begin
- nodeInfo := vstArea.GetNodeData(node);
- if PtInRect(nodeInfo^, p) then
- match := node;
- node := vstArea.GetNext(node);
+ areaInfo := vstArea.GetNodeData(areaNode);
+ if PtInRect(areaInfo^, p) then
+ match := areaNode;
+ areaNode := vstArea.GetNext(areaNode);
end;
if match <> nil then
begin
- nodeInfo := vstArea.GetNodeData(match);
- if p.x - nodeInfo^.Left <= 64 then Include(FAreaMove, amLeft);
- if p.y - nodeInfo^.Top <= 64 then Include(FAreaMove, amTop);
- if nodeInfo^.Right - p.x <= 64 then Include(FAreaMove, amRight);
- if nodeInfo^.Bottom - p.y <= 64 then Include(FAreaMove, amBottom);
+ areaInfo := vstArea.GetNodeData(match);
+ if p.x - areaInfo^.Left <= 64 then Include(FAreaMove, amLeft);
+ if p.y - areaInfo^.Top <= 64 then Include(FAreaMove, amTop);
+ if areaInfo^.Right - p.x <= 64 then Include(FAreaMove, amRight);
+ if areaInfo^.Bottom - p.y <= 64 then Include(FAreaMove, amBottom);
if FAreaMove = [] then
FAreaMove := [amLeft, amTop, amRight, amBottom];
end else
begin
- if vstGroups.GetFirstSelected <> nil then
- begin
- infoGroup:=vstGroups.GetNodeData(vstGroups.GetFirstSelected);
- match := vstArea.AddChild(nil);
- nodeInfo:=vstArea.GetNodeData(match);
- nodeInfo^.Left := p.x;
- nodeInfo^.Top := p.y;
- nodeInfo^.Right := p.x;
- nodeInfo^.Bottom := p.y;
- infoGroup^.Areas.Add(p.x, p.y, p.x, p.y);
+ regionNode := vstRegions.GetFirstSelected;
+ if regionNode <> nil then
+ begin
+ regionInfo := vstRegions.GetNodeData(regionNode);
+ match := vstArea.AddChild(nil);
+ areaInfo := vstArea.GetNodeData(match);
+ areaInfo^.Left := p.x;
+ areaInfo^.Top := p.y;
+ areaInfo^.Right := p.x;
+ areaInfo^.Bottom := p.y;
+ regionInfo^.Areas.Add(p.x, p.y, p.x, p.y);
- pbArea.Repaint;
+ pbArea.Repaint;
- FAreaMove := [amRight, amBottom];
- end;
+ FAreaMove := [amRight, amBottom];
+ end;
end;
vstArea.ClearSelection;
vstArea.Selected[match] := True;
@@ -380,7 +385,7 @@ procedure TfrmRegionControl.pbAreaPaint(Sender: TObject);
var
i: Integer;
node: PVirtualNode;
- nodeInfo: ^TRect;
+ areaInfo: ^TRect;
begin
DisplayImage(pbArea.Canvas, 0, 0, frmRadarMap.Radar);
pbArea.Canvas.Pen.Color := clRed;
@@ -398,9 +403,9 @@ begin
pbArea.Canvas.Pen.Width := 1;
pbArea.Canvas.Pen.Style := psDot;
end;
- nodeInfo := vstArea.GetNodeData(node);
- pbArea.Canvas.Rectangle(nodeInfo^.Left div 8, nodeInfo^.Top div 8,
- nodeInfo^.Right div 8 + 1, nodeInfo^.Bottom div 8 + 1);
+ areaInfo := vstArea.GetNodeData(node);
+ pbArea.Canvas.Rectangle(areaInfo^.Left div 8, areaInfo^.Top div 8,
+ areaInfo^.Right div 8 + 1, areaInfo^.Bottom div 8 + 1);
node := vstArea.GetNext(node);
end;
end;
@@ -408,19 +413,19 @@ end;
procedure TfrmRegionControl.seX1Change(Sender: TObject);
var
node: PVirtualNode;
- nodeInfo: ^TRect;
- infoGroup: PRegionInfo;
+ areaInfo: ^TRect;
+ regionInfo: PRegionInfo;
begin
node := vstArea.GetFirstSelected;
if node <> nil then
begin
- nodeInfo := vstArea.GetNodeData(node);
- nodeInfo^.Left := seX1.Value;
- nodeInfo^.Right := seX2.Value;
- nodeInfo^.Top := seY1.Value;
- nodeInfo^.Bottom := seY2.Value;
- infoGroup:= vstGroups.GetNodeData(vstGroups.GetFirstSelected);
- infoGroup^.Areas.Rects[vstArea.AbsoluteIndex(node)] := nodeinfo^;
+ areaInfo := vstArea.GetNodeData(node);
+ areaInfo^.Left := seX1.Value;
+ areaInfo^.Right := seX2.Value;
+ areaInfo^.Top := seY1.Value;
+ areaInfo^.Bottom := seY2.Value;
+ regionInfo:= vstRegions.GetNodeData(vstRegions.GetFirstSelected);
+ regionInfo^.Areas.Rects[vstArea.AbsoluteIndex(node)] := areaInfo^;
vstArea.InvalidateNode(node);
pbArea.Repaint;
end;
@@ -429,7 +434,7 @@ end;
procedure TfrmRegionControl.vstAreaChange(Sender: TBaseVirtualTree;
Node: PVirtualNode);
var
- nodeInfo: ^TRect;
+ areaInfo: ^TRect;
selected: Boolean;
begin
selected := (Node <> nil) and Sender.Selected[Node];
@@ -442,82 +447,92 @@ begin
seY2.Enabled := selected;
if selected then
begin
- nodeInfo := Sender.GetNodeData(Node);
- seX1.Value := nodeInfo^.Left;
- seX2.Value := nodeInfo^.Right;
- seY1.Value := nodeInfo^.Top;
- seY2.Value := nodeInfo^.Bottom;
+ areaInfo := Sender.GetNodeData(Node);
+ seX1.Value := areaInfo^.Left;
+ seX2.Value := areaInfo^.Right;
+ seY1.Value := areaInfo^.Top;
+ seY2.Value := areaInfo^.Bottom;
end;
+ pbArea.Repaint;
end;
procedure TfrmRegionControl.vstAreaGetText(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
var CellText: WideString);
var
- nodeInfo: ^TRect;
+ areaInfo: ^TRect;
begin
- nodeInfo := Sender.GetNodeData(Node);
- CellText := Format('(%d, %d), (%d, %d)', [nodeInfo^.Left, nodeInfo^.Top,
- nodeInfo^.Right, nodeInfo^.Bottom]);
+ areaInfo := Sender.GetNodeData(Node);
+ CellText := Format('(%d, %d), (%d, %d)', [areaInfo^.Left, areaInfo^.Top,
+ areaInfo^.Right, areaInfo^.Bottom]);
end;
-procedure TfrmRegionControl.vstGroupsChange(Sender: TBaseVirtualTree;
+procedure TfrmRegionControl.vstRegionsChange(Sender: TBaseVirtualTree;
Node: PVirtualNode);
var
i: Integer;
- nodeArea: PVirtualNode;
- infoGroup: PRegionInfo;
- infoArea: ^TRect;
- Area: ^TRect;
+ areaNode: PVirtualNode;
+ regionInfo: PRegionInfo;
+ areaInfo: ^TRect;
begin
vstArea.BeginUpdate;
vstArea.Clear;
if Node <> nil then
- begin {TODO : code style!!!!}
- infoGroup:=Sender.GetNodeData(Node);
- for i:=0 to infoGroup^.Areas.Count-1 do
+ begin
+ regionInfo := Sender.GetNodeData(Node);
+ for i := 0 to regionInfo^.Areas.Count - 1 do
begin
- nodeArea := vstArea.AddChild(nil);
- infoArea := vstArea.GetNodeData(nodeArea);
- Area := infoGroup^.Areas[i];
- infoArea^.Left := Area^.Left;
- infoArea^.Top := Area^.Top;
- infoArea^.Right := Area^.Right;
- infoArea^.Bottom := Area^.Bottom;
+ areaNode := vstArea.AddChild(nil);
+ areaInfo := vstArea.GetNodeData(areaNode);
+ with regionInfo^.Areas.Rects[i] do
+ begin
+ areaInfo^.Left := Left;
+ areaInfo^.Top := Top;
+ areaInfo^.Right := Right;
+ areaInfo^.Bottom := Bottom;
+ end;
end;
end;
vstArea.EndUpdate;
pbArea.Repaint;
end;
-procedure TfrmRegionControl.vstGroupsGetText(Sender: TBaseVirtualTree;
+procedure TfrmRegionControl.vstRegionsFreeNode(Sender: TBaseVirtualTree;
+ Node: PVirtualNode);
+var
+ regionInfo: PRegionInfo;
+begin
+ regionInfo := Sender.GetNodeData(Node);
+ if regionInfo^.Areas <> nil then FreeAndNil(regionInfo^.Areas);
+end;
+
+procedure TfrmRegionControl.vstRegionsGetText(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
var CellText: WideString);
var
- nodeInfo: PRegionInfo;
+ regionInfo: PRegionInfo;
begin
- nodeInfo := Sender.GetNodeData(Node);
- CellText := nodeInfo^.Name;
+ regionInfo := Sender.GetNodeData(Node);
+ CellText := regionInfo^.Name;
end;
-procedure TfrmRegionControl.vstGroupsNewText(Sender: TBaseVirtualTree;
+procedure TfrmRegionControl.vstRegionsNewText(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; const NewText: WideString);
var
- nodeInfo: PRegionInfo;
+ regionInfo: PRegionInfo;
begin
if (Node <> nil) then begin
- nodeInfo := Sender.GetNodeData(Node);
- nodeInfo^.Name := NewText;
+ regionInfo := Sender.GetNodeData(Node);
+ regionInfo^.Name := NewText;
end;
end;
-procedure TfrmRegionControl.vstGroupsOnEditing(Sender: TBaseVirtualTree;
+procedure TfrmRegionControl.vstRegionsOnEditing(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; var Allowed: Boolean);
begin
Allowed := True;
end;
-
initialization
{$I UfrmRegionControl.lrs}
diff --git a/Server/UAccount.pas b/Server/UAccount.pas
index 29a37c4..c4c60fe 100644
--- a/Server/UAccount.pas
+++ b/Server/UAccount.pas
@@ -32,7 +32,7 @@ interface
uses
Classes, SysUtils, md5, contnrs, math, DOM, UXmlHelper, UInterfaces,
UEnums, URegions;
-
+
type
{ TAccount }
@@ -41,6 +41,7 @@ type
constructor Create(AOwner: IInvalidate; AName, APasswordHash: string;
AAccessLevel: TAccessLevel; ARegions: TStringList);
constructor Deserialize(AOwner: IInvalidate; AElement: TDOMElement);
+ destructor Destroy; override;
procedure Serialize(AElement: TDOMElement);
protected
FOwner: IInvalidate;
@@ -60,7 +61,7 @@ type
property Regions: TStringList read FRegions;
procedure Invalidate;
end;
-
+
{ TAccountList }
TAccountList = class(TObjectList, ISerializable, IInvalidate)
@@ -113,7 +114,7 @@ begin
FLastPos := Point(0, 0);
TXmlHelper.ReadCoords(AElement, 'LastPos', FLastPos.X, FLastPos.Y);
FRegions := TStringList.Create;
-
+
xmlElement := TDOMElement(AElement.FindNode('Regions'));
if xmlElement <> nil then
begin
@@ -131,6 +132,12 @@ begin
end;
end;
+destructor TAccount.Destroy;
+begin
+ if FRegions <> nil then FreeAndNil(FRegions);
+ inherited Destroy;
+end;
+
procedure TAccount.SetAccessLevel(const AValue: TAccessLevel);
begin
FAccessLevel := AValue;
@@ -157,8 +164,8 @@ end;
procedure TAccount.Serialize(AElement: TDOMElement);
var
- i : Integer;
- child : TDOMElement;
+ i: Integer;
+ child: TDOMElement;
begin
TXmlHelper.WriteString(AElement, 'Name', FName);
TXmlHelper.WriteString(AElement, 'PasswordHash', FPasswordHash);
diff --git a/Server/UAdminHandling.pas b/Server/UAdminHandling.pas
index f77c975..f194acc 100644
--- a/Server/UAdminHandling.pas
+++ b/Server/UAdminHandling.pas
@@ -32,7 +32,7 @@ interface
uses
Classes, SysUtils, math, UPacket, UPacketHandlers, UConfig, UAccount,
UNetState, UEnhancedMemoryStream, UEnums, URegions;
-
+
type
{ TModifyUserResponsePacket }
@@ -40,13 +40,13 @@ type
TModifyUserResponsePacket = class(TPacket)
constructor Create(AStatus: TModifyUserStatus; AAccount: TAccount);
end;
-
+
{ TDeleteUserResponsePacket }
TDeleteUserResponsePacket = class(TPacket)
constructor Create(AStatus: TDeleteUserStatus; AUsername: string);
end;
-
+
{ TUserListPacket }
TUserListPacket = class(TPacket)
@@ -64,13 +64,13 @@ type
TDeleteRegionResponsePacket = class(TPacket)
constructor Create(AStatus: TDeleteRegionStatus; ARegionName: string);
end;
-
+
{ TUserRegionsPacket }
TRegionListPacket = class(TPacket)
constructor Create;
end;
-
+
procedure OnAdminHandlerPacket(ABuffer: TEnhancedMemoryStream; ANetState: TNetState);
procedure OnFlushPacket(ABuffer: TEnhancedMemoryStream; ANetState: TNetState);
procedure OnQuitPacket(ABuffer: TEnhancedMemoryStream; ANetState: TNetState);
@@ -302,10 +302,8 @@ begin
begin
FStream.WriteByte(Byte(AAccount.AccessLevel));
FStream.WriteByte(AAccount.Regions.Count);
- if AAccount.Regions.Count > 0 then begin
- for i := 0 to AAccount.Regions.Count - 1 do
- FStream.WriteStringNull(AAccount.Regions[i]);
- end;
+ for i := 0 to AAccount.Regions.Count - 1 do
+ FStream.WriteStringNull(AAccount.Regions[i]);
end;
{TODO : check for client side modifications!}
end;
@@ -339,9 +337,6 @@ begin
for j := 0 to account.Regions.Count - 1 do
FStream.WriteStringNull(account.Regions[j]);
end;
- FStream.WriteWord(Config.Regions.Count);
- for i := 0 to Config.Regions.Count - 1 do
- FStream.WriteStringNull(TRegion(Config.Regions.Items[i]).Name);
end;
{ TModifyRegionResponsePacket }
@@ -389,7 +384,7 @@ var
region: TRegion;
begin
inherited Create($03, 0);
- FStream.WriteByte($08);
+ FStream.WriteByte($0A);
FStream.WriteByte(Config.Regions.Count);
for i := 0 to Config.Regions.Count - 1 do
begin