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

外挂编程

开发平台:

Windows_Unix

  1. package Base::Ragnarok::MapServer;
  2. use strict;
  3. use Time::HiRes qw(time);
  4. no encoding 'utf8';
  5. use bytes;
  6. use Globals;
  7. use Modules 'register';
  8. use Base::RagnarokServer;
  9. use Misc;
  10. use base qw(Base::RagnarokServer);
  11. use Utils;
  12. use constant SESSION_TIMEOUT => 120;
  13. use constant DUMMY_POSITION => {
  14. map => 'prontera.gat',
  15. x => 154,
  16. y => 198
  17. };
  18. sub new {
  19. my $class = shift;
  20. my %options = @_;
  21. my $self = $class->SUPER::new(
  22. $options{host},
  23. $options{port},
  24. $options{serverType},
  25. $options{rpackets}
  26. );
  27. $self->{sessionStore} = $options{sessionStore};
  28. return $self;
  29. }
  30. sub getCharInfo {
  31. #my ($self, $session) = @_;
  32. }
  33. sub handleLogin {
  34. my ($self, $client, $accountID, $charID, $sessionID, $gender) = @_;
  35. my $session = $self->{sessionStore}->get($sessionID);
  36. if (!$session || $session->{accountID} ne $accountID || $session->{sessionID} != $sessionID
  37.   || $session->{sex} != $gender || $session->{charID} ne $charID
  38.   || $session->{state} ne 'About to load map') {
  39. $client->close();
  40. } else {
  41. $self->{sessionStore}->remove($session);
  42. $client->{session} = $session;
  43. my $output;
  44. #Note: in perl 8 == "8_4" == '8_4',  so to separate them you need to use a regular expression
  45. $output = pack("C2",0x83, 0x02) if ($self->getServerType() =~ m/^8(_[1-5])$/);
  46. $output .= $accountID;
  47. my $charInfo = $self->getCharInfo($session);
  48. my $coords = '';
  49. shiftPack($coords, $charInfo->{x}, 10);
  50. shiftPack($coords, $charInfo->{y}, 10);
  51. shiftPack($coords, 0, 4);
  52. $output .= pack("C2 V a3 x2",
  53. 0x73, 0x00,
  54. int(time), # syncMapSync
  55. $coords # character coordinates
  56. );
  57. $client->send($output);
  58. }
  59. }
  60. sub process_0072 {
  61. my ($self, $client, $message) = @_;
  62. if ($self->{serverType} == 0 || $self->{serverType} == 21) {
  63. # Map server login.
  64. my ($accountID, $charID, $sessionID, $gender) = unpack('x2 a4 a4 V x4 C', $message);
  65. $self->handleLogin($client, $accountID, $charID, $sessionID, $gender);
  66. return 1;
  67. } elsif ($self->getServerType()  == 8) {
  68. # packet sendSkillUse
  69. $self->unhandledMessage($client, $message);
  70. return 0;
  71. } else { #oRO and pRO and idRO
  72. my ($accountID, $charID, $sessionID, $gender) = unpack('x2 a4 x5 a4 x2 V x4 C', $message);
  73. $self->handleLogin($client, $accountID, $charID, $sessionID, $gender);
  74. return 1;
  75. }
  76. }
  77. sub process_00F3 {
  78. my ($self, $client, $message) = @_;
  79. if ($self->getServerType() == 18) {
  80. # Map server login.
  81. my ($charID, $accountID, $sessionID, $gender) = unpack('x5 a4 a4 x V x9 x4 C', $message);
  82. $self->handleLogin($client, $accountID, $charID, $sessionID, $gender);
  83. return 1;
  84. } else {
  85. $self->unhandledMessage($client, $message);
  86. return 0;
  87. }
  88. }
  89. # $msg = pack("C*", 0x9b, 0, 0x39, 0x33) .
  90. # $accountID .
  91. # pack("C*", 0x65) .
  92. # $charID .
  93. # pack("C*", 0x37, 0x33, 0x36, 0x64) .
  94. # $sessionID .
  95. # pack("V", getTickCount()) .
  96. # pack("C*", $sex);
  97. sub process_009B {
  98. my ($self, $client, $message) = @_;
  99. if ($self->getServerType() == 8) {
  100. # Map server login.
  101. my ($accountID , $charID, $sessionID, $gender) = unpack('x4 a4 x a4 x4 V x4 C', $message);
  102. $self->handleLogin($client, $accountID, $charID, $sessionID, $gender);
  103. return 1;
  104. } else {
  105. $self->unhandledMessage($client, $message);
  106. return 0;
  107. }
  108. }
  109. sub process_0436 {
  110. my ($self, $client, $message) = @_;
  111. if ($self->getServerType() =~ m/^8_5$/) {
  112. # Map server login.
  113. my ($accountID , $charID, $sessionID, $gender) = unpack('x2 a4 a4 V x4 C', $message);
  114. $self->handleLogin($client, $accountID, $charID, $sessionID, $gender);
  115. return 1;
  116. } else {
  117. $self->unhandledMessage($client, $message);
  118. return 0;
  119. }
  120. }
  121. sub unhandledMessage {
  122. my ($self, $client) = @_;
  123. if (!$client->{session}) {
  124. $client->close();
  125. return 0;
  126. } else {
  127. return 1;
  128. }
  129. }
  130. 1;