UNetwork.pas 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893
  1. unit UNetwork;
  2. interface
  3. uses
  4. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5. Dialogs, ScktComp, ExtCtrls;
  6. type
  7. TForm3 = class(TForm)
  8. Timer3: TTimer;
  9. ClientSocket: TClientSocket;
  10. ServerSocket: TServerSocket;
  11. procedure ClientSocketConnect(Sender: TObject;
  12. Socket: TCustomWinSocket);
  13. procedure ClientSocketDisconnect(Sender: TObject;
  14. Socket: TCustomWinSocket);
  15. procedure ClientSocketError(Sender: TObject; Socket: TCustomWinSocket;
  16. ErrorEvent: TErrorEvent; var ErrorCode: Integer);
  17. procedure SocketRead(Sender: TObject; Socket: TCustomWinSocket);
  18. procedure ServerSocketClientConnect(Sender: TObject;
  19. Socket: TCustomWinSocket);
  20. procedure Timer3Timer(Sender: TObject);
  21. procedure FormCreate(Sender: TObject);
  22. procedure FormDestroy(Sender: TObject);
  23. procedure SendMap(Socket: TCustomWinSocket);
  24. procedure SendNewID(Socket: TCustomWinSocket);
  25. procedure SendGoalPos(Socket: TCustomWinSocket);
  26. procedure RequestNewID(Socket: TCustomWinSocket);
  27. procedure AddToPlayerArr(ID:Cardinal);
  28. private
  29. public
  30. procedure SendSpeedChange(ID:Cardinal);
  31. procedure SendRaum(Socket: TCustomWinSocket; RaumPos:TPoint);overload;
  32. procedure SendRaum(RaumPos:TPoint);overload;
  33. procedure SendCeilWalk; overload;
  34. procedure SendCeilWalk(Socket: TCustomWinSocket); overload;
  35. procedure SendCeilWalk(ID: Cardinal); overload;
  36. procedure SendCeilWalk(ID: Cardinal; Socket: TCustomWinSocket); overload;
  37. procedure SendWin(ID: Cardinal); overload;
  38. procedure SendWin(ID: Cardinal;Socket: TCustomWinSocket); overload;
  39. procedure SendKill(ID: Cardinal); overload;
  40. procedure SendKill(ID: Cardinal;Socket: TCustomWinSocket); overload;
  41. procedure SendJump; overload;
  42. procedure SendJump(Socket: TCustomWinSocket); overload;
  43. procedure SendJump(ID: Cardinal); overload;
  44. procedure SendJump(ID: Cardinal; Socket: TCustomWinSocket); overload;
  45. procedure SendRaumSorte(Socket: TCustomWinSocket; RaumPos:TPoint); overload;
  46. procedure SendRaumSorte(RaumPos:TPoint); overload;
  47. procedure SendRaumSorte(X,Z:Integer); overload;
  48. procedure SendExplode(X,Z:Integer; Socket: TCustomWinSocket); overload;
  49. procedure SendExplode(X,Z:Integer); overload;
  50. procedure SendContaminate(X,Z:Integer);
  51. procedure SendPosition; overload;
  52. procedure SendPosition(Socket: TCustomWinSocket); overload;
  53. procedure SendPosition(ID: Cardinal); overload;
  54. procedure SendPosition(ID: Cardinal; Socket: TCustomWinSocket); overload;
  55. procedure SendInkTrigger(ID: Cardinal); overload;
  56. procedure SendInkTrigger(ID: Cardinal;Socket: TCustomWinSocket); overload;
  57. end;
  58. var
  59. Form3:TForm3;
  60. IDRecieved:Boolean=true;
  61. Buffer:Ansistring;
  62. NextObjectToRecieve:Ansistring;
  63. LastObjectRecieved:Ansistring;
  64. RoomRecievePos:TPoint;
  65. MPServerAddress:string='Localhost';
  66. MPPort:Integer=10808;
  67. implementation
  68. uses Unit1, UMaterials,Math,UCreateRaum;
  69. {$R *.dfm}
  70. procedure TForm3.AddToPlayerArr(ID:Cardinal);
  71. var C3:Integer;
  72. begin
  73. if ID>=Cardinal(Length(Players)) then setlength(Players,ID+1);
  74. if ID>=Cardinal(Length(playerarr)) then begin
  75. Setlength(playerarr,ID+1);
  76. for C3:=0 to High(playerarr) do
  77. if not assigned(playerarr[C3])
  78. then playerarr[C3]:=Form1.NewPlayer(C3);
  79. end;
  80. Players[ID].Dead:=false;
  81. end;
  82. procedure TForm3.SocketRead(Sender: TObject;
  83. Socket: TCustomWinSocket);
  84. var C1,C2,C3,C6,C5:Integer; Data:array of AnsiString;
  85. P1:PWallset; C4:Byte; S1:AnsiString; B1:Boolean;
  86. begin
  87. Buffer:=Buffer+Socket.ReceiveText;
  88. C2:=0;
  89. C3:=1;
  90. for C1:=1 to Length(Buffer) do
  91. if Buffer[C1]=';' then begin
  92. Inc(C2);
  93. Setlength(Data,C2);
  94. Data[C2-1]:=copy(Buffer,C3,C1-C3);
  95. C3:=C1+1;
  96. end;
  97. S1:=copy(Buffer,C3,Length(Buffer));
  98. C1:=0;
  99. try
  100. while true do begin
  101. if NextObjectToRecieve='Reload' then begin
  102. Form1.Reload;
  103. LastObjectRecieved:=NextObjectToRecieve;
  104. NextObjectToRecieve:='';
  105. Continue;
  106. end;
  107. if NextObjectToRecieve='RequestNewID' then begin
  108. if ServerSocket.Active then
  109. SendNewID(Socket);
  110. LastObjectRecieved:=NextObjectToRecieve;
  111. NextObjectToRecieve:='';
  112. Continue;
  113. end;
  114. if C1>High(Data) then Break;
  115. if NextObjectToRecieve='Lightning' then begin
  116. C2:=strtoint(String(Data[C1]));
  117. if ServerSocket.Active then SendSpeedChange(C2);
  118. LastObjectRecieved:=NextObjectToRecieve;
  119. NextObjectToRecieve:='';
  120. Continue;
  121. end;
  122. if NextObjectToRecieve='PlayerKill' then begin
  123. C2:=strtoint(String(Data[C1]));
  124. Players[C2].Dead:=true;
  125. if ServerSocket.Active then
  126. SendKill(C2);
  127. LastObjectRecieved:=NextObjectToRecieve;
  128. NextObjectToRecieve:='';
  129. C1:=C1+1;
  130. Continue;
  131. end;
  132. if NextObjectToRecieve='GameWin' then begin
  133. C2:=strtoint(String(Data[C1]));
  134. Form1.WinGame(C2);
  135. if ServerSocket.Active then
  136. SendWin(C2);
  137. LastObjectRecieved:=NextObjectToRecieve;
  138. NextObjectToRecieve:='';
  139. C1:=C1+1;
  140. Continue;
  141. end;
  142. if NextObjectToRecieve='InkTrigger' then begin
  143. C2:=strtoint(String(Data[C1]));
  144. Form1.Memo1.Visible:=true;
  145. if ServerSocket.Active then
  146. SendInkTrigger(C2);
  147. LastObjectRecieved:=NextObjectToRecieve;
  148. NextObjectToRecieve:='';
  149. C1:=C1+1;
  150. Continue;
  151. end;
  152. if NextObjectToRecieve='' then begin
  153. NextObjectToRecieve:=Data[C1];
  154. C1:=C1+1;
  155. Continue;
  156. end;
  157. if NextObjectToRecieve='NewID' then begin
  158. IDRecieved:=true;
  159. Players[MyID].Dead:=true;
  160. SendKill(MyID);
  161. MyID:=strtoint(String(Data[C1]));
  162. AddToPlayerArr(MyID);
  163. Form1.ChangeSpeedTo(StartSpeed);
  164. Form1.GLHUDText1.Text:='Speed: '+Floattostr(Round(100*Players[MyID].Speed)/100);
  165. Form1.GLCamera1.Position.X:=0;
  166. Form1.GLCamera1.Position.Z:=0;
  167. Form1.GLCamera1.Up.SetVector(0,1,0);
  168. PosX:=0;
  169. PosZ:=0;
  170. Players[MyID].jumping:=false;
  171. Players[MyID].X:=0;
  172. Players[MyID].Y:=0;
  173. Players[MyID].Z:=0;
  174. Players[MyID].LastX:=0;
  175. Players[MyID].LastZ:=0;
  176. Players[MyID].Ceilwalk:=false;
  177. Form1.Reload;
  178. LastObjectRecieved:=NextObjectToRecieve;
  179. NextObjectToRecieve:='';
  180. C1:=C1+1;
  181. Continue;
  182. end;
  183. if NextObjectToRecieve='JumpStart' then begin
  184. C2:=StrToInt(Data[C1]);
  185. if C2>=Length(Players) then begin
  186. LastObjectRecieved:=NextObjectToRecieve;
  187. NextObjectToRecieve:='';
  188. C1:=C1+1;
  189. Continue;
  190. end;
  191. Form1.startJump(C2);
  192. if ServerSocket.Active then
  193. for C3:=0 to ServerSocket.Socket.ActiveConnections-1 do
  194. if ServerSocket.Socket.Connections[C3]<>Socket then
  195. SendJump(C2,ServerSocket.Socket.Connections[C3]);
  196. LastObjectRecieved:=NextObjectToRecieve;
  197. NextObjectToRecieve:='';
  198. C1:=C1+1;
  199. Continue;
  200. end;
  201. if C1+1>High(Data) then Break;
  202. if NextObjectToRecieve='ChangeSpeed' then begin
  203. C3:=Strtoint(Data[C1+1]);
  204. if not ClientSocket.Active then begin
  205. LastObjectRecieved:=NextObjectToRecieve;
  206. NextObjectToRecieve:='';
  207. C1:=C1+2;
  208. Continue;
  209. end;
  210. Form1.MultiplySpeedBy(sqrt(
  211. sqr(Players[MyID].X-GoalPos.X*20)
  212. +sqr(Players[MyID].Z-GoalPos.Y*20))
  213. /StrToFloat(Data[C1]));
  214. if Cardinal(C3)<>MyID then begin
  215. Form1.Panel11.Font.Color:=RGB(255,255,0);
  216. Form1.Panel11.Color:=RGB(0,0,0);
  217. Form1.Panel11.Visible:=true;
  218. Form1.Panel11.Caption:='Speed decreased to '
  219. +Floattostr(Round(100*Players[MyID].Speed)/100);
  220. Panel11Seconds:=3;
  221. Form1.GLHUDText1.Text:='Speed: '
  222. +Floattostr(Round(100*Players[MyID].Speed)/100);
  223. end;
  224. LastObjectRecieved:=NextObjectToRecieve;
  225. NextObjectToRecieve:='';
  226. C1:=C1+2;
  227. Continue;
  228. end;
  229. if NextObjectToRecieve='CreateRaum' then begin
  230. RoomRecievePos.X:=Strtoint(Data[C1]);
  231. RoomRecievePos.Y:=Strtoint(Data[C1+1]);
  232. if not Map[RoomRecievePos.X,RoomRecievePos.Y].created then
  233. CreateRaum(RoomRecievePos.X,RoomRecievePos.Y);
  234. SendRaum(Socket,RoomRecievePos);
  235. LastObjectRecieved:=NextObjectToRecieve;
  236. NextObjectToRecieve:='';
  237. C1:=C1+2;
  238. Continue;
  239. end;
  240. if NextObjectToRecieve='Explode' then begin
  241. RoomRecievePos.X:=Strtoint(Data[C1]);
  242. RoomRecievePos.Y:=Strtoint(Data[C1+1]);
  243. Form1.Explode(RoomRecievePos.X,RoomRecievePos.Y);
  244. Form1.Reload;
  245. if ServerSocket.Active then
  246. for C3:=0 to ServerSocket.Socket.ActiveConnections-1 do
  247. if ServerSocket.Socket.Connections[C3]<>Socket then
  248. SendExplode(RoomRecievePos.X,RoomRecievePos.Y,
  249. ServerSocket.Socket.Connections[C3]);
  250. LastObjectRecieved:=NextObjectToRecieve;
  251. NextObjectToRecieve:='';
  252. C1:=C1+2;
  253. Continue;
  254. end;
  255. if NextObjectToRecieve='Contaminate' then begin
  256. RoomRecievePos.X:=Strtoint(Data[C1]);
  257. RoomRecievePos.Y:=Strtoint(Data[C1+1]);
  258. Form1.SpreadContamination(RoomRecievePos.X,RoomRecievePos.Y);
  259. LastObjectRecieved:=NextObjectToRecieve;
  260. NextObjectToRecieve:='';
  261. C1:=C1+2;
  262. Continue;
  263. end;
  264. if NextObjectToRecieve='GoalPos' then begin
  265. if not ServerSocket.Active then begin
  266. GoalPos.X:=Strtoint(String(Data[C1]));
  267. GoalPos.Y:=Strtoint(String(Data[C1+1]));
  268. end;
  269. LastObjectRecieved:=NextObjectToRecieve;
  270. NextObjectToRecieve:='';
  271. C1:=C1+2;
  272. Continue;
  273. end;
  274. if NextObjectToRecieve='CeilWalk' then begin
  275. C2:=strtoint(Data[C1]);
  276. AddToPlayerArr(C2);
  277. Players[C2].Ceilwalk:=StrToBool(String(Data[C1+1]));
  278. if ServerSocket.Active then
  279. for C3:=0 to ServerSocket.Socket.ActiveConnections-1 do
  280. if ServerSocket.Socket.Connections[C3]<>Socket then
  281. SendCeilWalk(C2,ServerSocket.Socket.Connections[C3]);
  282. LastObjectRecieved:=NextObjectToRecieve;
  283. NextObjectToRecieve:='';
  284. C1:=C1+2;
  285. Continue;
  286. end;
  287. if C1+2>High(Data) then Break;
  288. if NextObjectToRecieve='RaumSorte' then begin
  289. RoomRecievePos.X:=Strtoint(String(Data[C1]));
  290. RoomRecievePos.Y:=Strtoint(String(Data[C1+1]));
  291. Map[RoomRecievePos.X,RoomRecievePos.Y].Inhalt.Sorte:=
  292. Strtoint(Data[C1+2]);
  293. if ServerSocket.Active then
  294. for C3:=0 to ServerSocket.Socket.ActiveConnections-1 do
  295. if ServerSocket.Socket.Connections[C3]<>Socket then
  296. SendRaumSorte(ServerSocket.Socket.Connections[C3],RoomRecievePos);
  297. C1:=C1+3;
  298. LastObjectRecieved:=NextObjectToRecieve;
  299. NextObjectToRecieve:='';
  300. Form1.ReloadRoom(RoomRecievePos.X,RoomRecievePos.Y);
  301. Continue;
  302. end;
  303. if NextObjectToRecieve='RaumRichtung' then begin
  304. RoomRecievePos.X:=Strtoint(Data[C1]);
  305. RoomRecievePos.Y:=Strtoint(Data[C1+1]);
  306. Map[RoomRecievePos.X,RoomRecievePos.Y].Inhalt.Daten:=
  307. @Richtungen[TRichtung(Strtoint(Data[C1+2]))];
  308. Form1.ReloadRoom(RoomRecievePos.X,RoomRecievePos.Y);
  309. C1:=C1+3;
  310. LastObjectRecieved:=NextObjectToRecieve;
  311. NextObjectToRecieve:='';
  312. Continue;
  313. end;
  314. if C1+3>High(Data) then Break;
  315. //Spielerposition empfangen
  316. if NextObjectToRecieve='Position' then begin
  317. C2:=strtoint(Data[C1]);
  318. if Cardinal(C2)=MyID then begin
  319. C1:=C1+4;
  320. LastObjectRecieved:=NextObjectToRecieve;
  321. NextObjectToRecieve:='';
  322. Continue;
  323. end;
  324. AddToPlayerArr(C2);
  325. Players[C2].LastX:=Players[C2].X;
  326. Players[C2].LastZ:=Players[C2].Z;
  327. Players[C2].LastTimeStart:=GetTickCount;
  328. Players[C2].LastTimeEnd:=GetTickCount+Timer3.Interval;
  329. Players[C2].X:=Strtofloat(String(Data[C1+1]));
  330. Players[C2].Z:=Strtofloat(String(Data[C1+2]));
  331. Players[C2].Speed:=Strtofloat(String(Data[C1+3]));
  332. C1:=C1+4;
  333. LastObjectRecieved:=NextObjectToRecieve;
  334. NextObjectToRecieve:='';
  335. Continue;
  336. end;
  337. if C1+5>High(Data) then Break;
  338. //Raum empfangen
  339. if NextObjectToRecieve='Raum' then begin
  340. B1:=GetRT(PosX,PosZ).Contaminate;
  341. RoomRecievePos.X:=Strtoint(String(Data[C1]));
  342. RoomRecievePos.Y:=Strtoint(String(Data[C1+1]));
  343. C4:=Strtoint(String(Data[C1+2]));
  344. P1:=@C4;
  345. Map[RoomRecievePos.X,RoomRecievePos.Y].Walls:=P1^;
  346. C4:=Strtoint(String(Data[C1+3]));
  347. P1:=@C4;
  348. Map[RoomRecievePos.X,RoomRecievePos.Y].UpWalls:=P1^;
  349. C4:=Strtoint(String(Data[C1+4]));
  350. P1:=@C4;
  351. Map[RoomRecievePos.X,RoomRecievePos.Y].DownWalls:=P1^;
  352. Map[RoomRecievePos.X,RoomRecievePos.Y].Inhalt.Sorte:=
  353. Strtoint(String(Data[C1+5]));
  354. Map[RoomRecievePos.X,RoomRecievePos.Y].Inhalt.Daten:=nil;
  355. Map[RoomRecievePos.X,RoomRecievePos.Y].created:=true;
  356. LastObjectRecieved:=NextObjectToRecieve;
  357. if GetRT(PosX,PosZ).Contaminate and not B1 then begin
  358. Form1.ChangeSpeedBy(-RandomRange(-50,292)/100);
  359. Form1.Panel11.Font.Color:=RGB(0,0,0);
  360. Form1.Panel11.Color:=RGB(249,245,0);
  361. Form1.Panel11.Visible:=true;
  362. Form1.Panel11.Caption:='Contamination! Speed decreased to '
  363. +Floattostr(Round(100*Players[MyID].Speed)/100);
  364. Panel11Seconds:=3;
  365. end;
  366. NextObjectToRecieve:='';
  367. C1:=C1+6;
  368. Form1.ReloadRoom(RoomRecievePos.X,RoomRecievePos.Y);
  369. Continue;
  370. end;
  371. LastObjectRecieved:='unknown: '+NextObjectToRecieve;
  372. NextObjectToRecieve:='';
  373. end;
  374. except
  375. AssignFile(log,'NetworkLog.txt');
  376. if not FileExists('NetworkLog.txt') then begin
  377. Rewrite(log);
  378. Write(log,buffer);
  379. CloseFile(log);
  380. end;
  381. end;
  382. Buffer:='';
  383. for C2:=C1 to High(Data) do
  384. Buffer:=Buffer+Data[C2]+';';
  385. Buffer:=Buffer+S1;
  386. end;
  387. procedure TForm3.ClientSocketConnect(Sender: TObject;
  388. Socket: TCustomWinSocket);
  389. var C1,C2:Integer;
  390. begin
  391. IDRecieved:=false;
  392. for C1:=-mapsize to mapsize do
  393. for C2:=-mapsize to mapsize do Map[C1,C2].created:=false;
  394. ShowMessage('Connected to Server '+MPServerAddress+':'+Inttostr(MPPort));
  395. end;
  396. procedure TForm3.ServerSocketClientConnect(Sender: TObject;
  397. Socket: TCustomWinSocket);
  398. begin
  399. SendNewID(Socket);
  400. SendMap(Socket);
  401. SendGoalPos(Socket);
  402. end;
  403. procedure TForm3.ClientSocketDisconnect(Sender: TObject;
  404. Socket: TCustomWinSocket);
  405. begin
  406. ShowMessage('Disconnected from Server');
  407. end;
  408. procedure TForm3.ClientSocketError(Sender: TObject;
  409. Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  410. var ErrorCode: Integer);
  411. begin
  412. if ErrorCode=10061 then begin
  413. ShowMessage('Server not found');
  414. ErrorCode:=0;
  415. end;
  416. end;
  417. procedure TForm3.SendExplode(X,Z:Integer; Socket: TCustomWinSocket);
  418. begin
  419. Socket.SendText(AnsiString(
  420. 'Explode;'
  421. +IntToStr(X)+';'
  422. +IntToStr(Z)+';'));
  423. end;
  424. procedure TForm3.SendExplode(X,Z:Integer);
  425. var C2:Integer;
  426. begin
  427. if ClientSocket.Active then SendExplode(X,Z,ClientSocket.Socket)
  428. else if ServerSocket.Active then
  429. for C2:=0 to ServerSocket.Socket.ActiveConnections-1 do begin
  430. SendExplode(X,Z,ServerSocket.Socket.Connections[C2]);
  431. end;
  432. end;
  433. procedure TForm3.SendContaminate(X,Z:Integer);
  434. begin
  435. ClientSocket.Socket.SendText(AnsiString(
  436. 'Contaminate;'
  437. +IntToStr(X)+';'
  438. +IntToStr(Z)+';'));
  439. end;
  440. procedure TForm3.SendPosition(Socket: TCustomWinSocket);
  441. begin
  442. Socket.SendText(AnsiString(
  443. 'Position;'
  444. +intToStr(MyID)+';'
  445. +FloatToStr(Players[MyID].X)+';'
  446. +FloatToStr(Players[MyID].Z)+';'
  447. +FloatToStr(Players[MyID].Speed)+';'));
  448. end;
  449. procedure TForm3.SendPosition;
  450. var C2:Integer;
  451. begin
  452. if ClientSocket.Active then SendPosition(ClientSocket.Socket)
  453. else if ServerSocket.Active then
  454. for C2:=0 to ServerSocket.Socket.ActiveConnections-1 do begin
  455. SendPosition(ServerSocket.Socket.Connections[C2]);
  456. end;
  457. end;
  458. procedure TForm3.SendPosition(ID:Cardinal);
  459. var C2:Integer;
  460. begin
  461. if ClientSocket.Active then SendPosition(ID,ClientSocket.Socket)
  462. else if ServerSocket.Active then
  463. for C2:=0 to ServerSocket.Socket.ActiveConnections-1 do begin
  464. SendPosition(ID,ServerSocket.Socket.Connections[C2]);
  465. end;
  466. end;
  467. procedure TForm3.SendPosition(ID:Cardinal; Socket: TCustomWinSocket);
  468. begin
  469. Socket.SendText(AnsiString(
  470. 'Position;'
  471. +intToStr(ID)+';'
  472. +FloatToStr(Players[ID].X)+';'
  473. +FloatToStr(Players[ID].Z)+';'
  474. +FloatToStr(Players[ID].Speed)+';'));
  475. end;
  476. procedure TForm3.Timer3Timer(Sender: TObject);
  477. var C2:Integer;
  478. begin
  479. if (not IDRecieved) and ClientSocket.Active then Exit;
  480. if ClientSocket.Active then SendPosition
  481. else if ServerSocket.Active then begin
  482. for C2:=0 to High(Players) do
  483. if not Players[C2].Dead then
  484. SendPosition(C2);
  485. end;
  486. end;
  487. procedure TForm3.FormCreate(Sender: TObject);
  488. begin
  489. ServerSocket.Active:=false;
  490. ClientSocket.Active:=false;
  491. ClientSocket.Port:=MPPort;
  492. ServerSocket.Port:=MPPort;
  493. ClientSocket.Host:=MPServerAddress;
  494. end;
  495. procedure TForm3.FormDestroy(Sender: TObject);
  496. begin
  497. Timer3.Enabled:=false;
  498. end;
  499. procedure TForm3.SendMap(Socket: TCustomWinSocket);
  500. var C1,C2:Integer;RaumPos:TPoint;
  501. begin
  502. for C1:=-raumrange to raumrange do
  503. for C2:=-raumrange to raumrange do
  504. if Map[C1,C2].created then begin
  505. RaumPos.X:=C1;
  506. RaumPos.Y:=C2;
  507. SendRaum(Socket,RaumPos);
  508. end;
  509. end;
  510. procedure TForm3.SendCeilWalk(Socket: TCustomWinSocket);
  511. begin
  512. Socket.SendText( AnsiString(
  513. 'CeilWalk;'
  514. +IntToStr(MyID)+';'
  515. +BoolToStr(players[MyID].CeilWalk)+';'));
  516. end;
  517. procedure TForm3.SendCeilWalk;
  518. var C2:Integer;
  519. begin
  520. if ClientSocket.Active then SendCeilWalk(ClientSocket.Socket)
  521. else if ServerSocket.Active then
  522. for C2:=0 to ServerSocket.Socket.ActiveConnections-1 do begin
  523. SendCeilWalk(ServerSocket.Socket.Connections[C2]);
  524. end;
  525. end;
  526. procedure TForm3.SendCeilWalk(ID:Cardinal);
  527. var C2:Integer;
  528. begin
  529. if ClientSocket.Active then SendCeilWalk(ID,ClientSocket.Socket)
  530. else if ServerSocket.Active then
  531. for C2:=0 to ServerSocket.Socket.ActiveConnections-1 do begin
  532. SendCeilWalk(ID,ServerSocket.Socket.Connections[C2]);
  533. end;
  534. end;
  535. procedure TForm3.SendCeilWalk(ID:Cardinal; Socket: TCustomWinSocket);
  536. begin
  537. Socket.SendText(AnsiString(
  538. 'CeilWalk;'
  539. +IntToStr(ID)+';'
  540. +BoolToStr(players[ID].CeilWalk)+';'));
  541. end;
  542. procedure TForm3.SendJump(Socket: TCustomWinSocket);
  543. begin
  544. Socket.SendText( AnsiString(
  545. 'JumpStart;'
  546. +IntToStr(MyID)+';'));
  547. end;
  548. procedure TForm3.SendJump;
  549. var C2:Integer;
  550. begin
  551. if ClientSocket.Active then SendJump(ClientSocket.Socket)
  552. else if ServerSocket.Active then
  553. for C2:=0 to ServerSocket.Socket.ActiveConnections-1 do begin
  554. SendJump(ServerSocket.Socket.Connections[C2]);
  555. end;
  556. end;
  557. procedure TForm3.SendJump(ID:Cardinal);
  558. var C2:Integer;
  559. begin
  560. if ClientSocket.Active then SendJump(ID,ClientSocket.Socket)
  561. else if ServerSocket.Active then
  562. for C2:=0 to ServerSocket.Socket.ActiveConnections-1 do begin
  563. SendJump(ID,ServerSocket.Socket.Connections[C2]);
  564. end;
  565. end;
  566. procedure TForm3.SendJump(ID:Cardinal; Socket: TCustomWinSocket);
  567. begin
  568. Socket.SendText(AnsiString(
  569. 'JumpStart;'
  570. +IntToStr(ID)+';'));
  571. end;
  572. procedure TForm3.SendKill(ID: Cardinal; Socket: TCustomWinSocket);
  573. begin
  574. Socket.SendText(AnsiString(
  575. 'PlayerKill;'
  576. +IntToStr(ID)+';'));
  577. end;
  578. procedure TForm3.SendKill(ID: Cardinal);
  579. var C2:Integer;
  580. begin
  581. if ClientSocket.Active
  582. then SendKill(ID,ClientSocket.Socket)
  583. else if ServerSocket.Active
  584. then for C2:=0 to ServerSocket.Socket.ActiveConnections-1 do
  585. SendKill(ID,ServerSocket.Socket.Connections[C2]);
  586. end;
  587. procedure TForm3.SendWin(ID: Cardinal; Socket: TCustomWinSocket);
  588. begin
  589. Socket.SendText(AnsiString(
  590. 'GameWin;'
  591. +IntToStr(ID)+';'));
  592. end;
  593. procedure TForm3.SendWin(ID: Cardinal);
  594. var C2:Integer;
  595. begin
  596. if ClientSocket.Active
  597. then SendWin(ID,ClientSocket.Socket)
  598. else if ServerSocket.Active
  599. then for C2:=0 to ServerSocket.Socket.ActiveConnections-1 do
  600. SendWin(ID,ServerSocket.Socket.Connections[C2]);
  601. end;
  602. procedure TForm3.SendInkTrigger(ID: Cardinal; Socket: TCustomWinSocket);
  603. begin
  604. Socket.SendText(AnsiString(
  605. 'InkTrigger;'
  606. +IntToStr(ID)+';'));
  607. end;
  608. procedure TForm3.SendInkTrigger(ID: Cardinal);
  609. var C2:Integer;
  610. begin
  611. if ClientSocket.Active
  612. then SendInkTrigger(ID,ClientSocket.Socket)
  613. else if ServerSocket.Active
  614. then for C2:=0 to ServerSocket.Socket.ActiveConnections-1 do
  615. SendInkTrigger(ID,ServerSocket.Socket.Connections[C2]);
  616. end;
  617. procedure TForm3.SendSpeedChange(ID:Cardinal);
  618. var C1,C2:Integer; MaxDist:Real;
  619. begin
  620. if not ServerSocket.Active then Exit;
  621. MaxDist:=0;
  622. for C2:=0 to High(Players) do
  623. if Cardinal(C2)<>ID then
  624. if not Players[C2].Dead then
  625. MaxDist:=Max(MaxDist,
  626. sqrt(sqr(Players[C2].X-GoalPos.X*20)+sqr(Players[C2].Z-GoalPos.Y*20)));
  627. MaxDist:=MaxDist*2;
  628. if ID<>MyID then begin
  629. Form1.MultiplySpeedBy(sqrt(
  630. sqr(Players[MyID].X-GoalPos.X*20)
  631. +sqr(Players[MyID].Z-GoalPos.Y*20))
  632. /MaxDist);
  633. Form1.Panel11.Font.Color:=RGB(255,255,0);
  634. Form1.Panel11.Color:=RGB(0,0,0);
  635. Form1.Panel11.Visible:=true;
  636. Form1.Panel11.Caption:='Speed decreased to '
  637. +Floattostr(Round(100*Players[MyID].Speed)/100);
  638. Panel11Seconds:=3;
  639. Form1.GLHUDText1.Text:='Speed: '
  640. +Floattostr(Round(100*Players[MyID].Speed)/100);
  641. end;
  642. for C1:=0 to ServerSocket.Socket.ActiveConnections-1 do
  643. ServerSocket.Socket.Connections[C1].SendText(Ansistring(
  644. 'ChangeSpeed;'
  645. +FloatToStr(MaxDist)+';'
  646. +FloatToStr(ID)+';'));
  647. end;
  648. procedure TForm3.SendRaum(Socket: TCustomWinSocket; RaumPos:TPoint);
  649. begin
  650. Socket.SendText(AnsiString(
  651. 'Raum;'
  652. +IntToStr(RaumPos.X)+';'
  653. +IntToStr(RaumPos.Y)+';'
  654. +IntToStr(Byte(Map[RaumPos.X,RaumPos.Y].Walls))+';'
  655. +IntToStr(Byte(Map[RaumPos.X,RaumPos.Y].UpWalls))+';'
  656. +IntToStr(Byte(Map[RaumPos.X,RaumPos.Y].DownWalls))+';'
  657. +IntToStr(Byte(Map[RaumPos.X,RaumPos.Y].Inhalt.Sorte))+';'));
  658. if GetRT(RaumPos.X,RaumPos.Y).TurnRandom[Up]
  659. or GetRT(RaumPos.X,RaumPos.Y).TurnRandom[Down] then
  660. Socket.SendText(AnsiString(
  661. 'RaumRichtung;'
  662. +IntToStr(RaumPos.X)+';'
  663. +IntToStr(RaumPos.Y)+';'
  664. +IntToStr(Byte(Map[RaumPos.X,RaumPos.Y].Inhalt.Daten^))+';'));
  665. end;
  666. procedure TForm3.SendRaum(RaumPos:TPoint);
  667. var C2:Integer;
  668. begin
  669. if ClientSocket.Active
  670. then SendRaum(ClientSocket.Socket,RaumPos)
  671. else if ServerSocket.Active
  672. then for C2:=0 to ServerSocket.Socket.ActiveConnections-1 do
  673. SendRaum(ServerSocket.Socket.Connections[C2],RaumPos);
  674. end;
  675. procedure TForm3.SendRaumSorte(Socket: TCustomWinSocket; RaumPos:TPoint);
  676. begin
  677. Socket.SendText(AnsiString(
  678. 'RaumSorte;'
  679. +IntToStr(RaumPos.X)+';'
  680. +IntToStr(RaumPos.Y)+';'
  681. +IntToStr(Byte(Map[RaumPos.X,RaumPos.Y].Inhalt.Sorte))+';'));
  682. end;
  683. procedure TForm3.SendRaumSorte(RaumPos:TPoint);
  684. var C2:Integer;
  685. begin
  686. if ClientSocket.Active
  687. then SendRaumSorte(ClientSocket.Socket,RaumPos)
  688. else if ServerSocket.Active
  689. then for C2:=0 to ServerSocket.Socket.ActiveConnections-1 do
  690. SendRaumSorte(ServerSocket.Socket.Connections[C2],RaumPos);
  691. end;
  692. procedure TForm3.SendRaumSorte(X,Z:Integer);
  693. var RaumPos:TPoint;
  694. begin
  695. RaumPos.X:=X;
  696. RaumPos.Y:=Z;
  697. SendRaumSorte(RaumPos);
  698. end;
  699. procedure TForm3.SendNewID(Socket: TCustomWinSocket);
  700. var C1:Integer;
  701. begin
  702. C1:=Length(Players);
  703. AddToPlayerArr(C1);
  704. Socket.SendText(AnsiString(
  705. 'NewID;'
  706. +IntToStr(C1)+';'));
  707. end;
  708. procedure TForm3.RequestNewID(Socket: TCustomWinSocket);
  709. begin
  710. Socket.SendText(
  711. 'RequestNewID;');
  712. end;
  713. procedure TForm3.SendGoalPos(Socket: TCustomWinSocket);
  714. begin
  715. Socket.SendText(AnsiString(
  716. 'GoalPos;'
  717. +IntToStr(GoalPos.X)+';'
  718. +IntToStr(GoalPos.Y)+';'));
  719. end;
  720. end.