From 1f1f5ac7b4389ba469e0a7df8429759bd88bd8fe Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Mon, 3 Aug 2009 19:32:03 +0200 Subject: [PATCH] - Added TLandscape.OnMapChanged to handle changes to map tiles - Reenabled terrain, statics, nodraw and flat toggles - Fixed editing target list generation (in OnMouseUp) to only consider "normal" tiles, use their correct new order and the CanBeEdited attribute - Removed obsolete TfrmMain.CanBeModified --- Client/ULandscape.pas | 5 ++- Client/UfrmMain.lfm | 2 ++ Client/UfrmMain.pas | 72 +++++++++++++++++++++++++++++++++++-------- 3 files changed, 65 insertions(+), 14 deletions(-) diff --git a/Client/ULandscape.pas b/Client/ULandscape.pas index fa9b56d..2a797b9 100644 --- a/Client/ULandscape.pas +++ b/Client/ULandscape.pas @@ -115,6 +115,7 @@ type end; TLandscapeChangeEvent = procedure of object; + TMapChangedEvent = procedure(AMapCell: TMapCell) of object; TNewBlockEvent = procedure(ABlock: TBlock) of object; TStaticChangedEvent = procedure(AStaticItem: TStaticItem) of object; TStaticFilter = function(AStatic: TStaticItem): Boolean of object; @@ -134,6 +135,7 @@ type FCellHeight: Word; FBlockCache: TCacheManager; FOnChange: TLandscapeChangeEvent; + FOnMapChanged: TMapChangedEvent; FOnNewBlock: TNewBlockEvent; FOnStaticInserted: TStaticChangedEvent; FOnStaticDeleted: TStaticChangedEvent; @@ -165,6 +167,7 @@ type property StaticList[X, Y: Word]: TList read GetStaticList; property Normals[X, Y: Word]: TNormals read GetNormals; property OnChange: TLandscapeChangeEvent read FOnChange write FOnChange; + property OnMapChanged: TMapChangedEvent read FOnMapChanged write FOnMapChanged; property OnNewBlock: TNewBlockEvent read FOnNewBlock write FOnNewBlock; property OnStaticInserted: TStaticChangedEvent read FOnStaticInserted write FOnStaticInserted; @@ -648,7 +651,7 @@ begin begin cell.Altitude := ABuffer.ReadShortInt; cell.TileID := ABuffer.ReadWord; - if Assigned(FOnChange) then FOnChange; + if Assigned(FOnMapChanged) then FOnMapChanged(cell); end; //TODO : update surrounding normals end; diff --git a/Client/UfrmMain.lfm b/Client/UfrmMain.lfm index 81bc621..99d130b 100644 --- a/Client/UfrmMain.lfm +++ b/Client/UfrmMain.lfm @@ -946,6 +946,7 @@ object frmMain: TfrmMain ParentShowHint = False ShowHint = True Style = tbsCheck + OnClick = tbTerrainClick end object tbStatics: TToolButton Left = 300 @@ -957,6 +958,7 @@ object frmMain: TfrmMain ParentShowHint = False ShowHint = True Style = tbsCheck + OnClick = tbStaticsClick end object tbSeparator4: TToolButton Left = 369 diff --git a/Client/UfrmMain.pas b/Client/UfrmMain.pas index c6ceba6..cf4939a 100644 --- a/Client/UfrmMain.pas +++ b/Client/UfrmMain.pas @@ -34,7 +34,7 @@ uses ComCtrls, OpenGLContext, GL, GLU, UGameResources, ULandscape, ExtCtrls, StdCtrls, Spin, UEnums, VirtualTrees, Buttons, UMulBlock, UWorldItem, math, LCLIntf, UOverlayUI, UStatics, UEnhancedMemoryStream, ActnList, - ImagingClasses, dateutils, UPlatformTypes, UVector; + ImagingClasses, dateutils, UPlatformTypes, UVector, UMap; type @@ -217,6 +217,8 @@ type procedure tbFilterMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure tbRadarMapClick(Sender: TObject); + procedure tbStaticsClick(Sender: TObject); + procedure tbTerrainClick(Sender: TObject); procedure tmGrabTileInfoTimer(Sender: TObject); procedure tmMovementTimer(Sender: TObject); procedure tmTileHintTimer(Sender: TObject); @@ -288,7 +290,6 @@ type FAccessChangedListeners: array of TAccessChangedListener; { Methods } procedure BuildTileList; - function CanBeModified(ATile: TWorldItem): Boolean; function ConfirmAction: Boolean; procedure GetDrawOffset(ARelativeX, ARelativeY: Integer; out DrawX, DrawY: Single); inline; @@ -316,6 +317,7 @@ type { Events } procedure OnClientHandlingPacket(ABuffer: TEnhancedMemoryStream); procedure OnLandscapeChanged; + procedure OnMapChanged(AMapCell: TMapCell); procedure OnNewBlock(ABlock: TBlock); procedure OnStaticDeleted(AStaticItem: TStaticItem); procedure OnStaticElevated(AStaticItem: TStaticItem); @@ -341,7 +343,7 @@ var implementation uses - UdmNetwork, UMap, UArt, UTiledata, UHue, UAdminHandling, UPackets, + UdmNetwork, UArt, UTiledata, UHue, UAdminHandling, UPackets, UfrmAccountControl, UGraphicHelper, ImagingComponents, UfrmDrawSettings, UfrmBoundaries, UfrmElevateSettings, UfrmConfirmation, UfrmMoveSettings, UfrmAbout, UPacketHandlers, UfrmHueSettings, UfrmRadar, UfrmLargeScaleCommand, @@ -590,7 +592,7 @@ begin end; end; end; - end else if (SelectedTile <> targetTile) or CanBeModified(targetTile) then + end else if (SelectedTile <> targetTile) or targetTile.CanBeEdited then begin if (not acMove.Checked) or (SelectedTile <> targetTile) or (not frmMoveSettings.cbAsk.Checked) or ConfirmAction then @@ -604,9 +606,12 @@ begin blockInfo := nil; while FScreenBuffer.Iterate(blockInfo) do begin - if PtInRect(targetRect, Point(blockInfo^.Item.X, blockInfo^.Item.Y)) and - CanBeModified(blockInfo^.Item) then - targetTiles.Insert(0, blockInfo^.Item); + if (blockInfo^.State = ssNormal) and + blockInfo^.Item.CanBeEdited and + PtInRect(targetRect, Point(blockInfo^.Item.X, blockInfo^.Item.Y)) then + begin + targetTiles.Add(blockInfo^.Item); + end; end; end; @@ -724,6 +729,7 @@ var begin FLandscape := ResMan.Landscape; FLandscape.OnChange := @OnLandscapeChanged; + FLandscape.OnMapChanged := @OnMapChanged; FLandscape.OnNewBlock := @OnNewBlock; FLandscape.OnStaticDeleted := @OnStaticDeleted; FLandscape.OnStaticElevated := @OnStaticElevated; @@ -931,6 +937,7 @@ end; procedure TfrmMain.acFlatExecute(Sender: TObject); begin acFlat.Checked := not acFlat.Checked; + RebuildScreenBuffer; end; procedure TfrmMain.acHueExecute(Sender: TObject); @@ -958,6 +965,7 @@ end; procedure TfrmMain.acNoDrawExecute(Sender: TObject); begin acNoDraw.Checked := not acNoDraw.Checked; + RebuildScreenBuffer; end; procedure TfrmMain.btnClearRandomClick(Sender: TObject); @@ -1202,6 +1210,16 @@ begin frmRadarMap.BringToFront; end; +procedure TfrmMain.tbStaticsClick(Sender: TObject); +begin + RebuildScreenBuffer; +end; + +procedure TfrmMain.tbTerrainClick(Sender: TObject); +begin + RebuildScreenBuffer; +end; + procedure TfrmMain.tmGrabTileInfoTimer(Sender: TObject); begin tmGrabTileInfo.Enabled := False; @@ -1685,6 +1703,7 @@ begin if item is TMapCell then begin + ABlockInfo^.HighRes := nil; if not acFlat.Checked then begin west := FLandscape.GetLandAlt(item.X, item.Y + 1, z); @@ -2027,6 +2046,39 @@ begin UpdateCurrentTile; end; +procedure TfrmMain.OnMapChanged(AMapCell: TMapCell); +var + current, north, east, west: PBlockInfo; + cell: TMapCell; +begin + PrepareScreenBlock(FScreenBuffer.UpdateSortOrder(AMapCell)); + FScreenBufferIndexed := False; + + //Find surrounding cells + current := nil; + north := nil; + east := nil; + west := nil; + while ((north = nil) or (east = nil) or (west = nil)) and + FScreenBuffer.Iterate(current) do + begin + if current^.Item is TMapCell then + begin + cell := TMapCell(current^.Item); + if (cell.X = AMapCell.X - 1) and (cell.Y = AMapCell.Y - 1) then + north := current + else if (cell.X = AMapCell.X) and (cell.Y = AMapCell.Y - 1) then + east := current + else if (cell.X = AMapCell.X - 1) and (cell.Y = AMapCell.Y) then + west := current; + end; + end; + + if north <> nil then PrepareScreenBlock(north); + if east <> nil then PrepareScreenBlock(east); + if west <> nil then PrepareScreenBlock(west); +end; + procedure TfrmMain.OnNewBlock(ABlock: TBlock); begin InvalidateScreenBuffer; @@ -2496,12 +2548,6 @@ begin DrawY := (oglGamewindow.Height div 2) + (ARelativeX + ARelativeY) * 22; end; -function TfrmMain.CanBeModified(ATile: TWorldItem): Boolean; -begin - Result := (not (ATile is TVirtualTile)) and - dmNetwork.CanWrite(ATile.X, ATile.Y); -end; - initialization {$I UfrmMain.lrs}