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


unit Guild; 
 
interface 
uses 
  Windows, SysUtils, Classes,IniFiles,ObjBase; 
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 
    GuildWarList :TStringList; //0x0C 
    GuildAllList :TStringList; //0x10 
    m_RankList     :TList;       //0x14 职位列表 
    nContestPoint:integer;     //0x18 
    boTeamFight  :Boolean;     //0x1C; 
//    MatchPoint   :Integer; 
    TeamFightDeadList      :TStringList; //0x20 
    m_boEnableAuthAlly :Boolean;     //0x24 
    dwSaveTick   :LongWord;     //0x28 
    boChanged    :Boolean;     //0x2C; 
    m_DynamicVarList      :TList; 
  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  :TList;  //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:=TList.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.GuildWarList.Count - 1 downto 0 do begin 
      WarGuild:=pTWarGuild(Guild.GuildWarList.Objects[II]); 
      if (GetTickCount - WarGuild.dwWarTick) > WarGuild.dwWarTime then begin 
        Guild.sub_499B4C(TGuild(WarGuild.Guild)); 
        Guild.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; 
  GuildWarList          :=TStringList.Create; 
  GuildAllList          :=TStringList.Create; 
  m_RankList              :=TList.Create; 
  TeamFightDeadList     :=TStringList.Create; 
  dwSaveTick            :=0; 
  boChanged             :=False; 
  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      := TList.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; 
  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 GuildWarList.Count - 1 do begin 
    if pTWarGuild(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 GuildWarList.Count - 1 do begin 
    Dispose(pTWarGuild(GuildWarList.Objects[I])); 
  end;    // for 
  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); 
            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 GuildWarList.Count -1 do begin 
    WarGuild:=pTWarGuild(GuildWarList.Objects[I]); 
    n14:=WarGuild.dwWarTime - (GetTickCount - WarGuild.dwWarTick); 
    if n14 <= 0 then Continue; 
    SaveList.Add('+' + 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(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 GuildWarList.Count - 1 do begin 
    Dispose(pTWarGuild(GuildWarList.Objects[I])); 
  end; 
  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:TList);//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 :TList; 
  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 := TList.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 GuildWarList.Count - 1 do begin 
    if pTWarGuild(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 GuildWarList.Count - 1 do begin 
        if pTWarGuild(GuildWarList.Objects[I]).Guild = Guild then begin 
          WarGuild:=pTWarGuild(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}; 
        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 
  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.