XKore2.pm
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:4k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. #########################################################################
  2. #  OpenKore - X-Kore Mode 2
  3. #  Copyright (c) 2007 OpenKore developers
  4. #
  5. #  This software is open source, licensed under the GNU General Public
  6. #  License, version 2.
  7. #  Basically, this means that you're allowed to modify and distribute
  8. #  this software. However, if you distribute modified versions, you MUST
  9. #  also distribute the source code.
  10. #  See http://www.gnu.org/licenses/gpl.html for the full license.
  11. #
  12. #  $Revision: 6597 $
  13. #  $Id: XKore2.pm 6597 2008-11-05 15:10:15Z technologyguild $
  14. #
  15. #########################################################################
  16. ##
  17. # MODULE DESCRIPTION: X-Kore 2.
  18. package Network::XKore2;
  19. use strict;
  20. use Globals qw(%config %rpackets $masterServer $char);
  21. use Utils qw(makeCoords calcPosition);
  22. use Plugins;
  23. use Base::Ragnarok::SessionStore;
  24. use Network;
  25. use Network::XKore2::AccountServer;
  26. use Network::XKore2::CharServer;
  27. use Network::XKore2::MapServer;
  28. use Modules 'register';
  29. our ($hooks, $sessionStore, $accountServer, $charServer, $mapServer ,$mapServerChange);
  30. ##
  31. # void Network::XKore2::start()
  32. #
  33. # Start the X-Kore 2 subsystem.
  34. sub start {
  35. my $publicIP = $config{XKore_publicIp} || '127.0.0.1';
  36. $sessionStore = new Base::Ragnarok::SessionStore();
  37. $mapServer = new Network::XKore2::MapServer(
  38. host => $publicIP,
  39. serverType => $config{serverType},
  40. rpackets => %rpackets,
  41. sessionStore => $sessionStore
  42. );
  43. $charServer = new Network::XKore2::CharServer(
  44. host => $publicIP,
  45. serverType => $config{serverType},
  46. rpackets => %rpackets,
  47. mapServer => $mapServer,
  48. sessionStore => $sessionStore,
  49. name => $config{XKore_ID}
  50. );
  51. $accountServer = new Network::XKore2::AccountServer(
  52. host => $publicIP,
  53. port => $config{XKore_listenPort} || 6900,
  54. serverType => $config{serverType},
  55. rpackets => %rpackets,
  56. charServer => $charServer,
  57. sessionStore => $sessionStore
  58. );
  59. $hooks = Plugins::addHooks(
  60. ['Network::setState', &stateChanged],
  61. ['Network::clientAlive', &clientAlive],
  62. ['Network::clientSend', &clientSend],
  63. ['Network::clientRecv', &clientRecv],
  64. ['mainLoop_pre', &mainLoop]
  65. );
  66. }
  67. ##
  68. # void Network::XKore2::stop()
  69. #
  70. # Stop the X-Kore 2 subsystem.
  71. sub stop {
  72. Plugins::delHooks($hooks);
  73. }
  74. sub stateChanged {
  75. $accountServer->setServerType($masterServer->{serverType});
  76. $charServer->setServerType($masterServer->{serverType});
  77. $mapServer->setServerType($masterServer->{serverType});
  78. }
  79. sub clientAlive {
  80. my (undef, $args) = @_;
  81. $args->{return} = @{$mapServer->clients} > 0;
  82. }
  83. sub clientSend {
  84. my (undef, $args) = @_;
  85. if ($args->{net}->getState() == Network::IN_GAME) {
  86. foreach my $client (@{$mapServer->clients}) {
  87. my $sendData = filterPacket($args->{data});
  88. $client->send($sendData) if (length($sendData) > 0);
  89. }
  90. }
  91. }
  92. sub clientRecv {
  93. no encoding 'utf8';
  94. use bytes;
  95. my (undef, $args) = @_;
  96. if ($args->{net}->getState() != Network::IN_GAME) {
  97. foreach my $client (@{$mapServer->clients}) {
  98. $client->{outbox}->clear() if ($client->{outbox});
  99. }
  100. } else {
  101. my $result = '';
  102. foreach my $client (@{$mapServer->clients}) {
  103. my $type;
  104. while (my $message = $client->{outbox}->readNext($type)) {
  105. $result .= $message;
  106. }
  107. }
  108. $args->{return} = $result if (length($result) > 0);
  109. }
  110. }
  111. sub filterPacket {
  112. my ($msg) = shift;
  113. my $switch = uc(unpack("H2", substr($msg, 1, 1))) . uc(unpack("H2", substr($msg, 0, 1)));
  114. if ($switch eq "0092"){
  115.     $mapServerChange = unpack('x2 Z16 x*', $msg);
  116. $mapServerChange =~ /([sS]*)./;
  117. return "";
  118. } elsif ($switch eq "00B0" && $mapServerChange ne '') {
  119. my $pos = calcPosition($char);
  120. $msg = pack("C*",0x91,0). pack("a16", $mapServerChange) . pack("v1 v1", $pos->{x}, $pos->{y}).$msg;
  121. $mapServerChange = '';
  122. } elsif ($switch eq "02AE") {
  123. $msg = "";
  124. }
  125. return $msg;
  126. }
  127. sub mainLoop {
  128. if ($accountServer) {
  129. $accountServer->iterate();
  130. $charServer->iterate();
  131. $mapServer->iterate();
  132. $sessionStore->removeTimedOutSessions();
  133. }
  134. }
  135. 1;