首页
社区
课程
招聘
[旧帖] (图+源码)热血传奇如何在寻路的同时完全打死一个怪再打另一个? 0.00雪花
发表于: 2010-11-5 18:22 9046

[旧帖] (图+源码)热血传奇如何在寻路的同时完全打死一个怪再打另一个? 0.00雪花

2010-11-5 18:22
9046

给点思路即可。现在如果点击开启打怪,它会边寻路边打怪,但只是偶尔会打一下怪了(不会打死),如何保证在寻路的同时完全打死一个怪后再打另一只呢?对DEPHI才接触23天,不熟,请路过的兄弟朋友们指点一下!!!给个思路即可

自动利用技能打怪的函数如下:(不管在哪儿,可以清楚周围所有怪)
procedure TForm1.Auto_PlayMonTimer(Sender: TObject);
var
i,monNum:integer;
curType:PByte;
temp,temp2,temMonObj:dword;
playBase,pt,curRole,pmonNum,curRoleX,curRoleY,curRoleLD,temp1:PDWORD;//^integer ^Dword;
ws:pchar;
s,tempStr,tempTypeStr:string;
begin
    //flag:=true;
    self.Memo2.Clear;
    playBase:=Pointer($63E7C4);
        playBase:=Pointer(playbase^+$5FB5C);
    pmonNum:=Pointer(playbase^+$8);//周围怪物数量
      playBase:=Pointer(playbase^+$4);
     for  i:=0 to pmonNum^-1 do
        begin
    try
            curRole:=Pointer(playBase^+i*4);//对象基址
      temMonObj:=curRole^;
      curType:=Pointer(curRole^+$e); //表示怪物类型
      if (curType^= 0) then continue;//如果是0,表示不是怪物
            if (curRole=nil) then continue;
            if (curRole^=0) then continue;
       pt:=Pointer(curRole^+$24); //表示名称指针
       curRoleLD:=Pointer(curRole^+$16); //最后一位为1生0死表示怪物生死
       curRoleX:=Pointer(curRole^+$E0); //表示怪物X坐标
       curRoleY:=Pointer(curRole^+$E4); //表示怪物Y坐标
       temp:=curRoleLD^;
       tempStr:=copy(IntToHex(temp,8),8,8);
              EnterCriticalSection(Critical1);
              Try
                begin
                   if (tempStr='0')   then //如果怪物是活的并且周围有怪时,则
                     begin
                      ws:=Pointer(pt^);//表示名称
                            s:=strpas(ws);
                      self.Memo2.Lines.Add('怪物对象基址:'+IntToHex(curRole^,8)+'怪物名称:'+S+'怪物类型:'+IntToHex(curType^,8));
                      f1_f12(3,curRole^); //传入参数,3表示技能数组下标,curRole^表示怪物对象,调用技能打怪CALL
                     end;
                     {  否则无怪了,则寻路不行
                   else
                   begin
                      self.Memo2.Lines.Add('无怪了寻路,但是一旦寻路设定了目标点,就不会终止,除非手工光标点击');
                      //goRoadMir();
                   end; }
                end;
                finally
                LeaveCriticalSection(Critical1);
                end;
    except
    continue;
    end;
        end;
   // flag:=false;
end;

寻路的函数如下:(测试随便写的两个坐标,运行后直接寻路到目标点)
procedure TForm1.Button30Click(Sender: TObject);
begin
asm
push 1
mov edx,$000000df//X坐标
mov ecx,$00000165//Y坐标
mov eax,$63e7dc
mov eax,[eax]
mov ebx,$0050AF08
call ebx

end;
end;

如最上图:分别执行这两个函数,都是正确的。以上两段代码分别用两个定时器存放。 并用一个BUTTON按钮启动定时器
例:
procedure TForm1.Button29Click(Sender: TObject);
begin
Auto_PlayMon.Enabled:=true;
Auto_GoRoad.Enabled:=true;
end;

问题描述:现在呢,当点击开启挂机时,寻路的时候会偶尔打一下怪,而不是两下,这样当到达终点时,一个怪都没杀死,全部是偶尔打一下就继续走。
我希望达到这样的目的:寻路的同时打怪,并且打死一只怪后再打另一只怪,大家集思广益,提提思路即可。以下几种思路试过了都不行:
1。设置标识位。
2。当有怪时就打,无怪时就寻路。 结果是:难以控制,有时打一下怪,有时寻路。
其实核心要解决的是:如果有一个方式,能够保证完全杀死一个怪后执行寻路就好了。

当然以上只是我的思路,有什么考虑不周的地方请指正,万分感激!!!!!!!!

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 145
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
楼主应该把整个工程传上来。
2010-11-5 22:46
0
雪    币: 145
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
我感觉应该在打怪的和寻路的 两个过程里,都要修改。

当按下这个按钮时。开始自动寻路。并且开始自动寻怪。

      当遇到怪物后,保存一下目标坐标。然后停止寻路计时器。当杀死怪物后,在进行恢复寻路计时器。如此
循环。到达目的后,所有计时器都停止。
2010-11-5 22:50
0
雪    币: 145
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
当遇到怪物后,保存一下目标坐标。然后停止寻路计时器。当杀死怪物后,在进行恢复寻路计时器。如此
循环.

写在打怪函数里。
---------------------------

到达目的后,所有计时器都停止。
写在寻路函数
2010-11-5 22:51
0
雪    币: 190
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
//这段代码实现了遍历周围怪物,并调用雷电术(测试时技能栏设在第3格)技能打怪
procedure TForm1.Auto_PlayMonTimer(Sender: TObject);
var
i,monNum:integer;
curType:PByte;
temp,temp2,temMonObj:dword;
playBase,pt,curRole,pmonNum,curRoleX,curRoleY,curRoleLD,temp1:PDWORD;//^integer ^Dword;
ws:pchar;
s,tempStr,tempTypeStr,tempStr1:string;
begin
    self.Memo2.Clear;
    playBase:=Pointer($63E7C4);
                playBase:=Pointer(playbase^+$5FB5C);
    pmonNum:=Pointer(playbase^+$8);//周围怪物数量
          playBase:=Pointer(playbase^+$4);
         for  i:=0 to pmonNum^-1 do
                begin
    try
                        curRole:=Pointer(playBase^+i*4);//对象基址
      temMonObj:=curRole^;
      curType:=Pointer(curRole^+$e); //表示怪物类型
      if (curType^= 0) then continue;//如果是0,表示不是怪物
                        if (curRole=nil) then continue;
                        if (curRole^=0) then continue;
       pt:=Pointer(curRole^+$24); //表示名称指针
       curRoleLD:=Pointer(curRole^+$16); //最后一位为1生0死表示怪物生死
       curRoleX:=Pointer(curRole^+$E0); //表示怪物X坐标
       curRoleY:=Pointer(curRole^+$E4); //表示怪物Y坐标
       temp:=curRoleLD^;
       tempStr:=copy(IntToHex(temp,8),8,8);

                begin
                   if (tempStr='0')   then //如果怪物是活的并且周围有怪时,则
                     begin
                     Auto_GoRoad.Enabled:=false;//有怪时关掉计时器
                     //但疑问是关掉计时器后人物寻路不会自动停止
                      ws:=Pointer(pt^);//表示名称
                                        s:=strpas(ws);
                      self.Memo2.Lines.Add('怪物对象基址:'+IntToHex(curRole^,8)+'怪物名称:'+S+'怪物类型:'+IntToHex(curType^,8));
                      f1_f12(3,curRole^); //传入参数,3表示技能数组下标,curRole^表示怪物对象,调用技能打怪CALL
                     end
                end;
    except
    continue;
    end;
                end;
    //此处判断周围是否无怪,无怪就寻路
    tempStr1:=self.Memo2.Text;
    if tempStr1='' then
    begin
           flag:=true;
          // goRoadMir($000000df,$00000165); //寻路函数
           Auto_GoRoad.Enabled:=true; //开启寻路计时器
    end;

end;

如下:测试时,有一个疑问,如上: 但疑问是关掉计时器后人物寻路不会自动停止,非得鼠标单击才停止,如何解决呢?
2010-11-6 13:35
0
雪    币: 190
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
也就是说以上代码实现了:有怪时打怪,但非得手动让游戏人物停(例如:鼠标点一下,此时游戏中人物会自动清除周围怪后寻路),无怪时可以寻路了.
2010-11-6 13:37
0
游客
登录 | 注册 方可回帖
返回
//