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

外挂编程

开发平台:

Windows_Unix

  1. #########################################################################
  2. #  OpenKore - Packet sending
  3. #  This module contains functions for sending packets to the server.
  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. # Servertype overview: http://www.openkore.com/wiki/index.php/ServerType
  13. package Network::Send::ServerType7;
  14. use strict;
  15. use Globals qw($accountID $sessionID $sessionID2 $accountSex $char $charID %config %guild @chars $masterServer $syncSync $net);
  16. use Network::Send::ServerType0;
  17. use base qw(Network::Send::ServerType0);
  18. use Log qw(message warning error debug);
  19. use I18N qw(stringToBytes);
  20. use Utils qw(getTickCount getHex getCoordString);
  21. sub new {
  22. my ($class) = @_;
  23. return $class->SUPER::new(@_);
  24. }
  25. sub sendAttack {
  26. my ($self, $monID, $flag) = @_;
  27. my $msg;
  28. my %args;
  29. $args{monID} = $monID;
  30. $args{flag} = $flag;
  31. Plugins::callHook('packet_pre/sendAttack', %args);
  32. if ($args{return}) {
  33. $self->sendToServer($args{msg});
  34. return;
  35. }
  36. if (AI::action() eq "NPC") {
  37. error "Failed to talk to monster NPC.n";
  38. AI::dequeue();
  39. } elsif (AI::action() eq "attack") {
  40. error "Failed to attack target.n";
  41. AI::dequeue();
  42. }
  43. }
  44. sub sendSit {
  45. my $self = shift;
  46. my %args;
  47. $args{flag} = 2;
  48. Plugins::callHook('packet_pre/sendSit', %args);
  49. if ($args{return}) {
  50. $self->sendToServer($args{msg});
  51. return;
  52. }
  53. error "Your server is not supported because it uses padded packets.n";
  54. if (AI::action() eq "sitting") {
  55. error "Failed to sit.n";
  56. AI::dequeue();
  57. }
  58. }
  59. sub sendStand {
  60. my $self = shift;
  61. my %args;
  62. $args{flag} = 3;
  63. Plugins::callHook('packet_pre/sendStand', %args);
  64. if ($args{return}) {
  65. $self->sendToServer($args{msg});
  66. return;
  67. }
  68. error "Your server is not supported because it uses padded packets.n";
  69. if (AI::action() eq "standing") {
  70. error "Failed to stand.n";
  71. AI::dequeue();
  72. }
  73. }
  74. sub sendSkillUse {
  75. my $self = shift;
  76. my $ID = shift;
  77. my $lv = shift;
  78. my $targetID = shift;
  79. my %args;
  80. $args{ID} = $ID;
  81. $args{lv} = $lv;
  82. $args{targetID} = $targetID;
  83. Plugins::callHook('packet_pre/sendSkillUse', %args);
  84. if ($args{return}) {
  85. $self->sendToServer($args{msg});
  86. return;
  87. }
  88. error "Your server is not supported because it uses padded packets.n";
  89. if (AI::action() eq 'teleport') {
  90. error "Failed to use teleport skill.n";
  91. AI::dequeue();
  92. } elsif (AI::action() ne "skill_use") {
  93. error "Failed to use skill.n";
  94. AI::dequeue();
  95. }
  96. }
  97. sub sendDrop {
  98. my ($self, $index, $amount) = @_;
  99. my $msg;
  100. $msg = pack("C*", 0xA2, 0x00) .
  101. pack("C*", 0x4B, 0x00, 0xB8, 0x00) .
  102. pack("v*", $index) .
  103. pack("C*", 0xC8, 0xFE, 0xB2, 0x07, 0x63, 0x01, 0x00) .
  104. pack("v*", $amount);
  105. $self->sendToServer($msg);
  106. debug "Sent drop: $index x $amountn", "sendPacket", 2;
  107. }
  108. sub sendGetPlayerInfo {
  109. my ($self, $ID) = @_;
  110. my $msg;
  111. $msg = pack("C*", 0x94, 0x00) . pack("C*", 0x5B, 0x04, 0x0C, 0xF9, 0x12, 0x00, 0x36, 0xAE) . $ID;
  112. $self->sendToServer($msg);
  113. debug "Sent get player info: ID - ".getHex($ID)."n", "sendPacket", 2;
  114. }
  115. sub sendItemUse {
  116. my ($self, $ID, $targetID) = @_;
  117. my $msg;
  118. $msg = pack("C*", 0xA7, 0x00, 0x12, 0x00, 0xB0, 0x5A, 0x61) .
  119. pack("v*", $ID) .
  120. pack("C*", 0xFA, 0x12, 0x00, 0xDA, 0xF9, 0x12, 0x00) .
  121. $targetID;
  122. $self->sendToServer($msg);
  123. debug "Item Use: $IDn", "sendPacket", 2;
  124. }
  125. sub sendLook {
  126. my ($self, $body, $head) = @_;
  127. my $msg;
  128. $msg = pack("C*", 0x9B, 0x00, 0x67, 0x00, $head,
  129. 0x00, 0x5B, 0x04, 0xE2, $body);
  130. $self->sendToServer($msg);
  131. debug "Sent look: $body $headn", "sendPacket", 2;
  132. $char->{look}{head} = $head;
  133. $char->{look}{body} = $body;
  134. }
  135. sub sendMapLogin {
  136. my ($self, $accountID, $charID, $sessionID, $sex) = @_;
  137. my $msg;
  138. $sex = 0 if ($sex > 1 || $sex < 0); # Sex can only be 0 (female) or 1 (male)
  139. $msg = pack("C*", 0x72, 0, 0, 0, 0, 0, 0) .
  140. $accountID .
  141. pack("C*", 0x00, 0x10, 0xEE, 0x65) .
  142. $charID .
  143. pack("C*", 0xFF, 0xCC, 0xFA, 0x12, 0x00, 0x61) .
  144. $sessionID .
  145. pack("V", getTickCount()) .
  146. pack("C*",$sex);
  147. $self->sendToServer($msg);
  148. }
  149. sub sendMove {
  150. my $self = shift;
  151. my $x = int scalar shift;
  152. my $y = int scalar shift;
  153. my $msg;
  154. $msg = pack("C*", 0x85, 0x00, 0xA8, 0x07, 0xE8) . getCoordString($x, $y);
  155. $self->sendToServer($msg);
  156. debug "Sent move to: $x, $yn", "sendPacket", 2;
  157. }
  158. sub sendSkillUseLoc {
  159. my ($self, $ID, $lv, $x, $y) = @_;
  160. my $msg;
  161. $msg = pack("C*", 0x16, 0x01, 0x7F, 0x00, 0x04, 0xFA, 0x12, 0x00, 0xAF, 0x41) .
  162. pack("v", $lv) .
  163. pack("C*", 0x20, 0x09) .
  164. pack("v*", $ID) .
  165. pack("C*", 0xA8, 0xBE) .
  166. pack("v*", $x) . 
  167. pack("C*", 0x5B, 0x4E, 0xB4) .
  168. pack("v*", $y);
  169. $self->sendToServer($msg);
  170. debug "Skill Use on Location: $ID, ($x, $y)n", "sendPacket", 2;
  171. }
  172. sub sendStorageAdd {
  173. my ($self, $index, $amount) = @_;
  174. my $msg;
  175. $msg = pack("C*", 0xF3, 0x00, 0x1B) .
  176. pack("v", $index) .
  177. pack("C*", 0x88, 0xC5, 0x07, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x0C, 0x7F) .
  178. pack("V", $amount);
  179. $self->sendToServer($msg);
  180. debug "Sent Storage Add: $index x $amountn", "sendPacket", 2;
  181. }
  182. sub sendStorageGet {
  183. my ($self, $index, $amount) = @_;
  184. my $msg;
  185. $msg = pack("C*", 0xF5, 0x00, 0x00) .
  186. pack("v*", $index) .
  187. pack("C*", 0x00, 0x00, 0x00, 0x60, 0xF7, 0x12, 0x00, 0xB8) .
  188. pack("V*", $amount);
  189. $self->sendToServer($msg);
  190. debug "Sent Storage Get: $index x $amountn", "sendPacket", 2;
  191. }
  192. sub sendSync {
  193. my ($self, $initialSync) = @_;
  194. my $msg;
  195. # XKore mode 1 lets the client take care of syncing.
  196. return if ($self->{net}->version == 1);
  197. $syncSync = pack("V", getTickCount());
  198. $msg = pack("C*", 0x7E, 0x00);
  199. $msg .= pack("C*", 0x30, 0x00, 0x80, 0x02, 0x00) if ($initialSync);
  200. $msg .= pack("C*", 0x00, 0x00, 0xD0, 0x4F, 0x74) if (!$initialSync);
  201. $msg .= $syncSync;
  202. $self->sendToServer($msg);
  203. debug "Sent Syncn", "sendPacket", 2;
  204. }
  205. sub sendTake {
  206. my ($self, $itemID) = @_;
  207. my $msg;
  208. $msg = pack("C*", 0x9F, 0x00, 0x00, 0x00, 0xE8, 0x3C, 0x5B) . $itemID;
  209. $self->sendToServer($msg);
  210. debug "Sent taken", "sendPacket", 2;
  211. }
  212. 1;