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

📄 structuresfrm.pas

📁 冒险岛吸怪源码UCE的制作材料 用于冒险岛游戏的外挂
💻 PAS
📖 第 1 页 / 共 3 页
字号:
end;

procedure TfrmStructures.PopupMenu1Popup(Sender: TObject);
begin
  AddElement1.Visible:=currentstructure<>nil;
  Deleteelement1.Visible:=(treeview1.selected<>nil);

  n3.Visible:=(treeview1.selected<>nil) and (treeview1.selected.Level=1);
  Recalculateaddress1.visible:=n3.Visible;
end;

procedure TfrmStructures.Deleteelement1Click(Sender: TObject);
var s: tstructure;
    elementnr: integer;
    i: integer;
begin
  if treeview1.Selected<>nil then
  begin
    elementnr:=treeview1.Selected.Index;
    s:=tstructure(treeview1.Selected.Data);

    if s=nil then exit;
    if s.basestructure<0 then exit;

    for i:=elementnr to length(definedstructures[s.basestructure].structelement)-2 do
      definedstructures[s.basestructure].structelement[i]:=definedstructures[s.basestructure].structelement[i+1];

    setlength(definedstructures[s.basestructure].structelement,length(definedstructures[s.basestructure].structelement)-1);
  end;

  currentstructure.refresh;
end;

procedure TfrmStructures.Save1Click(Sender: TObject);
var f: tfilestream;
    i,j: integer;
    x: dword;
    cemarker: string;
begin
  if savedialog1.Execute then
  begin
    f:=tfilestream.Create(savedialog1.FileName,fmcreate);
    try
      cemarker:='CHEATENGINE';
      f.WriteBuffer(cemarker[1],length(cemarker));

      x:=structureversion;
      f.writebuffer(x,4);

      x:=length(definedstructures);
      f.WriteBuffer(x,4);
      for i:=0 to length(definedstructures)-1 do
      begin
        x:=length(definedstructures[i].name);
        f.WriteBuffer(x,4); //namelength
        if x>0 then f.WriteBuffer(definedstructures[i].name[1],x);

        x:=length(definedstructures[i].structelement);
        f.WriteBuffer(x,4);

        for j:=0 to length(definedstructures[i].structelement)-1 do
        begin
          x:=length(definedstructures[i].structelement[j].description);
          f.WriteBuffer(x,4);
          if x>0 then f.Write(definedstructures[i].structelement[j].description[1],x);


          f.WriteBuffer(definedstructures[i].structelement[j].pointerto,sizeof(definedstructures[i].structelement[j].pointerto));
          f.WriteBuffer(definedstructures[i].structelement[j].pointertoSize,sizeof(definedstructures[i].structelement[j].pointerto));
          f.WriteBuffer(definedstructures[i].structelement[j].structurenr,sizeof(definedstructures[i].structelement[j].structurenr));
          f.WriteBuffer(definedstructures[i].structelement[j].bytesize,sizeof(definedstructures[i].structelement[j].bytesize));
        end;

      end;
    finally
      f.free;
    end;
  end;
end;

procedure TfrmStructures.Open1Click(Sender: TObject);
var f: tfilestream;
    i,j: integer;
    x: dword;
    cemarker: string;
    c: pchar;
    s: string;
begin
  if opendialog1.Execute then
  begin
    f:=tfilestream.Create(opendialog1.FileName,fmopenread);
    try
      cemarker:='CHEATENGINE';

      getmem(c,12);
      try
        f.ReadBuffer(c^,11);
        c[11]:=#0;
        s:=c;
      finally
        freemem(c);
      end;

      if s<>cemarker then raise exception.Create('This is not a valid structure file');

      f.ReadBuffer(x,4);
      if x<>structureversion then raise exception.Create('This structure fils was generated with a newer version of Cheat Engine. (That means there''s more than likely a new version so please update....)');

      f.ReadBuffer(x,4);
      setlength(definedstructures,x);

      for i:=0 to length(definedstructures)-1 do
      begin
        f.readbuffer(x,4);
        getmem(c,x+1);
        try
          f.ReadBuffer(c^,x);
          c[x]:=#0;
          definedstructures[i].name:=c;
        finally
          freemem(c);
        end;

        f.readbuffer(x,4);
        setlength(definedstructures[i].structelement,x);

        for j:=0 to length(definedstructures[i].structelement)-1 do
        begin
          f.readbuffer(x,4);
          getmem(c,x+1);
          try
            f.ReadBuffer(c^,x);
            c[x]:=#0;
            definedstructures[i].structelement[j].description:=c;
          finally
            freemem(c);
          end;

          f.ReadBuffer(definedstructures[i].structelement[j].pointerto,sizeof(definedstructures[i].structelement[j].pointerto));
          f.ReadBuffer(definedstructures[i].structelement[j].pointertoSize,sizeof(definedstructures[i].structelement[j].pointerto));
          f.ReadBuffer(definedstructures[i].structelement[j].structurenr,sizeof(definedstructures[i].structelement[j].structurenr));
          f.ReadBuffer(definedstructures[i].structelement[j].bytesize,sizeof(definedstructures[i].structelement[j].bytesize));
        end;

      end;
    finally
      f.free;
    end;

    TMenuItem.Create(self);

    RefreshMenuItems;
  end;
end;

procedure TfrmStructures.New1Click(Sender: TObject);
begin
  if (length(definedstructures)>0) and (messagedlg('Are you sure you want to remove all structures?',mtconfirmation,[mbyes,mbno],0)=mryes) then
  begin
    currentstructure.Free;
    currentstructure:=nil;
    
    setlength(definedstructures,0);
    refreshmenuitems;
  end;
end;

procedure TfrmStructures.ChangeElement1Click(Sender: TObject);
var i,j: integer;
    size: dword;
    structtype: string;
    selectedstructure: tstructure;
    selectedelement: integer;
    selectednode: ttreenode;
begin
  if treeview1.Selected=treeview1.Items.GetFirstNode then
  begin
    inputquery('Rename structure','Give the new name of this structure',definedstructures[currentstructure.basestructure].name);
    address:=address+1-1;
    currentstructure.refresh;
    exit;
  end;


  selectednode:=treeview1.Selected;
  if selectednode=nil then exit;

  selectedstructure:=tstructure(selectednode.Data);
  if selectedstructure=nil then exit;

  selectedelement:=selectednode.Index;

  i:=selectedstructure.basestructure;
  
  size:=definedstructures[i].structelement[selectedelement].bytesize;

  with tfrmstructuresaddelement.create(self) do
  begin
    //fill the combobox with possible types
    //the base types, and defined types
    cbtype.Items.AddObject('Byte',pointer(1));
    cbtype.Items.AddObject('Byte Signed',pointer(1));
    cbtype.Items.AddObject('Byte Hexadecimal',pointer(1));
    cbtype.Items.AddObject('2 Bytes',pointer(2));
    cbtype.Items.AddObject('2 Bytes Signed',pointer(2));
    cbtype.Items.AddObject('2 Bytes Hexadecimal',pointer(2));
    cbtype.Items.AddObject('4 Bytes',pointer(4));
    cbtype.Items.AddObject('4 Bytes Signed',pointer(4));
    cbtype.Items.AddObject('4 Bytes Hexadecimal',pointer(4));
    cbtype.Items.AddObject('8 Bytes',pointer(8));
    cbtype.Items.AddObject('8 Bytes Hexadecimal',pointer(8));
    cbtype.Items.AddObject('Float',pointer(4));
    cbtype.Items.AddObject('Double',pointer(8));
    cbtype.Items.AddObject('String',pointer(size));
    cbtype.Items.AddObject('String Unicode',pointer(size));

    cbtype.DropDownCount:=17;

    //and add the other defined structures as well
    for i:=0 to length(definedstructures)-1 do
    begin
      size:=0;
      for j:=0 to length(definedstructures[i].structelement)-1 do
        inc(size,definedstructures[i].structelement[j].bytesize);

      cbtype.Items.AddObject(definedstructures[i].name,pointer(size));
    end;

    if definedstructures[selectedstructure.basestructure].structelement[selectedelement].structurenr<0 then
      cbtype.ItemIndex:=-definedstructures[selectedstructure.basestructure].structelement[selectedelement].structurenr-1
    else
      cbtype.itemindex:=definedstructures[selectedstructure.basestructure].structelement[selectedelement].structurenr+15;


    edtDescription.text:=definedstructures[selectedstructure.basestructure].structelement[selectedelement].description;
    cbpointerto.checked:=definedstructures[selectedstructure.basestructure].structelement[selectedelement].pointerto;
    if cbpointerto.Checked then
      edtByteSize.Text:=inttostr(definedstructures[selectedstructure.basestructure].structelement[selectedelement].pointertosize);
//    else
//      edtByteSize.Text

    cbType.OnChange(cbType);

    if showmodal=mrok then
    begin
      definedstructures[selectedstructure.basestructure].structelement[selectedelement].description:=edtDescription.text;
      definedstructures[selectedstructure.basestructure].structelement[selectedelement].pointerto:=cbpointerto.checked;
      definedstructures[selectedstructure.basestructure].structelement[selectedelement].pointertosize:=bytesize;

      if cbtype.itemindex<=14 then
        definedstructures[selectedstructure.basestructure].structelement[selectedelement].structurenr:=-(cbtype.ItemIndex+1)
      else
        definedstructures[selectedstructure.basestructure].structelement[selectedelement].structurenr:=cbtype.ItemIndex-15;

      if definedstructures[selectedstructure.basestructure].structelement[selectedelement].pointerto then
        definedstructures[selectedstructure.basestructure].structelement[selectedelement].bytesize:=4
      else
        definedstructures[selectedstructure.basestructure].structelement[selectedelement].bytesize:=bytesize;

      currentstructure.refresh;
    end;
  end;

end;

procedure TfrmStructures.TreeView1DblClick(Sender: TObject);
var
  selectedstructure: tstructure;
  selectednode: ttreenode;
  selectedelement: integer;
  i: integer;
  a: dword;
begin
  selectednode:=treeview1.Selected;
  if selectednode<>nil then
  begin
    selectedstructure:=tstructure(selectednode.Data);
    if selectedstructure<>nil then
    begin
      selectedelement:=selectednode.Index;
      a:=selectedstructure.address;
      for i:=0 to selectedelement-1 do
        inc(a,definedstructures[selectedstructure.basestructure].structelement[i].bytesize);

      with Tvaluechangeform.Create(application) do
      begin
        address:=a;

        case definedstructures[selectedstructure.basestructure].structelement[selectedelement].structurenr of
          -1,-2,-3: vtype:=0;
          -4,-5,-6: vtype:=1;
          -7,-8,-9: vtype:=2;
          -10,-11: vtype:=6;
          -12: vtype:=4;
          -13: vtype:=5;
          -14:
            begin
              slength:=definedstructures[selectedstructure.basestructure].structelement[selectedelement].bytesize;
              unicode:=false;
              vtype:=7;
            end;

          -15:
            begin
              unicode:=true;
              slength:=definedstructures[selectedstructure.basestructure].structelement[selectedelement].bytesize div 2;
              vtype:=7;
            end;

          else vtype:=0;
        end;


        ShowModal;
        currentstructure.refresh;
      end;
    end;
  end;
end;

procedure TfrmStructures.Addtoaddresslist1Click(Sender: TObject);
var
  selectedstructure: tstructure;
  selectednode: ttreenode;
  selectedelement: integer;
  offsets: array of dword;

  objectname: string;

  snr: integer;
  vtype: integer;
  vlength: integer;
  unicode,ispointer,showashex: boolean;

  i: integer;
begin
  showashex:=false;
  selectednode:=treeview1.Selected;
  if selectednode<>nil then
  begin
    selectedstructure:=tstructure(selectednode.Data);

    if selectedstructure<>nil then
    begin
      if selectedstructure.basestructure>=0 then
      case definedstructures[selectedstructure.basestructure].structelement[selectednode.Index].structurenr of
        -1,-2,-3: vtype:=0;
        -4,-5,-6: vtype:=1;
        -7,-8,-9: vtype:=2;
        -10,-11: vtype:=6;
        -12: vtype:=3;
        -13: vtype:=4;
        -14: begin
               vtype:=7;
               vlength:=definedstructures[selectedstructure.basestructure].structelement[selectednode.Index].bytesize;
               unicode:=false;
             end;

        -15: begin
               vtype:=8;
               vlength:=definedstructures[selectedstructure.basestructure].structelement[selectednode.Index].bytesize div 2;
               unicode:=true;
             end;

        0..maxint :
             begin
               vtype:=2;
               showashex:=true;
             end;
      end else
      case selectedstructure.basestructure of
        -1,-2,-3: vtype:=0;
        -4,-5,-6: vtype:=1;
        -7,-8,-9: vtype:=2;
        -10,-11: vtype:=6;
        -12: vtype:=3;
        -13: vtype:=4;
        -14: begin
               vtype:=7;
               vlength:=4;
               unicode:=false;
             end;

        -15: begin
               vtype:=8;
               vlength:=4;
               unicode:=true;
             end;

        0..maxint : exit;
      end

    end else exit;

    objectname:='';
    setlength(offsets,0);
    while (selectedstructure<>nil) do
    begin
      //get the offsets for each structure till you get to the base address
      selectedelement:=selectednode.Index;
      snr:=selectedstructure.basestructure;

      setlength(offsets,length(offsets)+1);
      offsets[length(offsets)-1]:=0;

      if snr>=0 then
      begin
        for i:=0 to selectedelement-1 do
          inc(offsets[length(offsets)-1],definedstructures[snr].structelement[i].bytesize);
      end;

      selectednode:=selectednode.Parent;
      if selectednode<>nil then
        selectedstructure:=tstructure(selectednode.data)
      else
        break;
    end;


    //now add it to the list
    mainform.addaddress('bla',address+offsets[length(offsets)-1],offsets[0],length(offsets)-1,length(offsets)>1,vtype,vlength,0,unicode,showashex);
  end;
end;

procedure TfrmStructures.Recalculateaddress1Click(Sender: TObject);
var a: string;
    oldaddress,newaddress: dword;

    selectedstructure: tstructure;
    selectednode: ttreenode;
    selectedelement,snr: integer;
    i: integer;
    delta: integer;
begin
  selectednode:=treeview1.Selected;
  if selectednode<>nil then
  begin
    selectedstructure:=tstructure(selectednode.Data);
    selectedelement:=selectednode.Index;
    snr:=selectedstructure.basestructure;

    oldaddress:=address;

    for i:=0 to selectedelement-1 do
      inc(oldaddress,definedstructures[snr].structelement[i].bytesize);

    a:=inttohex(memorybrowser.memoryaddress,8);
    if inputquery('Recalculate base of structure','Give the address of this element',a) then
    begin
      try
        newaddress:=strtoint('$'+a);
      except
        raise exception.Create('I have no idea what '+a+' means');
      end;

      delta:=newaddress-oldaddress;
      address:=address+delta;
      currentstructure.refresh;
    end;
  end;
end;

end.


⌨️ 快捷键说明

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