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

📄 main.pas

📁 解元 传奇2客户端delphi源程序
💻 PAS
📖 第 1 页 / 共 2 页
字号:
unit Main;

interface

uses
  SysUtils, Windows, Messages, Classes, Graphics, Controls,inifiles,winsock,
  Forms, Dialogs, StdCtrls, Buttons, ExtCtrls, Menus, ScktComp, ComCtrls,EDcode,Grobal2;

type
  //玩家信息:服务器端使用
  PPlayerInfo=^TPlayerInfo;
  TPlayerInfo=Record
     ip:pchar;
     port:integer;
     UserID:pchar;
     CharName:pchar;
     Job:Integer;
     ab:TAbility;                                 //属性
     Gold:Integer;
     X,Y:integer;
     dir:integer;
     Map:pchar;
     server:pchar;
  end;

  TMainForm = class(TForm)
    StatusLine: TStatusBar;
    SSocket: TServerSocket;
    Memo1: TMemo;
    Panel1: TPanel;
    Button2: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Button1: TButton;
    Button3: TButton;
    Edit7: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Edit8: TEdit;
    Label3: TLabel;
    Edit9: TEdit;
    Label4: TLabel;
    Edit10: TEdit;
    Label5: TLabel;
    Edit11: TEdit;
    Label6: TLabel;
    Edit12: TEdit;
    Label7: TLabel;
    Edit13: TEdit;
    Label8: TLabel;
    Edit14: TEdit;
    Label9: TLabel;
    Edit15: TEdit;
    Label10: TLabel;
    Edit16: TEdit;
    Label11: TLabel;
    Edit17: TEdit;
    Label12: TLabel;
    Edit18: TEdit;
    Label13: TLabel;
    Edit19: TEdit;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure ShowHint(Sender: TObject);
    procedure SSocketClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure SSocketClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure FormDestroy(Sender: TObject);
  public
    procedure ProcMsg(Socket: TCustomWinSocket;msg:TDefaultMessage;data:String);
    procedure SendSocket (Socket: TCustomWinSocket;sendstr: string);
    procedure AddMsg(S:String);
    procedure ProcLogin(Socket:TCustomWinSocket;Data:String);
    procedure BroadcaseSay(ActorID:Integer;data:String);
    procedure QueryBag(Socket:TCustomWinSocket;Who:String);
    function CheckPassword(Userid,password:string):Integer;
    function QueryChar(LoginID:String):String;
    procedure GetCharAbility(var Playerinfo:TPlayerinfo);
  end;

var
  MainForm: TMainForm;
  UserInfo:TInifile;
  PlayerInfo:TPlayerInfo;
  light:integer=0;
implementation

{$r *.dfm}

procedure TMainForm.FormCreate(Sender: TObject);
begin
  //playerMan:=TPlayerManager.create;
  Application.OnHint := ShowHint;
  SSocket.Active:=true;
  UserInfo:=TInifile.Create('.\data\UserInfo.ini');
end;

procedure TMainForm.ShowHint(Sender: TObject);
begin
  StatusLine.SimpleText := Application.Hint;
end;

procedure TMainForm.SSocketClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
   data, data2: string;
   dmsg: TDefaultMessage;
   tmpstr:String;
begin
   data := Socket.ReceiveText;
   delete(data,1,2);
   data:=copy(data,1,length(data)-1);
   Memo1.lines.add('Recv:'+data);
   tmpstr:=decodestring(data);
   if copy(tmpstr,1,2)='**' then
   begin
     ProcLogin(Socket,Tmpstr);
     exit;
   end;
   data2:=copy(data,1,DEFBLOCKSIZE);
   delete(data,1,DEFBLOCKSIZE);
   dmsg:=DecodeMessage(Data2);
   addMsg('Tran:Ident='+inttostr(dmsg.Ident)+',Recog='+inttostr(dmsg.Recog)+
     ',Para='+Inttostr(Dmsg.Param)+',Tag='+Inttostr(dmsg.tag)+
     ',Series='+Inttostr(Dmsg.Series)+',Data='+Data+' is'+DecodeString(Data));
   ProcMsg(Socket,dmsg,data);
end;

procedure TMainForm.Button2Click(Sender: TObject);
type
  TMapHeader =record
     Width  : word;                      //宽度      2
     Height : word;                      //高度      2
     Title: string[16];                  //标题      20
     UpdateDate: double;              //更新日期  8
     Reserved  : array[1..20] of char;   //保留      20
  end;

var
  dmsg: TDefaultMessage;
  s:TMapHeader;
  d:TDateTime;
begin
  //s.Title:='我们这里不管这些';
  Memo1.lines.add(inttostr(sizeof(s)));
end;     

Var
   code: byte = 1;
procedure TMainForm.SendSocket (Socket: TCustomWinSocket;sendstr: string);
var
 s:string;
begin
   if Socket.Connected then begin
      s:='#' + sendstr + '!';
      Socket.SendText (s);
      Inc (code);
      if code >= 10 then code := 1;
      Memo1.lines.Add('Send:'+s);
   end;
end;
procedure TMainForm.ProcMsg(Socket: TCustomWinSocket;msg: TDefaultMessage; data: String);
var
   dmsg :TDefaultMessage;
   s:string;
   LoginId,Certification:String;
   desc:TCharDesc;
   i:integer;
begin
  case Msg.Ident of
    CM_IDPASSWORD: begin
        data:=decodestring(data);
        LoginId:=copy(data,1,pos('/',data)-1);
        PlayerInfo.UserID:=pchar(LoginID);
        delete(data,1,pos('/',data));
        I:=CheckPassword(LoginID,data);
        if i=0 then
           dmsg := MakeDefaultMsg (SM_PASSOK_SELECTSERVER, 0, 0, 0, 0)
        else
           dmsg := MakeDefaultMsg (SM_PASSWD_FAIL, i, 0, 0, 0);
        SendSocket(Socket,EncodeMessage(dmsg));
      end;
    CM_SELECTSERVER:begin
       dmsg := MakeDefaultMsg (SM_SELECTSERVER_OK, 0, 0, 0, 0);
       s:='127.0.0.1/7000/0/';
       AddMsg('Select Server');
       SendSocket(Socket,EncodeMessage(dmsg)+EncodeString(S));
    end;
    CM_NEWCHR:begin
       dmsg := MakeDefaultMsg (SM_NEWCHR_SUCCESS, 0, 0, 0, 0);
       AddMsg('New Chr');
       SendSocket(Socket,EncodeMessage(dmsg));
    end;
    CM_QUERYCHR:Begin
       Data:=DecodeString(Data);
       LoginID:=copy(data,1,pos('/',data)-1);
       delete(data,1,pos('/',data));
       Memo1.Lines.add('QueryChar:'+LoginID+',Certif:'+data);
       s:=QueryChar(LoginID);
       dmsg := MakeDefaultMsg (SM_QUERYCHR, 0, 0, 0, 0);
       SendSocket(Socket,EncodeMessage(dmsg)+EncodeString(s));
    end;
    CM_DELCHR:Begin
      dmsg := MakeDefaultMsg (SM_DELCHR_SUCCESS, 0, 0, 0, 0);
      SendSocket(Socket,EncodeMessage(dmsg));
    end;
    CM_SELCHR:begin  //选择了一个角色(用户ID/角色名)
       //服务器
       Data:=DecodeString(Data);
       LoginID:=copy(data,1,pos('/',data)-1);   //ID
       Playerinfo.UserID:=pchar(LoginID);
       delete(data,1,pos('/',data));            //ChrName
       Playerinfo.CharName:=pchar(data);
       Playerinfo.Job:=UserInfo.ReadInteger(Playerinfo.CharName,'Job',0);
       dmsg := MakeDefaultMsg (SM_STARTPLAY, 0, 0, 0, 0);
       Playerinfo.server:=pchar(UserInfo.ReadString(Playerinfo.CharName,'server','127.0.0.1/7000'));
       SendSocket(Socket,EncodeMessage(dmsg)+EncodeString(Playerinfo.server));
       //地图
       Playerinfo.X:=UserInfo.ReadInteger(Playerinfo.CharName,'x',300);
       Playerinfo.Y:=UserInfo.ReadInteger(Playerinfo.CharName,'y',300);
       Playerinfo.dir:=UserInfo.ReadInteger(Playerinfo.CharName,'dir',0);
       Playerinfo.map:=pchar(UserInfo.ReadString(Playerinfo.CharName,'map','0'));
       dmsg := MakeDefaultMsg (SM_NEWMAP, 0, Playerinfo.X, Playerinfo.X, Playerinfo.dir);
       SendSocket(Socket,EncodeMessage(dmsg)+EncodeString(Playerinfo.map));
    end;
    CM_QUERYBAGITEMS:begin  //After Log on
       QueryBag(Socket,'');
       Playerinfo.Gold:=200000;
       dmsg := MakeDefaultMsg (SM_ABILITY, Playerinfo.Gold, Playerinfo.job, 0, 0); //SM_ABILITY,金子数,职业
       GetCharAbility(PlayerInfo);
       SendSocket(Socket,EncodeMessage(dmsg)+EncodeBuffer(@Playerinfo.ab,sizeof(TAbility)));

       dmsg := MakeDefaultMsg (SM_FEATURECHANGED,0,48,$FF,0);
       SendSocket(Socket,EncodeMessage(dmsg));
    end;
    CM_PICKUP:Begin

    end;
    CM_WANTMINIMAP:Begin
       dmsg := MakeDefaultMsg (SM_READMINIMAP_OK, 0, 1, 0, 0);
       s:='';
       SendSocket(Socket,EncodeMessage(dmsg)+EncodeString(s));
    END;
    CM_SAY:Begin
       BroadcaseSay(0,decodestring(data));
    end;
    CM_DEALTRY:Begin
       dmsg := MakeDefaultMsg (SM_DEALMENU, 0, 0, 0, 0);
       s:='谢依凡';
       SendSocket(Socket,EncodeMessage(dmsg)+EncodeString(s));
    end;
    CM_EAT:begin
       dmsg := MakeDefaultMsg (SM_EAT_OK, 0, 0, 0, 0);
       s:='';
       SendSocket(Socket,EncodeMessage(dmsg)+EncodeString(s));
    end;
    CM_QUERYUSERNAME:begin
       dmsg := MakeDefaultMsg (SM_USERNAME, 0, 0, 0, 0);
       s:='谢依凡\';
       SendSocket(Socket,EncodeMessage(dmsg)+EncodeString(s));
    end;

⌨️ 快捷键说明

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