www.pudn.com > woool12.rar > Guild.pas


unit Guild; 
 
interface 
uses 
  Windows, SysUtils, Classes, IniFiles, ObjBase,MyList; 
type 
  TGuildRank = record 
    nRankNo: Integer; 
    sRankName: string; 
    MemberList: TStringList; 
  end; 
  pTGuildRank = ^TGuildRank; 
  TWarGuild = record 
    Guild: TObject; 
    dwWarTick: LongWord; 
    dwWarTime: LongWord; 
  end; 
  pTWarGuild = ^TWarGuild; 
  TGUild = class 
    sGuildName: string;                 //0x04 
    NoticeList: TStringList;            //0x08 
    m_GuildWarList: TStringList;          //0x0C 
    GuildAllList: TStringList;          //0x10 
    m_RankList: TMyList;                  //0x14 职位列表 
    m_nContestPoint: Integer;             //0x18 
    boTeamFight: Boolean;               //0x1C; 
    //    MatchPoint   :Integer; 
    TeamFightDeadList: TStringList;     //0x20 
    m_boEnableAuthAlly: Boolean;        //0x24 
    dwSaveTick: LongWord;               //0x28 
    boChanged: Boolean;                 //0x2C; 
    m_DynamicVarList: TMyList; 
  private 
    m_Config: TIniFile; 
    m_nBuildPoint: Integer;             //建筑度 
    m_nAurae: Integer;                  //人气度 
    m_nStability: Integer;              //安定度 
    m_nFlourishing: Integer;            //繁荣度 
    m_nChiefItemCount: Integer;         //行会领取装备数量 
 
    function SetGuildInfo(sChief: string): Boolean; 
    procedure ClearRank(); 
    procedure SaveGuildFile(sFileName: string); 
    procedure SaveGuildConfig(sFileName: string); 
    function GetMemberCount(): Integer; 
    function GetMemgerIsFull(): Boolean; 
    procedure SetAuraePoint(nPoint: Integer); 
    procedure SetBuildPoint(nPoint: Integer); 
    procedure SetStabilityPoint(nPoint: Integer); 
    procedure SetFlourishPoint(nPoint: Integer); 
    procedure SetChiefItemCount(nPoint: Integer); 
  public 
    constructor Create(sName: string); 
    destructor Destroy; override; 
    procedure SaveGuildInfoFile(); 
    function LoadGuild(): Boolean; 
    function LoadGuildFile(sGuildFileName: string): Boolean; 
    function LoadGuildConfig(sGuildFileName: string): Boolean; 
    procedure UpdateGuildFile; 
    procedure CheckSaveGuildFile; 
    function IsMember(sName: string): Boolean; 
    function IsAllyGuild(Guild: TGUild): Boolean; 
    function IsWarGuild(Guild: TGUild): Boolean; 
    function DelAllyGuild(Guild: TGUild): Boolean; 
    procedure TeamFightWhoDead(sName: string); 
    procedure TeamFightWhoWinPoint(sName: string; nPoint: Integer); 
    procedure SendGuildMsg(sMsg: string); 
    procedure RefMemberName(); 
    function GetRankName(PlayObject: TPlayObject; var nRankNo: Integer): string; 
    function DelMember(sHumName: string): Boolean; 
    function UpdateRank(sRankData: string): Integer; 
    function CancelGuld(sHumName: string): Boolean; 
    function IsNotWarGuild(Guild: TGUild): Boolean; 
    function AllyGuild(Guild: TGUild): Boolean; 
 
    function AddMember(PlayObject: TPlayObject): Boolean; 
    procedure DelHumanObj(PlayObject: TPlayObject); 
    function GetChiefName(): string; 
    procedure BackupGuildFile(); 
    procedure sub_499B4C(Guild: TGUild); 
    function AddWarGuild(Guild: TGUild): pTWarGuild; 
    procedure StartTeamFight(); 
    procedure EndTeamFight(); 
    procedure AddTeamFightMember(sHumanName: string); 
    property Count: Integer read GetMemberCount; 
    property IsFull: Boolean read GetMemgerIsFull; 
    property nBuildPoint: Integer read m_nBuildPoint write SetBuildPoint; 
    property nAurae: Integer read m_nAurae write SetAuraePoint; 
    property nStability: Integer read m_nStability write SetStabilityPoint; 
    property nFlourishing: Integer read m_nFlourishing write SetFlourishPoint; 
    property nChiefItemCount: Integer read m_nChiefItemCount write 
      SetChiefItemCount; 
  end; 
  TGuildManager = class 
    GuildList: TMyList;                   //0x4 
  private 
  public 
    constructor Create(); 
    destructor Destroy; override; 
    procedure LoadGuildInfo(); 
    procedure SaveGuildList(); 
    function MemberOfGuild(sName: string): TGUild; 
    function AddGuild(sGuildName, sChief: string): Boolean; 
    function FindGuild(sGuildName: string): TGUild; 
    function DELGUILD(sGuildName: string): Boolean; 
    procedure ClearGuildInf(); 
    procedure Run(); 
  end; 
implementation 
 
uses M2Share, HUtil32, Grobal2; 
 
{ TGuildManager } 
 
function TGuildManager.AddGuild(sGuildName, sChief: string): Boolean; //0049A4A4 
var 
  Guild             : TGUild; 
begin 
  Result := False; 
  if CheckGuildName(sGuildName) and (FindGuild(sGuildName) = nil) then 
  begin 
    Guild := TGUild.Create(sGuildName); 
    Guild.SetGuildInfo(sChief); 
    GuildList.Add(Guild); 
    SaveGuildList(); 
    Result := True; 
  end; 
end; 
 
function TGuildManager.DELGUILD(sGuildName: string): Boolean; //0049A550 
var 
  i                 : Integer; 
  Guild             : TGUild; 
begin 
  Result := False; 
  for i := 0 to GuildList.Count - 1 do 
  begin 
    Guild := TGUild(GuildList.Items[i]); 
    if CompareText(Guild.sGuildName, sGuildName) = 0 then 
    begin 
      if Guild.m_RankList.Count > 1 then 
        break; 
      Guild.BackupGuildFile(); 
      GuildList.Delete(i); 
      SaveGuildList(); 
      Result := True; 
      break; 
    end; 
  end; 
end; 
 
procedure TGuildManager.ClearGuildInf;  //0049A02C 
var 
  i                 : Integer; 
begin 
  for i := 0 to GuildList.Count - 1 do 
  begin 
    TGUild(GuildList.Items[i]).Free; 
  end; 
  GuildList.Clear; 
end; 
 
constructor TGuildManager.Create; 
begin 
  GuildList := TMyList.Create; 
end; 
 
destructor TGuildManager.Destroy; 
begin 
  GuildList.Free; 
  inherited; 
end; 
 
function TGuildManager.FindGuild(sGuildName: string): TGUild; //0049A36C 
var 
  i                 : Integer; 
begin 
  Result := nil; 
  for i := 0 to GuildList.Count - 1 do 
  begin 
    if TGUild(GuildList.Items[i]).sGuildName = sGuildName then 
    begin 
      Result := TGUild(GuildList.Items[i]); 
      break; 
    end; 
  end; 
end; 
 
procedure TGuildManager.LoadGuildInfo;  //0049A078 
var 
  LoadList          : TStringList; 
  Guild             : TGUild; 
  sGuildName        : string; 
  i                 : Integer; 
begin 
  if FileExists(g_Config.sGuildFile) then 
  begin 
    LoadList := TStringList.Create; 
    LoadList.LoadFromFile(g_Config.sGuildFile); 
    for i := 0 to LoadList.Count - 1 do 
    begin 
      sGuildName := Trim(LoadList.Strings[i]); 
      if sGuildName <> '' then 
      begin 
        Guild := TGUild.Create(sGuildName); 
        GuildList.Add(Guild); 
      end; 
    end; 
    LoadList.Free; 
    for i := GuildList.Count - 1 downto 0 do 
    begin 
      Guild := GuildList.Items[i]; 
      if not Guild.LoadGuild() then 
      begin 
        MainOutMessage(Guild.sGuildName + ' 读取出错!!!'); 
        Guild.Free; 
        GuildList.Delete(i); 
        SaveGuildList(); 
      end; 
    end; 
    MainOutMessage('已读取 ' + IntToStr(GuildList.Count) + '个行会信息...'); 
  end 
  else 
  begin 
    MainOutMessage('行会信息文件未找到!!!'); 
  end; 
 
end; 
 
function TGuildManager.MemberOfGuild(sName: string): TGUild; 
//0049A408 
var 
  i                 : Integer; 
begin 
  Result := nil; 
  for i := 0 to GuildList.Count - 1 do 
  begin 
    if TGUild(GuildList.Items[i]).IsMember(sName) then 
    begin 
      Result := TGUild(GuildList.Items[i]); 
      break; 
    end; 
  end; 
end; 
 
procedure TGuildManager.SaveGuildList;  //0049A260 
var 
  i                 : Integer; 
  SaveList          : TStringList; 
begin 
  if nServerIndex <> 0 then 
    exit; 
  SaveList := TStringList.Create; 
  for i := 0 to GuildList.Count - 1 do 
  begin 
    SaveList.Add(TGUild(GuildList.Items[i]).sGuildName); 
  end;                                  // for 
  try 
    SaveList.SaveToFile(g_Config.sGuildFile); 
  except 
    MainOutMessage('行会信息保存失败!!!'); 
  end; 
  SaveList.Free; 
end; 
 
procedure TGuildManager.Run;            //0049A61C 
var 
  i                 : Integer; 
  ii                : Integer; 
  Guild             : TGUild; 
  boChanged         : Boolean; 
  WarGuild          : pTWarGuild; 
begin 
  for i := 0 to GuildList.Count - 1 do 
  begin 
    Guild := TGUild(GuildList.Items[i]); 
    boChanged := False; 
    for ii := Guild.m_GuildWarList.Count - 1 downto 0 do 
    begin 
      WarGuild := pTWarGuild(Guild.m_GuildWarList.Objects[ii]); 
      if (GetTickCount - WarGuild.dwWarTick) > WarGuild.dwWarTime then 
      begin 
        Guild.sub_499B4C(TGUild(WarGuild.Guild)); 
        Guild.m_GuildWarList.Delete(ii); 
        DisPose(WarGuild); 
        boChanged := True; 
      end; 
    end; 
 
    if boChanged then 
    begin 
      Guild.UpdateGuildFile(); 
    end; 
    Guild.CheckSaveGuildFile; 
  end; 
end; 
 
{ TGuild } 
 
procedure TGUild.ClearRank;             //00497C78 
var 
  i                 : Integer; 
  GuildRank         : pTGuildRank; 
begin 
  for i := 0 to m_RankList.Count - 1 do 
  begin 
    GuildRank := m_RankList.Items[i]; 
    GuildRank.MemberList.Free; 
    DisPose(GuildRank); 
  end;                                  // for 
  m_RankList.Clear; 
end; 
 
constructor TGUild.Create(sName: string); //00497B04 
var 
  sFileName         : string; 
begin 
  sGuildName := sName; 
  NoticeList := TStringList.Create; 
  m_GuildWarList := TStringList.Create; 
  GuildAllList := TStringList.Create; 
  m_RankList := TMyList.Create; 
  TeamFightDeadList := TStringList.Create; 
  dwSaveTick := 0; 
  boChanged := False; 
  M_nContestPoint := 0; 
  boTeamFight := False; 
  m_boEnableAuthAlly := False; 
 
  sFileName := g_Config.sGuildDir + sName + '.ini'; 
  m_Config := TIniFile.Create(sFileName); 
  if not FileExists(sFileName) then 
  begin 
    m_Config.WriteString('Guild', 'GuildName', sName); 
  end; 
 
  m_nBuildPoint := 0; 
  m_nAurae := 0; 
  m_nStability := 0; 
  m_nFlourishing := 0; 
  m_nChiefItemCount := 0; 
  m_DynamicVarList := TMyList.Create; 
end; 
 
function TGUild.DelAllyGuild(Guild: TGUild): Boolean; //00499CEC 
var 
  i                 : Integer; 
  AllyGuild         : TGUild; 
begin 
  Result := False; 
  for i := 0 to GuildAllList.Count - 1 do 
  begin 
    AllyGuild := TGUild(GuildAllList.Objects[i]); 
    if AllyGuild = Guild then 
    begin 
      GuildAllList.Delete(i); 
      Result := True; 
      break; 
    end; 
  end;                                  // for 
  SaveGuildInfoFile(); 
end; 
 
destructor TGUild.Destroy;              //00497C08 
var 
  i                 : Integer; 
begin 
  NoticeList.Free; 
  m_GuildWarList.Free; 
  GuildAllList.Free; 
  ClearRank(); 
  m_RankList.Free; 
  TeamFightDeadList.Free; 
  m_Config.Free; 
  for i := 0 to m_DynamicVarList.Count - 1 do 
  begin 
    DisPose(pTDynamicVar(m_DynamicVarList.Items[i])); 
  end; 
  m_DynamicVarList.Free; 
  inherited; 
end; 
 
function TGUild.IsAllyGuild(Guild: TGUild): Boolean; //00499BD8 
var 
  i                 : Integer; 
  AllyGuild         : TGUild; 
begin 
  Result := False; 
  for i := 0 to GuildAllList.Count - 1 do 
  begin 
    AllyGuild := TGUild(GuildAllList.Objects[i]); 
    if AllyGuild = Guild then 
    begin 
      Result := True; 
      break; 
    end; 
  end; 
end; 
 
function TGUild.IsMember(sName: string): Boolean; //00498714 
var 
  i, ii             : Integer; 
  GuildRank         : pTGuildRank; 
begin 
  Result := False; 
  for i := 0 to m_RankList.Count - 1 do 
  begin 
    GuildRank := m_RankList.Items[i]; 
    for ii := 0 to GuildRank.MemberList.Count - 1 do 
    begin 
      if GuildRank.MemberList.Strings[ii] = sName then 
      begin 
        Result := True; 
        exit; 
      end; 
    end; 
  end; 
end; 
 
function TGUild.IsWarGuild(Guild: TGUild): Boolean; //00499924 
var 
  i                 : Integer; 
begin 
  Result := False; 
  for i := 0 to m_GuildWarList.Count - 1 do 
  begin 
    if pTWarGuild(m_GuildWarList.Objects[i]).Guild = Guild then 
    begin 
      Result := True; 
      break; 
    end; 
  end;                                  // for 
end; 
 
function TGUild.LoadGuild(): Boolean;   //00497CE4 
var 
  sFileName         : string; 
begin 
  sFileName := sGuildName + '.txt'; 
  Result := LoadGuildFile(sFileName); 
  LoadGuildConfig(sGuildName + '.ini'); 
end; 
 
function TGUild.LoadGuildConfig(sGuildFileName: string): Boolean; 
begin 
  m_nBuildPoint := m_Config.ReadInteger('Guild', 'BuildPoint', m_nBuildPoint); 
  m_nAurae := m_Config.ReadInteger('Guild', 'Aurae', m_nAurae); 
  m_nStability := m_Config.ReadInteger('Guild', 'Stability', m_nStability); 
  m_nFlourishing := m_Config.ReadInteger('Guild', 'Flourishing', 
    m_nFlourishing); 
  m_nChiefItemCount := m_Config.ReadInteger('Guild', 'ChiefItemCount', 
    m_nChiefItemCount); 
  Result := True; 
end; 
 
function TGUild.LoadGuildFile(sGuildFileName: string): Boolean; //00497D58 
var 
  i                 : Integer; 
  LoadList          : TStringList; 
  s18, s1C, s20, s24, sFileName: string; 
  n28, n2C          : Integer; 
  GuildWar          : pTWarGuild; 
  GuildRank         : pTGuildRank; 
  Guild             : TGUild; 
begin 
  Result := False; 
  GuildRank := nil; 
  sFileName := g_Config.sGuildDir + sGuildFileName; 
  if not FileExists(sFileName) then 
    exit; 
  ClearRank(); 
  NoticeList.Clear; 
  for i := 0 to m_GuildWarList.Count - 1 do 
  begin 
    DisPose(pTWarGuild(m_GuildWarList.Objects[i])); 
  end;                                  // for 
  m_GuildWarList.Clear; 
  GuildAllList.Clear; 
  n28 := 0; 
  n2C := 0; 
  s24 := ''; 
  LoadList := TStringList.Create; 
  LoadList.LoadFromFile(sFileName); 
  for i := 0 to LoadList.Count - 1 do 
  begin 
    s18 := LoadList.Strings[i]; 
    if (s18 = '') or (s18[1] = ';') then 
      Continue; 
    if s18[1] <> '+' then 
    begin 
      if s18 = g_Config.sGuildNotice then 
        n28 := 1; 
      if s18 = g_Config.sGuildWar then 
        n28 := 2; 
      if s18 = g_Config.sGuildAll then 
        n28 := 3; 
      if s18 = g_Config.sGuildMember then 
        n28 := 4; 
      if s18[1] = '#' then 
      begin 
        s18 := Copy(s18, 2, Length(s18) - 1); 
        s18 := GetValidStr3(s18, s1C, [' ', ',']); 
        n2C := Str_ToInt(s1C, 0); 
        s24 := Trim(s18); 
        GuildRank := nil; 
      end; 
      Continue; 
    end;                                //00497F68 
    s18 := Copy(s18, 2, Length(s18) - 1); 
    case n28 of                         // 
      1: NoticeList.Add(s18); 
      2: 
        begin 
          while (s18 <> '') do 
          begin 
            s18 := GetValidStr3(s18, s1C, [' ', ',']); 
            if s1C = '' then 
              break; 
            New(GuildWar); 
            GuildWar.Guild := g_GuildManager.FindGuild(s1C); 
            if GuildWar.Guild <> nil then 
            begin 
              GuildWar.dwWarTick := GetTickCount(); 
              GuildWar.dwWarTime := Str_ToInt(Trim(s20), 0); 
              m_GuildWarList.AddObject(TGUild(GuildWar.Guild).sGuildName, 
                TObject(GuildWar)); 
            end 
            else 
            begin 
              DisPose(GuildWar); 
            end; 
          end; 
        end; 
      3: 
        begin 
          while (s18 <> '') do 
          begin 
            s18 := GetValidStr3(s18, s1C, [' ', ',']); 
            s18 := GetValidStr3(s18, s20, [' ', ',']); 
            if s1C = '' then 
              break; 
            Guild := g_GuildManager.FindGuild(s1C); 
            if Guild <> nil then 
              GuildAllList.AddObject(s1C, Guild); 
          end; 
        end; 
      4: 
        begin 
          if (n2C > 0) and (s24 <> '') then 
          begin 
            if Length(s24) > 30 then    //Jacky 限制职倍的长度 
              s24 := Copy(s24, 1, g_Config.nGuildRankNameLen {30}); 
 
            if GuildRank = nil then 
            begin 
              New(GuildRank); 
              GuildRank.nRankNo := n2C; 
              GuildRank.sRankName := s24; 
              GuildRank.MemberList := TStringList.Create; 
              m_RankList.Add(GuildRank); 
            end; 
            while (s18 <> '') do 
            begin 
              s18 := GetValidStr3(s18, s1C, [' ', ',']); 
              if s1C = '' then 
                break; 
              GuildRank.MemberList.Add(s1C); 
            end; 
          end; 
        end; 
    end;                                // case 
  end; 
  LoadList.Free; 
  Result := True; 
end; 
 
procedure TGUild.RefMemberName;         //00498F60 
var 
  i, ii             : Integer; 
  GuildRank         : pTGuildRank; 
  BaseObject        : TBaseObject; 
begin 
  for i := 0 to m_RankList.Count - 1 do 
  begin 
    GuildRank := m_RankList.Items[i]; 
    for ii := 0 to GuildRank.MemberList.Count - 1 do 
    begin 
      BaseObject := TBaseObject(GuildRank.MemberList.Objects[ii]); 
      if BaseObject <> nil then 
        BaseObject.RefShowName; 
    end; 
  end; 
end; 
 
procedure TGUild.SaveGuildInfoFile;     //004985EC 
begin 
  if nServerIndex = 0 then 
  begin 
    SaveGuildFile(g_Config.sGuildDir + sGuildName + '.txt'); 
    SaveGuildConfig(g_Config.sGuildDir + sGuildName + '.ini'); 
  end 
  else 
  begin 
    SaveGuildFile(g_Config.sGuildDir + sGuildName + '.' + 
      IntToStr(nServerIndex)); 
  end; 
end; 
 
 
procedure TGUild.SaveGuildConfig(sFileName: string); 
begin 
  m_Config.WriteString('Guild', 'GuildName', sGuildName); 
  m_Config.WriteInteger('Guild', 'BuildPoint', m_nBuildPoint); 
  m_Config.WriteInteger('Guild', 'Aurae', m_nAurae); 
  m_Config.WriteInteger('Guild', 'Stability', m_nStability); 
  m_Config.WriteInteger('Guild', 'Flourishing', m_nFlourishing); 
  m_Config.WriteInteger('Guild', 'ChiefItemCount', m_nChiefItemCount); 
end; 
 
procedure TGUild.SaveGuildFile(sFileName: string); 
var 
  SaveList          : TStringList; 
  i, ii             : Integer; 
  WarGuild          : pTWarGuild; 
  GuildRank         : pTGuildRank; 
  n14               : Integer; 
begin 
  SaveList := TStringList.Create; 
  SaveList.Add(g_Config.sGuildNotice); 
  for i := 0 to NoticeList.Count - 1 do 
  begin 
    SaveList.Add('+' + NoticeList.Strings[i]); 
  end; 
  SaveList.Add(' '); 
  SaveList.Add(g_Config.sGuildWar); 
  for i := 0 to m_GuildWarList.Count - 1 do 
  begin 
    WarGuild := pTWarGuild(m_GuildWarList.Objects[i]); 
    n14 := WarGuild.dwWarTime - (GetTickCount - WarGuild.dwWarTick); 
    if n14 <= 0 then 
      Continue; 
    SaveList.Add('+' + m_GuildWarList.Strings[i] + ' ' + IntToStr(n14)); 
  end; 
  SaveList.Add(' '); 
  SaveList.Add(g_Config.sGuildAll); 
  for i := 0 to GuildAllList.Count - 1 do 
  begin 
    SaveList.Add('+' + GuildAllList.Strings[i]); 
  end; 
  SaveList.Add(' '); 
  SaveList.Add(g_Config.sGuildMember); 
  for i := 0 to m_RankList.Count - 1 do 
  begin 
    GuildRank := m_RankList.Items[i]; 
    SaveList.Add('#' + IntToStr(GuildRank.nRankNo) + ' ' + GuildRank.sRankName); 
    for ii := 0 to GuildRank.MemberList.Count - 1 do 
    begin 
      SaveList.Add('+' + GuildRank.MemberList.Strings[ii]); 
    end; 
  end; 
  try 
    SaveList.SaveToFile(sFileName); 
  except 
    MainOutMessage('保存行会信息失败!!! ' + sFileName); 
  end; 
  SaveList.Free; 
end; 
 
procedure TGUild.SendGuildMsg(sMsg: string); //00498FF0 
var 
  i                 : Integer; 
  ii                : Integer; 
  GuildRank         : pTGuildRank; 
  BaseObject        : TBaseObject; 
  nCheckCode        : Integer; 
begin 
  nCheckCode := 0; 
  try 
    if g_Config.boShowPreFixMsg then 
      sMsg := g_Config.sGuildMsgPreFix + sMsg; 
    //if RankList = nil then exit; 
    nCheckCode := 1; 
    for i := 0 to m_RankList.Count - 1 do 
    begin 
      GuildRank := m_RankList.Items[i]; 
      nCheckCode := 2; 
      //if GuildRank.MemberList = nil then Continue; 
      for ii := 0 to GuildRank.MemberList.Count - 1 do 
      begin 
        nCheckCode := 3; 
        BaseObject := TBaseObject(GuildRank.MemberList.Objects[ii]); 
        if BaseObject = nil then 
          Continue; 
        nCheckCode := 4; 
        if BaseObject.m_boBanGuildChat then 
        begin 
          nCheckCode := 5; 
          BaseObject.SendMsg(BaseObject, RM_GUILDMESSAGE, 0, 
            g_Config.btGuildMsgFColor, g_Config.btGuildMsgBColor, 0, sMsg); 
          nCheckCode := 6; 
        end; 
      end; 
    end; 
    (* 
    TGuild.SendGuildMsg CheckCode: 5 GuildName = 〖統治〗 Msg = 〖行会〗釢fěη﹖: 换的玩撒 
  2004-12-2 15:45:48 Access violation at address 0041FD64 in module 'M2Server.exe'. Read of address 00000008 
    *); 
  except 
    on E: Exception do 
    begin 
      MainOutMessage('[Exceptiion] TGuild.SendGuildMsg CheckCode: ' + 
        IntToStr(nCheckCode) + ' GuildName = ' + sGuildName + ' Msg = ' + sMsg); 
      MainOutMessage(E.Message); 
    end; 
  end; 
end; 
 
function TGUild.SetGuildInfo(sChief: string): Boolean; //00498984 
var 
  GuildRank         : pTGuildRank; 
begin 
  if m_RankList.Count = 0 then 
  begin 
    New(GuildRank); 
    GuildRank.nRankNo := 1; 
    GuildRank.sRankName := g_Config.sGuildChief; 
    GuildRank.MemberList := TStringList.Create; 
    GuildRank.MemberList.Add(sChief); 
    m_RankList.Add(GuildRank); 
    SaveGuildInfoFile(); 
  end; 
  Result := True; 
end; 
 
function TGUild.GetRankName(PlayObject: TPlayObject; var nRankNo: Integer): 
  string;                               //004987F0 
var 
  i, ii             : Integer; 
  GuildRank         : pTGuildRank; 
begin 
  Result := ''; 
  for i := 0 to m_RankList.Count - 1 do 
  begin 
    GuildRank := m_RankList.Items[i]; 
    for ii := 0 to GuildRank.MemberList.Count - 1 do 
    begin 
      if GuildRank.MemberList.Strings[ii] = PlayObject.m_sCharName then 
      begin 
        GuildRank.MemberList.Objects[ii] := PlayObject; 
        nRankNo := GuildRank.nRankNo; 
        Result := GuildRank.sRankName; 
        //PlayObject.RefShowName(); 
        PlayObject.SendMsg(PlayObject, RM_CHANGEGUILDNAME, 0, 0, 0, 0, ''); 
        exit; 
      end; 
    end;                                // for 
  end; 
end; 
 
 
function TGUild.GetChiefName: string;   //00498928 
var 
  GuildRank         : pTGuildRank; 
begin 
  Result := ''; 
  if m_RankList.Count <= 0 then 
    exit; 
  GuildRank := m_RankList.Items[0]; 
  if GuildRank.MemberList.Count <= 0 then 
    exit; 
  Result := GuildRank.MemberList.Strings[0]; 
end; 
 
procedure TGUild.CheckSaveGuildFile(); 
begin 
  if boChanged and ((GetTickCount - dwSaveTick) > 30 * 1000) then 
  begin 
    boChanged := False; 
    SaveGuildInfoFile(); 
  end; 
end; 
 
procedure TGUild.DelHumanObj(PlayObject: TPlayObject); //00498ECC 
var 
  i, ii             : Integer; 
  GuildRank         : pTGuildRank; 
begin 
  CheckSaveGuildFile(); 
  for i := 0 to m_RankList.Count - 1 do 
  begin 
    GuildRank := m_RankList.Items[i]; 
    for ii := 0 to GuildRank.MemberList.Count - 1 do 
    begin 
      if TPlayObject(GuildRank.MemberList.Objects[ii]) = PlayObject then 
      begin 
        GuildRank.MemberList.Objects[ii] := nil; 
        exit; 
      end; 
    end; 
  end; 
end; 
 
procedure TGUild.TeamFightWhoDead(sName: string); //00499EC8 
var 
  i, n10            : Integer; 
begin 
  if not boTeamFight then 
    exit; 
  for i := 0 to TeamFightDeadList.Count - 1 do 
  begin 
    if TeamFightDeadList.Strings[i] = sName then 
    begin 
      n10 := Integer(TeamFightDeadList.Objects[i]); 
      TeamFightDeadList.Objects[i] := TObject(MakeLong(LoWord(n10) + 1, 
        HiWord(n10))); 
    end; 
  end; 
end; 
 
procedure TGUild.TeamFightWhoWinPoint(sName: string; nPoint: Integer); //00499DE4 
var 
  i, n14            : Integer; 
begin 
  if not boTeamFight then 
    exit; 
  Inc(m_nContestPoint, nPoint); 
  for i := 0 to TeamFightDeadList.Count - 1 do 
  begin 
    if TeamFightDeadList.Strings[i] = sName then 
    begin 
      n14 := Integer(TeamFightDeadList.Objects[i]); 
      TeamFightDeadList.Objects[i] := TObject(MakeLong(LoWord(n14), HiWord(n14) 
        + nPoint)); 
    end; 
  end; 
end; 
 
procedure TGUild.UpdateGuildFile(); 
begin 
  boChanged := True; 
  dwSaveTick := GetTickCount(); 
  SaveGuildInfoFile(); 
end; 
 
procedure TGUild.BackupGuildFile;       //00498AFC 
var 
  i, ii             : Integer; 
  PlayObject        : TPlayObject; 
  GuildRank         : pTGuildRank; 
begin 
  if nServerIndex = 0 then 
    SaveGuildFile(g_Config.sGuildDir + sGuildName + '.' + IntToStr(GetTickCount) 
      + '.bak'); 
  for i := 0 to m_RankList.Count - 1 do 
  begin 
    GuildRank := m_RankList.Items[i]; 
    for ii := 0 to GuildRank.MemberList.Count - 1 do 
    begin 
      PlayObject := TPlayObject(GuildRank.MemberList.Objects[ii]); 
      if PlayObject <> nil then 
      begin 
        PlayObject.m_MyGuild := nil; 
        PlayObject.RefRankInfo(0, ''); 
        PlayObject.RefShowName();       //10/31 
      end; 
    end; 
    GuildRank.MemberList.Free; 
    DisPose(GuildRank); 
  end; 
  m_RankList.Clear; 
  NoticeList.Clear; 
  for i := 0 to m_GuildWarList.Count - 1 do 
  begin 
    DisPose(pTWarGuild(m_GuildWarList.Objects[i])); 
  end; 
  m_GuildWarList.Clear; 
  GuildAllList.Clear; 
  SaveGuildInfoFile(); 
end; 
 
function TGUild.AddMember(PlayObject: TPlayObject): Boolean; //00498CA8 
var 
  i                 : Integer; 
  GuildRank         : pTGuildRank; 
  GuildRank18       : pTGuildRank; 
begin 
  Result := False; 
  GuildRank18 := nil; 
  for i := 0 to m_RankList.Count - 1 do 
  begin 
    GuildRank := m_RankList.Items[i]; 
    if GuildRank.nRankNo = 99 then 
    begin 
      GuildRank18 := GuildRank; 
      break; 
    end; 
  end; 
  if GuildRank18 = nil then 
  begin 
    New(GuildRank18); 
    GuildRank18.nRankNo := 99; 
    GuildRank18.sRankName := g_Config.sGuildMemberRank; 
    GuildRank18.MemberList := TStringList.Create; 
    m_RankList.Add(GuildRank18); 
  end; 
  GuildRank18.MemberList.AddObject(PlayObject.m_sCharName, TObject(PlayObject)); 
  UpdateGuildFile(); 
  Result := True; 
end; 
 
function TGUild.DelMember(sHumName: string): Boolean; //00498DCC 
var 
  i, ii             : Integer; 
  GuildRank         : pTGuildRank; 
begin 
  Result := False; 
  for i := 0 to m_RankList.Count - 1 do 
  begin 
    GuildRank := m_RankList.Items[i]; 
    for ii := 0 to GuildRank.MemberList.Count - 1 do 
    begin 
      if GuildRank.MemberList.Strings[ii] = sHumName then 
      begin 
        GuildRank.MemberList.Delete(ii); 
        Result := True; 
        break; 
      end; 
    end; 
    if Result then 
      break; 
  end; 
  if Result then 
    UpdateGuildFile; 
 
end; 
 
function TGUild.CancelGuld(sHumName: string): Boolean; //00498A50 
var 
  GuildRank         : pTGuildRank; 
begin 
  Result := False; 
  if m_RankList.Count <> 1 then 
    exit; 
  GuildRank := m_RankList.Items[0]; 
  if GuildRank.MemberList.Count <> 1 then 
    exit; 
  if GuildRank.MemberList.Strings[0] = sHumName then 
  begin 
    BackupGuildFile(); 
    Result := True; 
  end; 
end; 
 
function TGUild.UpdateRank(sRankData: string): Integer; //00499140 
 
  procedure ClearRankList(var RankList: TMyList); //004990DC 
  var 
    i               : Integer; 
    GuildRank       : pTGuildRank; 
  begin 
    for i := 0 to RankList.Count - 1 do 
    begin 
      GuildRank := RankList.Items[i]; 
      GuildRank.MemberList.Free; 
      DisPose(GuildRank); 
    end; 
    RankList.Free; 
  end; 
var 
  i                 : Integer; 
  ii                : Integer; 
  III               : Integer; 
  GuildRankList     : TMyList; 
  GuildRank         : pTGuildRank; 
  NewGuildRank      : pTGuildRank; 
  sRankInfo         : string; 
  sRankNo           : string; 
  sRankName         : string; 
  sMemberName       : string; 
  n28               : Integer; 
  n2C               : Integer; 
  n30               : Integer; 
  boCheckChange     : Boolean; 
  PlayObject        : TPlayObject; 
begin 
  Result := -1; 
  GuildRankList := TMyList.Create; 
  GuildRank := nil; 
  while (True) do 
  begin 
    if sRankData = '' then 
      break; 
    sRankData := GetValidStr3(sRankData, sRankInfo, [#$0D]); 
    sRankInfo := Trim(sRankInfo); 
    if sRankInfo = '' then 
      Continue; 
    if sRankInfo[1] = '#' then 
    begin                               //取得职称的名称 
      sRankInfo := Copy(sRankInfo, 2, Length(sRankInfo) - 1); 
      sRankInfo := GetValidStr3(sRankInfo, sRankNo, [' ', '<']); 
      sRankInfo := GetValidStr3(sRankInfo, sRankName, ['<', '>']); 
      if Length(sRankName) > 30 then    //Jacky 限制职倍的长度 
        sRankName := Copy(sRankName, 1, 30); 
      if GuildRank <> nil then 
      begin 
        GuildRankList.Add(GuildRank); 
      end; 
      New(GuildRank); 
      GuildRank.nRankNo := Str_ToInt(sRankNo, 99); 
      GuildRank.sRankName := Trim(sRankName); 
      GuildRank.MemberList := TStringList.Create; 
      Continue; 
    end; 
 
    if GuildRank = nil then 
      Continue; 
    i := 0; 
    while (True) do 
    begin                               //将成员名称加入职称表里 
      if sRankInfo = '' then 
        break; 
      sRankInfo := GetValidStr3(sRankInfo, sMemberName, [' ', ',']); 
      if sMemberName <> '' then 
        GuildRank.MemberList.Add(sMemberName); 
      Inc(i); 
      if i >= 10 then 
        break; 
    end; 
  end; 
 
  if GuildRank <> nil then 
  begin 
    GuildRankList.Add(GuildRank); 
  end; 
 
  //0049931F  校验成员列表是否有改变,如果未修改则退出 
  if m_RankList.Count = GuildRankList.Count then 
  begin 
    boCheckChange := True; 
    for i := 0 to m_RankList.Count - 1 do 
    begin 
      GuildRank := m_RankList.Items[i]; 
      NewGuildRank := GuildRankList.Items[i]; 
      if (GuildRank.nRankNo = NewGuildRank.nRankNo) and 
        (GuildRank.sRankName = NewGuildRank.sRankName) and 
        (GuildRank.MemberList.Count = NewGuildRank.MemberList.Count) then 
      begin 
        for ii := 0 to GuildRank.MemberList.Count - 1 do 
        begin 
          if GuildRank.MemberList.Strings[ii] <> 
            NewGuildRank.MemberList.Strings[ii] then 
          begin 
            boCheckChange := False;     //如果有改变则将其置为FALSE 
            break; 
          end; 
        end; 
      end 
      else 
      begin 
        boCheckChange := False; 
        break; 
      end; 
    end; 
    if boCheckChange then 
    begin 
      Result := -1;                     //$FFFFFFFF 
      ClearRankList(GuildRankList); 
      exit; 
    end; 
  end; 
 
  //0049943D 检查行会掌门职业是否为空 
  Result := -2;                         //$FFFFFFFE 
  if (GuildRankList.Count > 0) then 
  begin 
    GuildRank := GuildRankList.Items[0]; 
    if GuildRank.nRankNo = 1 then 
    begin 
      if GuildRank.sRankName <> '' then 
      begin 
        Result := 0; 
      end 
      else 
      begin 
        Result := -3;                   //$FFFFFFFD 
      end; 
    end; 
  end; 
 
  //检查行会掌门人是否在线(???) 
  if Result = 0 then 
  begin                                 //0049947A 
    GuildRank := GuildRankList.Items[0]; 
    if GuildRank.MemberList.Count <= 2 then 
    begin 
      n28 := GuildRank.MemberList.Count; 
      for i := 0 to GuildRank.MemberList.Count - 1 do 
      begin 
        if UserEngine.GetPlayObject(GuildRank.MemberList.Strings[i]) = nil then 
        begin 
          Dec(n28); 
          break; 
        end; 
      end; 
      if n28 <= 0 then 
        Result := -5;                   //$FFFFFFFB 
    end 
    else 
    begin 
      Result := -4;                     //$FFFFFFFC 
    end; 
  end; 
 
 
  if Result = 0 then 
  begin                                 //00499517 
    n2C := 0; 
    n30 := 0; 
    for i := 0 to m_RankList.Count - 1 do 
    begin 
      GuildRank := m_RankList.Items[i]; 
      boCheckChange := True; 
      for ii := 0 to GuildRank.MemberList.Count - 1 do 
      begin 
        boCheckChange := False; 
        sMemberName := GuildRank.MemberList.Strings[ii]; 
        Inc(n2C); 
        for III := 0 to GuildRankList.Count - 1 do 
        begin                           //搜索新列表 
          NewGuildRank := GuildRankList.Items[III]; 
          for n28 := 0 to NewGuildRank.MemberList.Count - 1 do 
          begin 
            if NewGuildRank.MemberList.Strings[n28] = sMemberName then 
            begin 
              boCheckChange := True; 
              break; 
            end; 
          end; 
          if boCheckChange then 
            break; 
        end; 
 
        if not boCheckChange then 
        begin                           //原列表中的人物名称是否在新的列表中 
          Result := -6;                 //$FFFFFFFA 
          break; 
        end; 
      end; 
      if not boCheckChange then 
        break; 
    end; 
 
    //00499640 
    for i := 0 to GuildRankList.Count - 1 do 
    begin 
      GuildRank := GuildRankList.Items[i]; 
      boCheckChange := True; 
      for ii := 0 to GuildRank.MemberList.Count - 1 do 
      begin 
        boCheckChange := False; 
        sMemberName := GuildRank.MemberList.Strings[ii]; 
        Inc(n30); 
        for III := 0 to GuildRankList.Count - 1 do 
        begin 
          NewGuildRank := GuildRankList.Items[III]; 
          for n28 := 0 to NewGuildRank.MemberList.Count - 1 do 
          begin 
            if NewGuildRank.MemberList.Strings[n28] = sMemberName then 
            begin 
              boCheckChange := True; 
              break; 
            end; 
          end; 
          if boCheckChange then 
            break; 
        end; 
        if not boCheckChange then 
        begin 
          Result := -6;                 //$FFFFFFFA 
          break; 
        end; 
      end; 
      if not boCheckChange then 
        break; 
    end; 
    if (Result = 0) and (n2C <> n30) then 
    begin 
      Result := -6; 
    end; 
  end;                                  //0049976A 
 
  if Result = 0 then 
  begin                                 //检查职位号是否重复及非法 
    for i := 0 to GuildRankList.Count - 1 do 
    begin 
      n28 := pTGuildRank(GuildRankList.Items[i]).nRankNo; 
      for III := i + 1 to GuildRankList.Count - 1 do 
      begin 
        if (pTGuildRank(GuildRankList.Items[III]).nRankNo = n28) or (n28 <= 0) 
          or (n28 > 99) then 
        begin 
          Result := -7;                 //$FFFFFFF9 
          break; 
        end; 
      end; 
      if Result <> 0 then 
        break; 
    end; 
  end;                                  //004997E9 
 
  if Result = 0 then 
  begin 
    ClearRankList(m_RankList); 
    m_RankList := GuildRankList; 
    //更新在线人物职位表 
    for i := 0 to m_RankList.Count - 1 do 
    begin 
      GuildRank := m_RankList.Items[i]; 
      for III := 0 to GuildRank.MemberList.Count - 1 do 
      begin 
        PlayObject := 
          UserEngine.GetPlayObject(GuildRank.MemberList.Strings[III]); 
        if PlayObject <> nil then 
        begin 
          GuildRank.MemberList.Objects[III] := TObject(PlayObject); 
          PlayObject.RefRankInfo(GuildRank.nRankNo, GuildRank.sRankName); 
          PlayObject.RefShowName();     //10/31 
        end; 
      end; 
    end; 
    UpdateGuildFile(); 
  end 
  else 
  begin                                 //004998C3 
    ClearRankList(GuildRankList); 
  end; 
end; 
 
function TGUild.IsNotWarGuild(Guild: TGUild): Boolean; //00499C98 
var 
  i                 : Integer; 
begin 
  Result := False; 
  for i := 0 to m_GuildWarList.Count - 1 do 
  begin 
    if pTWarGuild(m_GuildWarList.Objects[i]).Guild = Guild then 
    begin 
      exit; 
    end; 
  end; 
  Result := True; 
end; 
 
function TGUild.AllyGuild(Guild: TGUild): Boolean; //00499C2C 
var 
  i                 : Integer; 
begin 
  Result := False; 
  for i := 0 to GuildAllList.Count - 1 do 
  begin 
    if GuildAllList.Objects[i] = Guild then 
    begin 
      exit; 
    end; 
  end; 
  GuildAllList.AddObject(Guild.sGuildName, Guild); 
  SaveGuildInfoFile(); 
  Result := True; 
end; 
 
function TGUild.AddWarGuild(Guild: TGUild): pTWarGuild; 
var 
  i                 : Integer; 
  WarGuild          : pTWarGuild; 
begin 
  Result := nil; 
  if Guild <> nil then 
  begin 
    if not IsAllyGuild(Guild) then 
    begin 
      WarGuild := nil; 
      for i := 0 to m_GuildWarList.Count - 1 do 
      begin 
        if pTWarGuild(m_GuildWarList.Objects[i]).Guild = Guild then 
        begin 
          WarGuild := pTWarGuild(m_GuildWarList.Objects[i]); 
          WarGuild.dwWarTick := GetTickCount(); 
          WarGuild.dwWarTime := g_Config.dwGuildWarTime {10800000}; 
          SendGuildMsg('***' + Guild.sGuildName + '行会战争将持续三个小时。'); 
          break; 
        end; 
      end; 
      if WarGuild = nil then 
      begin 
        New(WarGuild); 
        WarGuild.Guild := Guild; 
        WarGuild.dwWarTick := GetTickCount(); 
        WarGuild.dwWarTime := g_Config.dwGuildWarTime {10800000}; 
        m_GuildWarList.AddObject(Guild.sGuildName, TObject(WarGuild)); 
        SendGuildMsg('***' + Guild.sGuildName + '行会战争开始(三个小时)'); 
      end; 
      Result := WarGuild; 
    end; 
  end; 
  RefMemberName(); 
  UpdateGuildFile(); 
 
end; 
 
procedure TGUild.sub_499B4C(Guild: TGUild); //00499B4C 
begin 
  SendGuildMsg('***' + Guild.sGuildName + '行会战争结束'); 
end; 
 
function TGUild.GetMemberCount: Integer; 
var 
  i                 : Integer; 
  GuildRank         : pTGuildRank; 
begin 
  Result := 0; 
  for i := 0 to m_RankList.Count - 1 do 
  begin 
    GuildRank := m_RankList.Items[i]; 
    Inc(Result, GuildRank.MemberList.Count); 
  end; 
end; 
 
function TGUild.GetMemgerIsFull: Boolean; 
begin 
  Result := False; 
  if GetMemberCount >= g_Config.nGuildMemberMaxLimit then 
  begin 
    Result := True; 
  end; 
end; 
 
procedure TGUild.StartTeamFight; 
begin 
  m_nContestPoint := 0; 
  boTeamFight := True; 
  TeamFightDeadList.Clear; 
end; 
 
procedure TGUild.EndTeamFight; 
begin 
  boTeamFight := False; 
end; 
 
procedure TGUild.AddTeamFightMember(sHumanName: string); 
begin 
  TeamFightDeadList.Add(sHumanName); 
end; 
 
 
procedure TGUild.SetAuraePoint(nPoint: Integer); 
begin 
  m_nAurae := nPoint; 
  boChanged := True; 
end; 
 
procedure TGUild.SetBuildPoint(nPoint: Integer); 
begin 
  m_nBuildPoint := nPoint; 
  boChanged := True; 
end; 
 
procedure TGUild.SetFlourishPoint(nPoint: Integer); 
begin 
  m_nFlourishing := nPoint; 
  boChanged := True; 
end; 
 
procedure TGUild.SetStabilityPoint(nPoint: Integer); 
begin 
  m_nStability := nPoint; 
  boChanged := True; 
end; 
 
procedure TGUild.SetChiefItemCount(nPoint: Integer); 
begin 
  m_nChiefItemCount := nPoint; 
  boChanged := True; 
end; 
 
end.