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

📄 uguildsub.pas

📁 千年源代码,只缺少控件,可以做二次开发用,好不容易得来的
💻 PAS
📖 第 1 页 / 共 2 页
字号:
   tmpManager := ManagerList.GetManagerByServerID (aServerID);

   nX := aX; nY := aY;
   TMaper(tmpManager.Maper).GetNearXY (nX, nY);
   StartX := nX; StartY := nY;
   TargetX := nX; TargetY := nY;
   RestX := nX; RestY := nY;
   BasicData.x := nX; BasicData.y := nY;

   SetManagerClass (tmpManager);
end;

function  AddPermitExp (var aLevel, aExp: integer; addvalue: integer): integer;
var n : integer;
begin
   n := GetLevelMaxExp (aLevel) * 3;
   if n > addvalue then n := addvalue;
   inc (aExp, n);
   aLevel := GetLevel (aExp);
   Result := n;
end;

function  TGuildNpc.FieldProc (hfu: Longint; Msg: word; var SenderInfo: TBasicData; var aSubData: TSubData): Integer;
var
   i: integer;
   str, boname : String;
   sayer, objectname, gradename, targetname : String;
   Bo: TBasicObject;
   MagicData : TMagicData;
   OldSkillLevel : Integer;
begin
   Result := PROC_FALSE;
   if isRangeMessage ( hfu, Msg, SenderInfo) = FALSE then exit;
   Result := inherited FieldProc (hfu, Msg, Senderinfo, aSubData);
   if Result = PROC_TRUE then exit;
   case Msg of
      FM_ADDITEM :
         begin
            exit;
            {
            Bo := GetViewObjectByid (SenderInfo.id);
            if Bo = nil then exit;
            if not (Bo is TUSER) then exit;
            boname := TUser (Bo).Name;
            IsSysopName(boname);
            }
         end;
      FM_ADDATTACKEXP  :
         begin
            if boMagicNpc then begin
               OldSkillLevel := GuildMagicData.rcSkillLevel;
               AddPermitExp (GuildMagicData.rcSkillLevel, GuildMagicData.rSkillExp, aSubData.ExpData.Exp);
               if OldSkillLevel <> GuildMagicData.rcSkillLevel then begin
                  if (GuildMagicData.rcSkillLevel mod 10) = 0 then begin
                     {
                     if GuildMagicData.rcSkillLevel >= 5000 then begin
                        BocSay ( Get10000To100 (GuildMagicData.rcSkillLevel) );
                     end else begin
                        BocSay ( Get10000To100 (GuildMagicData.rcSkillLevel) );
                     end;
                     }
                     BocSay ( Get10000To100 (GuildMagicData.rcSkillLevel) );
                  end;
               end;
            end;
         end;
      FM_SHOW :
         begin
         end;
      FM_CHANGEFEATURE:
         begin
            if (SenderInfo.id = TargetId) and (SenderInfo.Feature.rFeatureState = wfs_die) then SetTargetId (0);
         end;
      FM_GUILDATTACK :
         begin
            if CurLife <= 0 then exit;

            if aSubData.TargetID = 0 then begin
               SetTargetID (aSubData.TargetID);
               exit;
            end;
            
            if LifeObjectState = los_attack then exit;

            Result := PROC_FALSE;
            if aSubData.TargetId <> 0 then begin
               // 2000.10.04 巩林唱 何巩林绰 傍拜窍瘤 臼档废 荐沥 by Lee.S.G
               Bo := GetViewObjectByID (aSubData.TargetId);
               if Bo = nil then exit;
               if Bo is TGuildNpc then begin
                  if TGuildObject(ParentGuildObject).GuildName <> TGuildObject(TGuildNpc(Bo).ParentGuildObject).GuildName then begin
                     SetTargetId(aSubData.TargetId);
                  end;
               end
               else begin
                  if Bo is TUser then begin
                     boname := TUser (Bo).Name;
                     if IsSysopName(boname) = FALSE then begin
                        SetTargetId (aSubData.TargetId);
                     end;
                  end else begin
                     SetTargetId (aSubData.TargetId);
                  end;
               end;
               Result := PROC_TRUE;
            end;
         end;
      FM_STRUCTED :
         begin
            if (SenderInfo.id = BasicData.id) then begin
               if CurLife <= 0 then begin
                  SetTargetId (0);
                  // CommandChangeCharState (wfs_die);
                  exit;
               end;
               if pGuildNpcData^.rboProtecter then begin
                  // 2000.10.04 巩林唱 何巩林绰 傍拜窍瘤 臼档废 荐沥 by Lee.S.G
                  Bo := GetViewObjectByID (aSubData.Attacker);
                  if Bo = nil then exit;
                  if Bo is TGuildNpc then begin
                     if TGuildObject(ParentGuildObject).GuildName <> TGuildObject(TGuildNpc(Bo).ParentGuildObject).GuildName then begin
                        SetTargetId(aSubData.attacker);
                     end;
                  end
                  else begin
                     if Bo is TUser then begin
                        {
                        boname := TUser (Bo).Name;
                        if IsSysopName(boname) = TRUE then begin
                           // 巩颇包府磊俊霸 嘎疽阑锭俊绰 泪矫 巩林狼 馆措规氢栏肺 雀乔
                           if (BasicData.X < TUser(Bo).BasicData.X) and (BasicData.Y < TUser(Bo).BasicData.Y) then begin
                              TargetX := BasicData.X - 6; TargetY := BasicData.Y - 6;
                           end else if (BasicData.X = TUser(Bo).BasicData.X) and (BasicData.Y < TUser(Bo).BasicData.Y) then begin
                              TargetX := BasicData.X + 0; TargetY := BasicData.Y - 6;
                           end else if (BasicData.X > TUser(Bo).BasicData.X) and (BasicData.Y < TUser(Bo).BasicData.Y) then begin
                              TargetX := BasicData.X + 6; TargetY := BasicData.Y - 6;
                           end else if (BasicData.X > TUser(Bo).BasicData.X) and (BasicData.Y = TUser(Bo).BasicData.Y) then begin
                              TargetX := BasicData.X + 6; TargetY := BasicData.Y + 0;
                           end else if (BasicData.X > TUser(Bo).BasicData.X) and (BasicData.Y > TUser(Bo).BasicData.Y) then begin
                              TargetX := BasicData.X + 6; TargetY := BasicData.Y + 6;
                           end else if (BasicData.X = TUser(Bo).BasicData.X) and (BasicData.Y > TUser(Bo).BasicData.Y) then begin
                              TargetX := BasicData.X + 0; TargetY := BasicData.Y + 6;
                           end else if (BasicData.X < TUser(Bo).BasicData.X) and (BasicData.Y > TUser(Bo).BasicData.Y) then begin
                              TargetX := BasicData.X - 6; TargetY := BasicData.Y + 6;
                           end else if (BasicData.X < TUser(Bo).BasicData.X) and (BasicData.Y = TUser(Bo).BasicData.Y) then begin
                              TargetX := BasicData.X - 6; TargetY := BasicData.Y + 0;
                           end;
                           LifeObjectState := los_rest;
                        end else begin
                           SetTargetId (aSubData.attacker);
                        end;
                        }
                        SetTargetId (aSubData.attacker);
                     end else begin
                        SetTargetId (aSubData.attacker);
                     end;
                  end;
               end;
            end;
         end;
      FM_DEADHIT :
         begin
            CurLife := 0;
            CommandChangeCharState (wfs_die);
         end;
      FM_SAY:
         begin
            if FboAllowDelete then exit;
            if SenderInfo.id = BasicData.id then exit;
            if TargetId <> 0 then begin
               if (TargetID <> TGuildObject(ParentGuildObject).BasicData.ID) and
                  (LifeObjectState = los_attack) then exit;
            end;

            if LifeObjectState = los_escape then exit;

            str := GetWordString (aSubData.SayString);
            if ReverseFormat (str, '%s: ', sayer, objectname, gradename, 1) then begin
               if (IsSysopName(sayer) = FALSE) and (SysopClass.GetSysopScope (sayer) < 100) then begin
                  exit;
               end;
            end;

            if ReverseFormat (str, '%s: 巩颇公傍阑 %s丛俊霸 傈荐茄促', sayer, objectname, gradename, 2) then begin
               if boMagicNpc then begin
                  // 2000.09.18 NPC狼 捞抚苞 User狼 捞抚捞 鞍阑锭 八祸坷幅滚弊 荐沥 by Lee.S.G
                  // 巩颇公傍 傈荐绰 RACE_HUMAN俊辑父 蜡瓤窍促
                  Bo := GetViewObjectByName (objectname, RACE_HUMAN);
                  if Bo = nil then begin BocSay (format ('%s丛篮 绝嚼聪促.',[objectname])); exit; end;
                  if not (Bo is TUser) then begin BocSay (format ('%s丛篮 荤侩磊啊 酒凑聪促.',[objectname])); exit; end;
                  if TUser(Bo).GuildName = '' then begin BocSay ('巩盔捞 酒凑聪促.'); exit; end;
                  if TUser(Bo).GuildName <> TGuildObject(ParentGuildObject).GuildName then begin
                     BocSay (format ('%s丛篮 促弗巩颇 涝聪促.',[objectname]));
                     exit;
                  end;
                  if StrPas (@GuildMagicData.rName) = '' then begin BocSay ('巩颇公傍捞 绝嚼聪促.'); exit; end;
                  if GuildMagicData.rcSkillLevel < 5000 then begin BocSay ('历狼 荐访档啊 何练钦聪促.'); exit; end;
                  MagicClass.GetMagicData (StrPas (@GuildMagicData.rName), MagicData, 0);
                  if TUser(Bo).AddMagic (@MagicData) then begin
                     BocSay ('巩颇公傍阑 傈荐 沁嚼聪促.');
                     GuildMagicData.rSkillExp := 0;
                     GuildMagicData.rcSkillLevel := GetLevel(GuildMagicData.rSkillExp);
                  end else BocSay ('巩颇公傍阑 傈荐甫 角菩沁嚼聪促.');
               end;
               exit;
            end;

            if ReverseFormat (str, '%s: %s狼 捞抚篮 %s捞促', sayer, objectname, gradename, 3) then begin
               // objectname := copy (objectname, 1, Length(objectname)-2);
               if objectname = GuildNpcName then begin
                  for i := 0 to MAX_GUILDNPC_COUNT - 1 do begin
                     if TGuildObject (ParentGuildObject).IsGuildNpc (gradename) then begin
                        BocSay ('捞固 鞍篮 捞抚捞 乐嚼聪促.');
                        exit;
                     end;
                  end;

                  if (not isFullHangul (gradename)) or (not isGrammarID(gradename)) then begin
                     BocSay ('捞抚捞 肋给登菌嚼聪促.');
                     exit;
                  end;
                  if (Length (gradename) <= 1) or (Length(gradename) > 10) then begin
                     BocSay ('捞抚捞 肋给登菌嚼聪促.');
                     exit;
                  end;

                  TGuildObject (ParentGuildObject).ChangeGuildNpcName (GuildNpcName, GradeName);
                  
                  StrPCopy (@BasicData.Name, gradename);
                  StrPCopy (@BasicData.ViewName, gradename);
                  GuildNpcName := GradeName;
                  BocChangeProperty;
                  BocSay (format ('历狼 捞抚篮 %s啊 登菌嚼聪促.',[GuildNpcName]));
                  exit;
               end;
               exit;
            end;

            if ReverseFormat (str, '%s: %s狼 困摹绰 咯扁促', sayer, objectname, gradename, 2) then begin
               // objectname := copy (objectname, 1, Length(objectname)-2);
               if objectname = GuildNpcName then begin
                  if not TMaper(Manager.Maper).isObjectArea (BasicData.x, BasicData.y) then begin
                     StartX := BasicData.x; StartY := BasicData.y;
                     BocSay ('历绰 咯扁俊辑 矫累邓聪促.');
                  end else begin
                     BocSay ('捞镑俊 困摹甫 瘤沥且 荐 绝嚼聪促');
                  end;
               end;
               exit;
            end;
            if ReverseFormat (str, '%s: %s篮 蝶扼柯促', sayer, objectname, gradename, 2) or
               ReverseFormat (str, '%s: %s绰 蝶扼柯促', sayer, objectname, gradename, 2) then begin
               // objectname := copy (objectname, 1, Length(objectname)-2);
               if objectname = GuildNpcName then begin
                  if BasicData.Feature.rfeaturestate = wfs_sitdown then begin
                     BasicData.Feature.rfeaturestate := wfs_normal;
                     BocChangeFeature;
                  end;

                  TargetId := SenderInfo.id;
                  LifeObjectState := los_follow;
               end;
               exit;
            end;
            if ReverseFormat (str, '%s: %s篮 沥瘤茄促', sayer, objectname, gradename, 2) or
               ReverseFormat (str, '%s: %s绰 沥瘤茄促', sayer, objectname, gradename, 2) then begin
               // objectname := copy (objectname, 1, Length(objectname)-2);
               if objectname = GuildNpcName then LifeObjectState := los_stop;
               exit;
            end;
            // 2000.09.16 巩颇器凉俊 措茄 老绢急促,旧绰促狼 悼累 昏力 by Lee.S.G
            {
            // if ReverseFormat (str, '%s: %s 老绢急促', sayer, objectname, gradename, 2) then begin
               objectname := copy (objectname, 1, Length(objectname)-2);
               if objectname = GuildNpcName then begin
                  if BasicData.Feature.rfeaturestate = wfs_sitdown then begin
                     BasicData.Feature.rfeaturestate := wfs_normal;
                     BocChangeFeature;
                  end;
               end;
            end;
            // if ReverseFormat (str, '%s: %s 旧绰促', sayer, objectname, gradename, 2) then begin
               objectname := copy (objectname, 1, Length(objectname)-2);
               if objectname = GuildNpcName then begin
                  if BasicData.Feature.rfeaturestate = wfs_normal then begin
                     BasicData.Feature.rfeaturestate := wfs_sitdown;
                     BocChangeFeature;
                     LifeObjectState := los_stop;
                  end;
               end;
            end;
            }
            if ReverseFormat (str, '%s: %s篮 绒侥茄促', sayer, objectname, gradename, 2) or
               ReverseFormat (str, '%s: %s绰 绒侥茄促', sayer, objectname, gradename, 2) then begin
               // objectname := copy (objectname, 1, Length(objectname)-2);
               if objectname = GuildNpcName then begin
                  if BasicData.Feature.rfeaturestate = wfs_sitdown then begin
                     BasicData.Feature.rfeaturestate := wfs_normal;
                     BocChangeFeature;
                  end;

                  RestX := BasicData.x;
                  RestY := BasicData.y;
                  LifeObjectState := los_rest;
                  BocSay ('历绰 咯扁俊辑 绒侥钦聪促.');
               end;
               exit;
            end;
         end;
   end;
end;

procedure TGuildNpc.Update (CurTick: integer);
var
   key : word;
   Bo : TBasicObject;
   i : integer;
begin
   inherited UpDate (CurTick);

   if (BasicData.Feature.rFeatureState = wfs_die) and (CurTick > DiedTick + 1600) then begin
      FboAllowDelete := TRUE;
      exit;
   end;

   case LifeObjectState of
      los_none:
         begin
            if TargetPosTick + 3000 < CurTick then begin
               TargetPosTick := Curtick;
               TargetX := RestX - pGuildNpcData^.rActionWidth div 2 + Random (pGuildNpcData^.rActionWidth);
               TargetY := RestY - pGuildNpcData^.rActionWidth div 2 + Random (pGuildNpcData^.rActionWidth);
               exit;
            end;

            if WalkTick + 200 < CurTick then begin
               Walktick := CurTick;
               GotoXyStand (TargetX, TargetY);
            end;
         end;
      los_die :;
      los_follow:
         begin
            bo := TBasicObject (GetViewObjectById (TargetId));
            if bo = nil then LifeObjectState := los_none
            else begin
               if GetLargeLength (BasicData.X, BasicData.Y, bo.PosX, bo.PosY) <= 2 then exit; 

               if WalkTick + 60 < CurTick then begin
                  Walktick := CurTick;
                  GotoXyStand (bo.Posx, bo.Posy);
               end;
            end;
         end;
      los_stop:
         begin
         end;
      los_rest:
         begin
            if TargetPosTick + 3000 < CurTick then begin
               TargetPosTick := Curtick;
               TargetX := RestX - pGuildNpcData^.rActionWidth div 2 + Random (pGuildNpcData^.rActionWidth);
               TargetY := RestY - pGuildNpcData^.rActionWidth div 2 + Random (pGuildNpcData^.rActionWidth);
               exit;
            end;

            if WalkTick + 200 < CurTick then begin
               Walktick := CurTick;
               GotoXyStand (TargetX, TargetY);
            end;
         end;
      los_attack:
         begin
            bo := TBasicObject (GetViewObjectById (TargetId));
            if bo = nil then LifeObjectState := los_none
            else begin
               if GetLargeLength (BasicData.X, BasicData.Y, bo.PosX, bo.PosY) = 1 then begin
                  key := GetNextDirection (BasicData.X, BasicData.Y, bo.PosX, bo.PosY);
                  if key = DR_DONTMOVE then exit;   // 困率捞 0 老锭狼 版快牢单 困率捞 1烙..
                  if key <> BasicData.dir then CommandTurn (key);
                  CommandHit (CurTick);
               end else begin
                  if WalkTick + 35 < CurTick then begin
                     Walktick := CurTick;

                     GotoXyStand (bo.Posx, bo.Posy);
                  end;
               end;
            end;
         end;
   end;
end;

end.

⌨️ 快捷键说明

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