⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 objnpc.pas

📁 翎风世界..传奇服务端..DELPHI源代码 包括DBServer,LogDataServer,LoginGate,LoginSrv,M2Server等..内容齐全.
💻 PAS
📖 第 1 页 / 共 5 页
字号:
      end;
    end;
  except
    MainOutMessage(sExceptionMsg);
  end;
//  inherited;

end;
procedure TCastleOfficial.HireGuard(sIndex:String;PlayObject:TPlayObject);//004A413C
var
  n10:Integer;
  ObjUnit:pTObjUnit;
begin
  if m_Castle = nil then begin
    PlayObject.SysMsg('NPC不属于城堡!!!',c_Red,t_Hint);
    exit;
  end;
  if TUserCastle(m_Castle).m_nTotalGold >= g_Config.nHireGuardPrice then begin
    n10:=Str_ToInt(sIndex,0) - 1;
    if n10 <= MAXCALSTEGUARD then begin
      if TUserCastle(m_Castle).m_Guard[n10].BaseObject = nil then begin
        if not TUserCastle(m_Castle).m_boUnderWar then begin
          ObjUnit:=@TUserCastle(m_Castle).m_Guard[n10];
          ObjUnit.BaseObject:=UserEngine.RegenMonsterByName(TUserCastle(m_Castle).m_sMapName,
                                                          ObjUnit.nX,
                                                          ObjUnit.nY,
                                                          ObjUnit.sName);
          if ObjUnit.BaseObject <> nil then begin
            Dec(TUserCastle(m_Castle).m_nTotalGold,g_Config.nHireGuardPrice);
            ObjUnit.BaseObject.m_Castle:=TUserCastle(m_Castle);
            TGuardUnit(ObjUnit.BaseObject).m_nX550:=ObjUnit.nX;
            TGuardUnit(ObjUnit.BaseObject).m_nY554:=ObjUnit.nY;
            TGuardUnit(ObjUnit.BaseObject).m_nDirection:=3;
            PlayObject.SysMsg('hired guard.',c_Green,t_Hint);
          end;

        end else begin
          PlayObject.SysMsg('You cannot hire it right now.',c_Red,t_Hint);
        end;
      end else begin
        PlayObject.SysMsg('Guard already exists in that place.',c_Red,t_Hint);
      end;
    end else begin
      PlayObject.SysMsg('指令错误!!!',c_Red,t_Hint);
    end;
  end else begin
    PlayObject.SysMsg('Fund of wall is not sufficient.',c_Red,t_Hint);
  end;
  {
  if UserCastle.m_nTotalGold >= g_Config.nHireGuardPrice then begin
    n10:=Str_ToInt(sIndex,0) - 1;
    if n10 <= MAXCALSTEGUARD then begin
      if UserCastle.m_Guard[n10].BaseObject = nil then begin
        if not UserCastle.m_boUnderWar then begin
          ObjUnit:=@UserCastle.m_Guard[n10];
          ObjUnit.BaseObject:=UserEngine.RegenMonsterByName(UserCastle.m_sMapName,
                                                          ObjUnit.nX,
                                                          ObjUnit.nY,
                                                          ObjUnit.sName);
          if ObjUnit.BaseObject <> nil then begin
            Dec(UserCastle.m_nTotalGold,g_Config.nHireGuardPrice);
            ObjUnit.BaseObject.m_Castle:=UserCastle;
            TGuardUnit(ObjUnit.BaseObject).m_nX550:=ObjUnit.nX;
            TGuardUnit(ObjUnit.BaseObject).m_nY554:=ObjUnit.nY;
            TGuardUnit(ObjUnit.BaseObject).m_n558:=3;
            PlayObject.SysMsg('雇佣成功.',c_Green,t_Hint);
          end;

        end else begin
          PlayObject.SysMsg('现在无法雇佣!!!',c_Red,t_Hint);
        end;
      end
    end else begin
      PlayObject.SysMsg('指令错误!!!',c_Red,t_Hint);
    end;
  end else begin
    PlayObject.SysMsg('城内资金不足!!!',c_Red,t_Hint);
  end;
  }
end;
procedure TCastleOfficial.HireArcher(sIndex:String;PlayObject:TPlayObject);//004A433C
var
  n10:Integer;
  ObjUnit:pTObjUnit;
begin
  if m_Castle = nil then begin
    PlayObject.SysMsg('NPC不属于城堡!!!',c_Red,t_Hint);
    exit;
  end;

  if TUserCastle(m_Castle).m_nTotalGold >= g_Config.nHireArcherPrice then begin
    n10:=Str_ToInt(sIndex,0) - 1;
    if n10 <= MAXCASTLEARCHER then begin
      if TUserCastle(m_Castle).m_Archer[n10].BaseObject = nil then begin
        if not TUserCastle(m_Castle).m_boUnderWar then begin
          ObjUnit:=@TUserCastle(m_Castle).m_Archer[n10];
          ObjUnit.BaseObject:=UserEngine.RegenMonsterByName(TUserCastle(m_Castle).m_sMapName,
                                                          ObjUnit.nX,
                                                          ObjUnit.nY,
                                                          ObjUnit.sName);
          if ObjUnit.BaseObject <> nil then begin
            Dec(TUserCastle(m_Castle).m_nTotalGold,g_Config.nHireArcherPrice);
            ObjUnit.BaseObject.m_Castle:=TUserCastle(m_Castle);
            TGuardUnit(ObjUnit.BaseObject).m_nX550:=ObjUnit.nX;
            TGuardUnit(ObjUnit.BaseObject).m_nY554:=ObjUnit.nY;
            TGuardUnit(ObjUnit.BaseObject).m_nDirection:=3;
            PlayObject.SysMsg('You hired archer.',c_Green,t_Hint);
          end;

        end else begin
          PlayObject.SysMsg('You cannot hire it right now.',c_Red,t_Hint);
        end;
      end else begin
        PlayObject.SysMsg('Guard already exists in that place.',c_Red,t_Hint);
      end;
    end else begin
      PlayObject.SysMsg('指令错误!!!',c_Red,t_Hint);
    end;
  end else begin
    PlayObject.SysMsg('Fund of wall is not sufficient.',c_Red,t_Hint);
  end;
  {
  if UserCastle.m_nTotalGold >= g_Config.nHireArcherPrice then begin
    n10:=Str_ToInt(sIndex,0) - 1;
    if n10 <= MAXCASTLEARCHER then begin
      if UserCastle.m_Archer[n10].BaseObject = nil then begin
        if not UserCastle.m_boUnderWar then begin
          ObjUnit:=@UserCastle.m_Archer[n10];
          ObjUnit.BaseObject:=UserEngine.RegenMonsterByName(UserCastle.m_sMapName,
                                                          ObjUnit.nX,
                                                          ObjUnit.nY,
                                                          ObjUnit.sName);
          if ObjUnit.BaseObject <> nil then begin
            Dec(UserCastle.m_nTotalGold,g_Config.nHireArcherPrice);
            ObjUnit.BaseObject.m_Castle:=UserCastle;
            TGuardUnit(ObjUnit.BaseObject).m_nX550:=ObjUnit.nX;
            TGuardUnit(ObjUnit.BaseObject).m_nY554:=ObjUnit.nY;
            TGuardUnit(ObjUnit.BaseObject).m_n558:=3;
            PlayObject.SysMsg('雇佣成功.',c_Green,t_Hint);
          end;

        end else begin
          PlayObject.SysMsg('现在无法雇佣!!!',c_Red,t_Hint);
        end;
      end else begin
        PlayObject.SysMsg('早已雇佣!!!',c_Red,t_Hint);
      end;
    end else begin
      PlayObject.SysMsg('指令错误!!!',c_Red,t_Hint);
    end;
  end else begin
    PlayObject.SysMsg('城内资金不足!!!',c_Red,t_Hint);
  end;
  }
end;
{ TMerchant }

procedure TMerchant.AddItemPrice(nIndex:Integer;nPrice:Integer); //0049F2AC
var
  ItemPrice:pTItemPrice;
begin
  New(ItemPrice);
  ItemPrice.wIndex:=nIndex;
  ItemPrice.nPrice:=nPrice;
  m_ItemPriceList.Add(ItemPrice);
  FrmDB.SaveGoodPriceRecord(Self,m_sScript + '-' + m_sMapName);
end;
procedure TMerchant.CheckItemPrice(nIndex:Integer); //0049F1BC
var
  I: Integer;
  ItemPrice:pTItemPrice;
  n10:Integer;
  StdItem:TItem;
begin
  for I := 0 to m_ItemPriceList.Count - 1 do begin
    ItemPrice:=m_ItemPriceList.Items[i];
    if ItemPrice.wIndex = nIndex then begin
      n10:=ItemPrice.nPrice;
      if ROUND(n10 * 1.1) > n10 then begin
        n10:=ROUND(n10 * 1.1);
      end else Inc(n10);
      exit;
    end;      
  end;    
  StdItem:=UserEngine.GetStdItem(nIndex);
  if StdItem <> nil then begin
    AddItemPrice(nIndex,ROUND(StdItem.Price * 1.1));
  end;    
end;
function TMerchant.GetRefillList(nIndex:Integer):TList; //0049F118
var
  I: Integer;
  List:TList;
begin
  Result:=nil;
  if nIndex <= 0 then exit;
  for I := 0 to m_GoodsList.Count - 1 do begin
    List:=TList(m_GoodsList.Items[i]);
    if List.Count > 0 then begin
      if pTUserItem(List.Items[0]).wIndex = nIndex then begin
        Result:=List;
        Break;
      end;
    end;
  end;
end;

procedure TMerchant.RefillGoods;//0049F950
  procedure RefillItems(var List:TList;sItemName:String;nInt:Integer); //0049F824
  var
    I: Integer;
    UserItem:pTUserItem;
  begin
    if List = nil then begin
      List:=TList.Create;
      m_GoodsList.Add(List);
    end;
    for I := 0 to nInt - 1 do begin
      New(UserItem);
      if UserEngine.CopyToUserItemFromName(sItemName,UserItem) then begin
        List.Insert(0,UserItem);
      end else Dispose(UserItem);
    end;
  end;
  procedure DelReFillItem(var List:TList;nInt:Integer); //0049F8F8
  var
    I: Integer;
  begin
    for I := List.Count - 1 downto 0 do begin
      if nInt <= 0 then break;
      Dispose(pTUserItem(List.Items[i]));
      List.Delete(i);
      Dec(nInt);
    end;
  end;

var
  I,II: Integer;
  Goods:pTGoods;
  nIndex,nRefillCount:Integer;
  RefillList,RefillList20:TList;
  bo21:Boolean;
ResourceString
  sExceptionMsg = '[Exception] TMerchant::RefillGoods %s/%d:%d [%s] Code:%d';
begin //0049F950
  try
    for I := 0 to m_RefillGoodsList.Count - 1 do begin
      Goods:=m_RefillGoodsList.Items[i];

      if (GetTickCount - Goods.dwRefillTick) > Goods.dwRefillTime * 60 * 1000 then begin
        Goods.dwRefillTick:=GetTickCount();
        nIndex:=UserEngine.GetStdItemIdx(Goods.sItemName);
        if nIndex >= 0 then begin
          memo.Lines.Add('test');
          RefillList:=GetRefillList(nIndex);
          nRefillCount:=0;
          if RefillList <> nil then nRefillCount:=RefillList.Count;
          if Goods.nCount > nRefillCount then begin
            CheckItemPrice(nIndex);
            RefillItems(RefillList,Goods.sItemName,Goods.nCount - nRefillCount);
            FrmDB.SaveGoodRecord(Self,m_sScript + '-' + m_sMapName);
            FrmDB.SaveGoodPriceRecord(Self,m_sScript + '-' + m_sMapName);
          end;
          if Goods.nCount < nRefillCount then begin
            DelReFillItem(RefillList,nRefillCount - Goods.nCount);
            FrmDB.SaveGoodRecord(Self,m_sScript + '-' + m_sMapName);
            FrmDB.SaveGoodPriceRecord(Self,m_sScript + '-' + m_sMapName);
          end;
        end; //0049FB83
      end;
    end;
    for I := 0 to m_GoodsList.Count - 1 do begin
      RefillList20:=TList(m_GoodsList.Items[I]);
      if RefillList20.Count > 1000 then begin
        bo21:=False;
        for II := 0 to m_RefillGoodsList.Count - 1 do begin
          Goods:=m_RefillGoodsList.Items[II];
          nIndex:=UserEngine.GetStdItemIdx(Goods.sItemName);
          if pTItemPrice(RefillList20.Items[0]).wIndex = nIndex then begin
            bo21:=True;
            break;
          end;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -