diff --git a/Client/ULandscape.pas b/Client/ULandscape.pas index 045b124..7b4c336 100644 --- a/Client/ULandscape.pas +++ b/Client/ULandscape.pas @@ -45,7 +45,7 @@ type { TMaterial } //TODO : add ref counting - TMaterial = class(TObject) + TMaterial = class constructor Create(AWidth, AHeight: Integer; AGraphic: TSingleImage); destructor Destroy; override; protected @@ -69,7 +69,7 @@ type { TLandTextureManager } - TLandTextureManager = class(TObject) + TLandTextureManager = class constructor Create; destructor Destroy; override; function GetArtMaterial(ATileID: Word): TMaterial; overload; @@ -96,10 +96,12 @@ type function GetSize: Integer; override; procedure RebuildList; end; + + TLandscape = class; { TBlock } - TBlock = class(TObject) + TBlock = class constructor Create(AMap: TMapBlock; AStatics: TStaticBlock); destructor Destroy; override; protected @@ -111,7 +113,7 @@ type property Map: TMapBlock read FMapBlock; property Static: TStaticBlock read FStaticBlock; { Methods } - procedure UpdateBlockAcess; + procedure UpdateBlockAcess(ALandscape: TLandscape); end; TLandscapeChangeEvent = procedure of object; @@ -123,7 +125,7 @@ type { TLandscape } - TLandscape = class(TObject) + TLandscape = class constructor Create(AWidth, AHeight: Word); destructor Destroy; override; protected @@ -141,6 +143,7 @@ type FOnStaticElevated: TStaticChangedEvent; FOnStaticHued: TStaticChangedEvent; FOpenRequests: TBits; + FWriteMap: TBits; { Methods } function GetMapBlock(AX, AY: Word): TMapBlock; function GetMapCell(AX, AY: Word): TMapCell; @@ -177,6 +180,7 @@ type property OnStaticHued: TStaticChangedEvent read FOnStaticHued write FOnStaticHued; { Methods } + function CanWrite(AX, AY: Word): Boolean; procedure FillDrawList(ADrawList: TScreenBuffer; AX, AY, AWidth, AHeight: Word; AMap, AStatics: Boolean; ANoDraw: Boolean; AAdditionalTiles: TList = nil); @@ -186,6 +190,7 @@ type procedure MoveStatic(AStatic: TStaticItem; AX, AY: Word); procedure PrepareBlocks(AX1, AY1, AX2, AY2: Word); procedure UpdateBlockAccess; + procedure UpdateWriteMap(AStream: TEnhancedMemoryStream); end; TScreenState = (ssNormal, ssFiltered, ssGhost); @@ -205,7 +210,7 @@ type { TScreenBuffer } - TScreenBuffer = class(TObject) + TScreenBuffer = class constructor Create; virtual; destructor Destroy; override; protected @@ -240,7 +245,7 @@ type implementation uses - UGameResources, UdmNetwork, UPackets, UPacketHandlers; + UGameResources, UdmNetwork, UPackets, UPacketHandlers, Logging; const mMap = 0; @@ -452,7 +457,6 @@ begin inherited Create; FMapBlock := AMap; FStaticBlock := AStatics; - UpdateBlockAcess; end; destructor TBlock.Destroy; @@ -462,15 +466,15 @@ begin inherited Destroy; end; -procedure TBlock.UpdateBlockAcess; +procedure TBlock.UpdateBlockAcess(ALandscape: TLandscape); var staticItem: TStaticItem; i: Integer; begin for i := Low(FMapBlock.Cells) to High(FMapBlock.Cells) do begin - FMapBlock.Cells[i].CanBeEdited := dmNetwork.CanWrite( - FMapBlock.Cells[i].X, FMapBlock.Cells[i].Y); + FMapBlock.Cells[i].CanBeEdited := ALandscape.CanWrite(FMapBlock.Cells[i].X, + FMapBlock.Cells[i].Y); end; if FStaticBlock is TSeperatedStaticBlock then @@ -479,8 +483,8 @@ begin for i := 0 to FStaticBlock.Items.Count - 1 do begin staticItem := TStaticItem(FStaticBlock.Items[i]); - staticItem.CanBeEdited := dmNetwork.CanWrite( - staticItem.X, staticItem.Y); + staticItem.CanBeEdited := ALandscape.CanWrite(staticItem.X, + staticItem.Y); end; end; @@ -488,7 +492,7 @@ end; constructor TLandscape.Create(AWidth, AHeight: Word); var - blockID: Integer; + blockID, i: Integer; begin inherited Create; FWidth := AWidth; @@ -506,7 +510,10 @@ begin FOnStaticInserted := nil; FOpenRequests := TBits.Create(FWidth * FHeight); - FOpenRequests.Clearall; + FOpenRequests.Clearall; //set all to 0 + FWriteMap := TBits.Create(FCellWidth * FCellHeight); + for i := 0 to FWriteMap.Size - 1 do + FWriteMap[i] := True; RegisterPacketHandler($04, TPacketHandler.Create(0, @OnBlocksPacket)); RegisterPacketHandler($06, TPacketHandler.Create(8, @OnDrawMapPacket)); @@ -524,6 +531,9 @@ begin FBlockCache.OnRemoveObject := nil; FreeAndNil(FBlockCache); end; + + FreeAndNil(FOpenRequests); + FreeAndNil(FWriteMap); RegisterPacketHandler($04, nil); RegisterPacketHandler($06, nil); @@ -627,6 +637,7 @@ begin FBlockCache.RemoveID(id); block := TBlock.Create(map, statics); + block.UpdateBlockAcess(Self); FBlockCache.StoreID(id, block); FOpenRequests[coords.Y * FWidth + coords.X] := False; @@ -650,7 +661,6 @@ begin cell.TileID := ABuffer.ReadWord; if Assigned(FOnMapChanged) then FOnMapChanged(cell); end; - //TODO : update surrounding normals end; procedure TLandscape.OnInsertStaticPacket(ABuffer: TEnhancedMemoryStream); @@ -680,7 +690,7 @@ begin i); targetStaticList.Sort(@CompareWorldItems); staticItem.Owner := block; - staticItem.CanBeEdited := dmNetwork.CanWrite(x, y); + staticItem.CanBeEdited := CanWrite(x, y); if Assigned(FOnStaticInserted) then FOnStaticInserted(staticItem); end; @@ -807,7 +817,7 @@ begin i); statics.Sort(@CompareWorldItems); staticItem.Owner := targetBlock; - staticItem.CanBeEdited := dmNetwork.CanWrite(newX, newY); + staticItem.CanBeEdited := CanWrite(newX, newY); if Assigned(FOnStaticInserted) then FOnStaticInserted(staticItem); end; @@ -841,6 +851,11 @@ begin end; end; +function TLandscape.CanWrite(AX, AY: Word): Boolean; +begin + Result := FWriteMap[AX * FCellHeight + AY]; +end; + procedure TLandscape.FillDrawList(ADrawList: TScreenBuffer; AX, AY, AWidth, AHeight: Word; AMap, AStatics: Boolean; ANoDraw: Boolean; AAdditionalTiles: TList = nil); @@ -1063,7 +1078,41 @@ var begin cacheEntry := nil; while FBlockCache.Iterate(cacheEntry) do - TBlock(cacheEntry^.Obj).UpdateBlockAcess; + if cacheEntry^.Obj <> nil then + TBlock(cacheEntry^.Obj).UpdateBlockAcess(Self); +end; + +procedure TLandscape.UpdateWriteMap(AStream: TEnhancedMemoryStream); +var + x1, y1, x2, y2: Word; + i, areaCount, cellX, cellY: Integer; +begin + Logger.EnterMethod([lcLandscape, lcDebug], 'TLandscape.UpdateWriteMap'); + + areaCount := AStream.ReadWord; + Logger.Send([lcLandscape, lcDebug], 'AreaCount', areaCount); + + if areaCount > 0 then + begin + FWriteMap.Clearall; + for i := 0 to areaCount - 1 do + begin + x1 := AStream.ReadWord; + y1 := AStream.ReadWord; + x2 := AStream.ReadWord; + y2 := AStream.ReadWord; + for cellX := x1 to x2 do + for cellY := y1 to y2 do + FWriteMap[cellX * FCellHeight + cellY] := True; + end; + end else + for i := 0 to FWriteMap.Size - 1 do + FWriteMap[i] := True; + + Logger.Send([lcLandscape, lcDebug], 'WriteMap @ 0,0', FWriteMap[0]); + + UpdateBlockAccess; + Logger.ExitMethod([lcLandscape, lcDebug], 'TLandscape.UpdateWriteMap'); end; { TMaterial } diff --git a/Client/UdmNetwork.pas b/Client/UdmNetwork.pas index 9995477..b01fbfa 100644 --- a/Client/UdmNetwork.pas +++ b/Client/UdmNetwork.pas @@ -31,8 +31,7 @@ interface uses Classes, SysUtils, LResources, Forms, Controls, Dialogs, lNetComponents, lNet, - UEnhancedMemoryStream, UPacket, UEnums, ExtCtrls, dateutils, URectList, - LCLIntf; + UEnhancedMemoryStream, UPacket, UEnums, ExtCtrls, dateutils; type @@ -57,7 +56,6 @@ type FAccessLevel: TAccessLevel; FDataDir: string; FLastPacket: TDateTime; - FWriteMap: TRectList; procedure OnCanSend(ASocket: TLSocket); procedure OnConnectionHandlingPacket(ABuffer: TEnhancedMemoryStream); procedure ProcessQueue; @@ -65,11 +63,9 @@ type public property Username: string read FUsername; property AccessLevel: TAccessLevel read FAccessLevel write FAccessLevel; - function CanWrite(AX, AY: Word): Boolean; procedure Send(APacket: TPacket); procedure Disconnect; procedure CheckClose(ASender: TForm); - procedure UpdateWriteMap(AStream: TEnhancedMemoryStream); end; var @@ -102,7 +98,6 @@ begin if FSendQueue <> nil then FreeAndNil(FSendQueue); if FReceiveQueue <> nil then FreeAndNil(FReceiveQueue); if PacketHandlers[$02] <> nil then FreeAndNil(PacketHandlers[$02]); - if FWriteMap <> nil then FreeAndNil(FWriteMap); end; procedure TdmNetwork.TCPClientConnect(aSocket: TLSocket); @@ -199,11 +194,7 @@ begin width := ABuffer.ReadWord; height := ABuffer.ReadWord; ResMan.InitLandscape(width, height); - - {FWriteMap := TBits.Create(ResMan.Landscape.CellWidth * ResMan.Landscape.CellHeight); - FWriteMap.XorBits(FWriteMap); //set all to 1} - FWriteMap := TRectList.Create; - UpdateWriteMap(ABuffer); + ResMan.Landscape.UpdateWriteMap(ABuffer); frmMain := TfrmMain.Create(dmNetwork); frmRadarMap := TfrmRadarMap.Create(frmMain); @@ -320,7 +311,6 @@ begin frmMain.ApplicationProperties1.OnIdle := nil; FreeAndNil(frmMain); end; - if FWriteMap <> nil then FreeAndNil(FWriteMap); if GameResourceManager <> nil then FreeAndNil(GameResourceManager); frmInitialize.Hide; while frmLogin.ShowModal = mrOK do @@ -340,23 +330,6 @@ begin FreeAndNil(frmLogin); end; -function TdmNetwork.CanWrite(AX, AY: Word): Boolean; -var - i: Integer; - pt: TPoint; -begin - if FWriteMap.Count > 0 then - begin - pt := Point(AX, AY); - for i := 0 to FWriteMap.Count - 1 do - if PtInRect(FWriteMap.Rects[i], pt) then - Exit(True); - - Result := False; - end else - Result := True; -end; - procedure TdmNetwork.Send(APacket: TPacket); var source: TEnhancedMemoryStream; @@ -386,23 +359,6 @@ begin end; end; -procedure TdmNetwork.UpdateWriteMap(AStream: TEnhancedMemoryStream); -var - x1, y1, x2, y2: Word; - i, areaCount: Integer; -begin - FWriteMap.Clear; - areaCount := AStream.ReadWord; - for i := 0 to areaCount - 1 do - begin - x1 := AStream.ReadWord; - y1 := AStream.ReadWord; - x2 := AStream.ReadWord; - y2 := AStream.ReadWord; - FWriteMap.Add(x1, y1, x2, y2); - end; -end; - initialization {$I UdmNetwork.lrs} diff --git a/Client/UfrmMain.pas b/Client/UfrmMain.pas index 291b55f..159f7ec 100644 --- a/Client/UfrmMain.pas +++ b/Client/UfrmMain.pas @@ -2296,6 +2296,8 @@ begin end; end; end; + + FRepaintNeeded := True; end; procedure TfrmMain.ProcessAccessLevel; @@ -2546,8 +2548,8 @@ begin $07: //access changed begin accessLevel := TAccessLevel(ABuffer.ReadByte); - dmNetwork.UpdateWriteMap(ABuffer); //TODO : movie writemap to landscape - FLandscape.UpdateBlockAccess; //TODO : could be handled by updatewritemap + FLandscape.UpdateWriteMap(ABuffer); + FRepaintNeeded := True; if accessLevel <> dmNetwork.AccessLevel then begin