- Fixed memory leak in TfrmFilter (not freeing FCheckedHues)

- Fixed memory leak in TfrmMain (not freeing the strings in the location info nodes)
- Rearranged frmEditAccount to allow region handling
- Added region handling to the client side account specific network packets
- Fixed some more code style inconsistencies in UfrmRegionControl.pas
- Fixed redrawing in TfrmRegionControl
- Fixed memory leak in TAccount (not freeing FRegions)
- Fixed the TModifyRegionResponsePacket ID
- Fixed the content of the TUserListPacket to not contain the list of all regions
This commit is contained in:
Andreas Schneider 2008-08-17 20:12:36 +02:00
parent c7d845997e
commit d5069bbb50
17 changed files with 570 additions and 419 deletions

View File

@ -40,7 +40,7 @@
<MinVersion Major="4" Minor="5" Release="1" Valid="True"/>
</Item4>
</RequiredPackages>
<Units Count="24">
<Units Count="26">
<Unit0>
<Filename Value="CentrED.lpr"/>
<IsPartOfProject Value="True"/>
@ -164,6 +164,7 @@
<Filename Value="UfrmRadar.pas"/>
<ComponentName Value="frmRadarMap"/>
<IsPartOfProject Value="True"/>
<ResourceBaseClass Value="Form"/>
<ResourceFilename Value="UfrmRadar.lrs"/>
<UnitName Value="UfrmRadar"/>
</Unit16>
@ -218,6 +219,16 @@
<ResourceFilename Value="UfrmRegionControl.lrs"/>
<UnitName Value="UfrmRegionControl"/>
</Unit23>
<Unit24>
<Filename Value="UPacketHandlers.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="UPacketHandlers"/>
</Unit24>
<Unit25>
<Filename Value="UPackets.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="UPackets"/>
</Unit25>
</Units>
</ProjectOptions>
<CompilerOptions>

View File

@ -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}

View File

@ -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

View File

@ -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;

View File

@ -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 = <

View File

@ -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;

View File

@ -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

View File

@ -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);

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -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 = {

View File

@ -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);

View File

@ -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

View File

@ -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}

View File

@ -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);

View File

@ -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