找回密码
 立即注册
虾米引擎源代码Delphi3KM2引擎源码20121218CQFIR飞尔引擎20120918源码文字广告位置4
APPLEM2引擎源代码传奇引擎delphi源代码DELPHI视频教程
GSQL_6.5.2.1源代码Delphi即时通讯Delphi源码文字广告位置11
文字广告位置12
文字广告位置13
文字广告位置14
文字广告位置15
文字广告位置16
UC845刺客引擎飞龙3delphi源码文字广告位置18
文字广告位置19
文字广告位置20
文字广告位置21文字广告位置22
文字广告位置23
文字广告位置24
文字广告位置25
文字广告位置26文字广告位置27文字广告位置28
查看: 3|回复: 0

修复无空爆问题

[复制链接]

827

主题

42

回帖

5358

积分

管理员

积分
5358

最佳新人活跃会员热心会员推广达人宣传达人突出贡献优秀版主荣誉管理论坛元老

QQ
发表于 8 小时前 | 显示全部楼层 |阅读模式
  1. function TEnvirnoment.AddToMap(nX, nY: Integer; btType: Byte; pRemoveObject: TObject): Pointer;
  2. var
  3.   MapCellInfo: pTMapCellinfo;       // 目标格子信息指针
  4.   OSObject: pTOSObject;             // 格子内对象指针
  5.   MapItem: PTMapItem;               // 物品对象指针
  6.   I: Integer;                       // 循环变量
  7.   nGoldCount: Integer;              // 金币叠加后的总数量
  8.   bo1E: Boolean;                    // 标记对象是否已完成处理(叠加/拦截)
  9.   boCode: Integer;                  // 异常定位标记,用于报错时定位问题位置
  10.   btRaceServer: Byte;               // 对象种族/类型标识(区分玩家、怪物等)
  11.   nItemCount: Integer;              // 当前格子内物品对象的数量
  12. resourcestring
  13.   sExceptionMsg = '[Exception] TEnvirnoment::AddToMap';  // 异常提示信息
  14. begin
  15.   boCode := -1;
  16.   Result := nil;
  17.   try
  18.     bo1E := False;
  19.     // 获取目标格子信息,判断格子是否允许放置对象
  20.     if GetMapCellInfo(nX, nY, MapCellInfo) and (MapCellInfo.chFlag = 0) then
  21.     begin
  22.       boCode := 1;
  23.       // 若格子对象列表为空,创建新的列表
  24.       if MapCellInfo.ObjList = nil then begin
  25.         MapCellInfo.ObjList := TList.Create;
  26.       end
  27.       else begin
  28.         boCode := 2;
  29.         // 仅对物品类型对象进行处理(针对物品掉落场景)
  30.         if btType = OS_ITEMOBJECT then begin
  31.           // 金币叠加逻辑,相同金币可叠加,上限为2000
  32.           if PTMapItem(pRemoveObject).Name = sSTRING_GOLDNAME then begin
  33.             for I := 0 to MapCellInfo.ObjList.Count - 1 do begin
  34.               OSObject := MapCellInfo.ObjList.Items[I];
  35.               if (OSObject <> nil) and (OSObject.btType = OS_ITEMOBJECT) then begin
  36.                 MapItem := PTMapItem(pTOSObject(MapCellInfo.ObjList.Items[I]).CellObj);
  37.                 if MapItem.Name = sSTRING_GOLDNAME then begin
  38.                   nGoldCount := MapItem.Count + PTMapItem(pRemoveObject).Count;
  39.                   if nGoldCount <= 2000 then begin // 控制金币叠加上限
  40.                     MapItem.Count := nGoldCount;
  41.                     MapItem.Looks := GetGoldShape(nGoldCount);
  42.                     MapItem.AniCount := 0;
  43.                     MapItem.Reserved := 0;
  44.                     OSObject.dwAddTime := GetTickCount();
  45.                     Result := MapItem;
  46.                     bo1E := True; // 标记为已处理(叠加成功)
  47.                   end;
  48.                 end;
  49.               end;
  50.             end;
  51.           end;
  52.           // 未叠加金币时,判断格子内物品数量是否超限
  53.           if not bo1E then
  54.           begin
  55.             nItemCount := 0;
  56.             // 遍历格子对象列表,统计物品类型对象数量
  57.             for I := 0 to MapCellInfo.ObjList.Count - 1 do
  58.             begin
  59.               OSObject := MapCellInfo.ObjList.Items[I];
  60.               if (OSObject <> nil) and (OSObject.btType = OS_ITEMOBJECT) then
  61.                 Inc(nItemCount);
  62.             end;
  63.             // 物品数量达到5个及以上时,拦截新物品加入
  64.             if nItemCount >= 5 then
  65.             begin
  66.               Result := nil;
  67.               bo1E := True; // 标记为已处理(拦截成功)
  68.             end;
  69.           end;
  70.         end;
  71.       end;
  72.       boCode := 3;
  73.       // 未被叠加或拦截时,正常创建对象并加入格子列表
  74.       if not bo1E then begin
  75.         New(OSObject);
  76.         OSObject.btType := btType;
  77.         OSObject.CellObj := pRemoveObject;
  78.         OSObject.dwAddTime := GetTickCount();
  79.         MapCellInfo.ObjList.Add(OSObject);
  80.         Result := Pointer(pRemoveObject);
  81.         // 处理移动对象(玩家、怪物),标记其地图状态并统计数量
  82.         if (btType = OS_MOVINGOBJECT) and (not TBaseObject(pRemoveObject).m_boAddToMaped) then begin
  83.           TBaseObject(pRemoveObject).m_boDelFormMaped := False;
  84.           TBaseObject(pRemoveObject).m_boAddToMaped := True;
  85.           btRaceServer := TBaseObject(pRemoveObject).m_btRaceServer;
  86.           if btRaceServer = RC_PLAYOBJECT then
  87.             Inc(m_nHumCount); // 玩家数量统计+1
  88.           if btRaceServer >= RC_ANIMAL then
  89.             Inc(m_nMonCount); // 怪物数量统计+1
  90.         end;
  91.       end;
  92.     end;
  93.   except
  94.     // 捕获异常并输出提示信息,包含异常定位标记
  95.     MainOutMessage(sExceptionMsg + ' Code ' + IntToStr(boCode));
  96.   end;
  97. end;
复制代码
修复效果:格子内物品数量统计准确,仅当物品数量≥5时拦截新物品加入,怪物、尸体等非物品对象不占用物品名额,物品掉落功能恢复正常,无空爆问题



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|Delphi源代码

GMT+8, 2026-5-3 21:35 , Processed in 0.076955 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表