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

外挂编程

开发平台:

Windows_Unix

  1. #!/usr/bin/env perl
  2. ###########################################################
  3. # Poseidon server - XKore Integrated version
  4. #
  5. # This program is free software; you can redistribute it and/or 
  6. # modify it under the terms of the GNU General Public License 
  7. # as published by the Free Software Foundation; either version 2 
  8. # of the License, or (at your option) any later version.
  9. #
  10. # Copyright (c) 2005-2006 OpenKore Development Team
  11. ###########################################################
  12. package Poseidon::EmbedServer;
  13. use strict;
  14. use Scalar::Util;
  15. use Base::Server;
  16. use Bus::MessageParser;
  17. use Bus::Messages qw(serialize);
  18. use Log qw(message);
  19. use Translation qw(T TF);
  20. use base qw(Base::Server);
  21. use Globals;
  22. my $CLASS = "Poseidon::EmbedServer";
  23. use constant QUERY_SERVER_HOST => '127.0.0.1';
  24. use constant QUERY_SERVER_PORT => 24390;
  25. use constant POSEIDON_SUPPORT_URL => 'http://www.openkore.com/aliases/poseidon.php';
  26. ##
  27. # Poseidon::EmbedServer->new
  28. #
  29. # Create a new Poseidon::EmbedServer object.
  30. sub new {
  31. my $class = shift;
  32. my $ip = QUERY_SERVER_HOST;
  33. my $port = QUERY_SERVER_PORT;
  34. my $self = $class->SUPER::new($port, $ip);
  35. # Array<Request> queue
  36. #
  37. # The GameGuard query packets queue. Both received and awaiting response
  38. #
  39. # Invariant: defined(queue)
  40. $self->{"$CLASS queue"} = [];
  41. $self->{"$CLASS responseQueue"} = [];
  42. $self->{sentQuery} = 0;
  43. message TF("Embed Poseidon Server initializedn" . 
  44. "Please read %s for more information.nn", POSEIDON_SUPPORT_URL), "startup";
  45. return $self;
  46. }
  47. ##
  48. # void $EmbedServer->process(Base::Server::Client client, String ID, Hash* args)
  49. #
  50. # Push an OpenKore GameGuard query to the queue.
  51. sub process {
  52. my ($self, $client, $ID, $args) = @_;
  53. if ($ID ne "Poseidon Query") {
  54. $client->close();
  55. return;
  56. }
  57. message TF("Poseidon: received query from client %sn", $client->getIndex()), "poseidon";
  58. my %request = (
  59. packet => $args->{packet},
  60. client => $client
  61. );
  62. Scalar::Util::weaken($request{client});
  63. push @{$self->{"$CLASS queue"}}, %request;
  64. }
  65. sub onClientNew {
  66. my ($self, $client) = @_;
  67. $client->{"$CLASS parser"} = new Bus::MessageParser();
  68. }
  69. sub onClientData {
  70. my ($self, $client, $msg) = @_;
  71. my ($ID, $args, $rest);
  72. my $parser = $client->{"$CLASS parser"};
  73. $parser->add($msg);
  74. while ($args = $parser->readNext($ID)) {
  75. $self->process($client, $ID, $args);
  76. }
  77. }
  78. sub iterate {
  79. my $self = shift;
  80. my $r_net = shift;
  81. my ($response, $queue);
  82. $self->SUPER::iterate();
  83. $response = $self->{"$CLASS responseQueue"};
  84. $queue = $self->{"$CLASS queue"};
  85. if (@{$response} > 0) {
  86. # Send the response to the client.
  87. if (@{$queue} > 0 && $queue->[0]{client}) {
  88. my ($data, %args);
  89. $args{packet} = shift @{$response};
  90. # FIXME: somehow, xkoreproxy makes the RO client send two identical gameguard syncs making the receiver
  91. # disconnect from the server - this happens intermittently
  92. $args{packet} = substr($args{packet}, 0, 18);
  93. $data = serialize("Poseidon Reply", %args);
  94. $queue->[0]{client}->send($data);
  95. $queue->[0]{client}->close();
  96. message TF("Poseidon: Sent result to client %sn", $queue->[0]{client}->getIndex()), "poseidon";
  97. }
  98. $self->{sentQuery} = 0;
  99. shift @{$queue};
  100. } elsif (@{$queue} > 0 && !$self->{sentQuery}) {
  101. message T("Poseidon: Querying Ragnarok Online client.n"), "poseidon";
  102. #$r_net->clientSend($queue->[0]{packet});
  103. # send the query to the connected RO client
  104. $messageSender->{net}->clientSend($queue->[0]{packet});
  105. $self->{sentQuery} = 1;
  106. }
  107. }
  108. sub setResponse {
  109. my $self = shift;
  110. my $packet = shift;
  111. push @{$self->{"$CLASS responseQueue"}}, $packet;
  112. }
  113. sub awaitingResponse {
  114. my $self = shift;
  115. return ($self->{sentQuery} && @{$self->{"$CLASS responseQueue"}} == 0);
  116. }
  117. 1;