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

外挂编程

开发平台:

Windows_Unix

  1. # A basic implementation of an abstract Ragnarok Online server.
  2. # This is the abstract base class for @MODULE(Base::Ragnarok::AccountServer),
  3. # @MODULE(Base::Ragnarok::CharServer) and @MODULE(Base::Ragnarok::MapServer).
  4. package Base::RagnarokServer;
  5. use strict;
  6. use Base::Server;
  7. use base qw(Base::Server);
  8. use Network::MessageTokenizer;
  9. use Utils::Exceptions;
  10. use Misc;
  11. sub new {
  12. my ($class, $host, $port, $serverType, $rpackets) = @_;
  13. my $self = $class->SUPER::new($port, $host);
  14. $self->{serverType} = $serverType;
  15. $self->{rpackets} = $rpackets;
  16. return $self;
  17. }
  18. sub getServerType {
  19. return $_[0]->{serverType};
  20. }
  21. sub setServerType {
  22. my ($self, $serverType) = @_;
  23. if ($self->{severType} != $serverType) {
  24. $self->{serverType} = $serverType;
  25. foreach my $client (@{$self->clients()}) {
  26. my $buffer = $client->{tokenizer}->getBuffer();
  27. $client->{tokenizer} = new Network::MessageTokenizer(
  28. $self->{rpackets});
  29. $client->{tokenizer}->add($buffer);
  30. }
  31. }
  32. }
  33. sub getRecvPackets {
  34. return $_[0]->{rpackets};
  35. }
  36. sub onClientNew {
  37. my ($self, $client) = @_;
  38. $client->{tokenizer} = new Network::MessageTokenizer(
  39. $self->{rpackets});
  40. }
  41. sub onClientData {
  42. my ($self, $client, $data) = @_;
  43. $client->{tokenizer}->add($data);
  44. my $type;
  45. while (my $message = $client->{tokenizer}->readNext($type)) {
  46. if ($type == Network::MessageTokenizer::KNOWN_MESSAGE) {
  47. my $ID = Network::MessageTokenizer::getMessageID($message);
  48. my $handler = $self->can('process_' . $ID);
  49. if ($handler) {
  50. $handler->($self, $client, $message);
  51. } else {
  52. $self->unhandledMessage($client, $message);
  53. }
  54. } else {
  55. $client->close();
  56. }
  57. }
  58. }
  59. sub displayMessage {
  60. if (defined &Misc::visualDump) {
  61. Misc::visualDump($_[1]);
  62. }
  63. }
  64. sub unhandledMessage {
  65. }
  66. 1;