?? main.pas
字號:
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 + -