marcelofoxes

Untitled

Sep 11th, 2017
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 6.90 KB | None | 0 0
  1. # economy companion plugin for openkore by marcelothebuilder
  2. package economy;
  3.  
  4. use strict;
  5. # use DBI;
  6. use Globals;
  7. use Misc;
  8. use Utils;
  9. use Log qw(message warning error);
  10. use IO::Socket::INET;
  11. use Storable qw(nfreeze); # nfreeze rather than freeze because
  12.                           # we want a network-portable string
  13.  
  14. Plugins::register('economy','economy', \&plugin_unload);
  15.  
  16. my $plugin_hooks = Plugins::addHooks(
  17.     ['in_game', \&start3],
  18.     ['packet_vender', \&hook_found_vender],
  19.     ['packet_vender_store2', \&hook_shop_info],
  20.     ['packet_vender_store', \&storeList]
  21. );
  22.  
  23. # create a connecting socket
  24. my $socket;
  25.  
  26. sub start3 {
  27.     if (!$socket || !$socket->connected()) {
  28.         $socket = new IO::Socket::INET (
  29.             PeerHost => '127.0.0.1',
  30.             PeerPort => '7778',
  31.             Proto => 'tcp',
  32.         );
  33.         die "cannot connect to the server $!\n" unless $socket;
  34.         print "connected to the server\n";
  35.         #$| = 0;
  36.         $socket->autoflush(1);
  37.        
  38.         die unless $socket->connected();
  39.        
  40.         my %self_info = (server => $servers[$config{'server'}]{'name'}, username => $config{username});
  41.         my $stored = nfreeze \%self_info;
  42.         #warning "Sizeof ".length("DEL".$stored)."\n";
  43.        
  44.         my $full_data = "IDD".$stored;
  45.         #warning "Sending $full_data\n";
  46.         $socket->send(length($full_data).$full_data."\n") or die $!;
  47.     }
  48. }
  49.  
  50. my $myCmds = Commands::register(
  51.                                     ['chks',        "use d>.",\&check_shops],
  52.                                     ['setoff',      "use d>.",\&set_off]
  53. );
  54.  
  55. sub plugin_unload {
  56.     Plugins::delHooks($plugin_hooks);
  57. }
  58.  
  59. sub set_off {
  60.     my %self_info = (map => $field->baseName(), x => $char->{pos_to}{x}, y => $char->{pos_to}{y});
  61.     my $stored = nfreeze \%self_info;
  62.     #warning "Sizeof ".length("DEL".$stored)."\n";
  63.    
  64.     my $full_data = "SOF".$stored;
  65.     #warning "Sending $full_data\n";
  66.     $socket->send(length($full_data).$full_data."\n") or die $!;
  67.  
  68. }
  69.  
  70. sub check_shops {
  71.    
  72.     die unless $socket->connected();
  73.    
  74.     #shutdown($socket, 1) or die $!;
  75.     #return ;
  76.     #$socket->flush();
  77.     #close($socket);
  78.     #shutdown($socket, 1);
  79.    
  80.     my %self_info = (map => $field->baseName(), x => $char->{pos_to}{x}, y => $char->{pos_to}{y});
  81.     my $stored = nfreeze \%self_info;
  82.     #warning "Sizeof ".length("DEL".$stored)."\n";
  83.    
  84.     my $full_data = "SOF".$stored;
  85.     #warning "Sending $full_data\n";
  86.     $socket->send(length($full_data).$full_data."\n") or die $!;
  87.    
  88.     if (@venderListsID == 0) {
  89.         Log::warning "Called check shops with no vender around ".$char->{pos_to}{x}." ".$char->{pos_to}{y}."\n";
  90.     }
  91.        
  92.     for (my $i = 0; $i < @venderListsID; $i++) { # borrow mercDB algorythm until we find a better solution for unknown venders.
  93.         next if (!$venderListsID[$i]);
  94.         my $vender_actor = Actor::get($venderListsID[$i]);
  95.         next unless ($vender_actor->{'pos_to'}{'x'} && $vender_actor->{'pos_to'}{'y'});
  96.         next unless (timeOut($venderLists{$venderListsID[$i]}{'accessTime'}, 10));
  97.         # Log::warning "Sending entering vender \n";
  98.         $venderLists{$venderListsID[$i]}{'accessTime'} = time;
  99.         $messageSender->sendEnteringVender($venderListsID[$i]); # request shop info. then we should receive packet_vender_store2 soon.
  100.     }
  101. }
  102.  
  103. sub hook_found_vender {
  104.     #my (undef, $args) = @_;
  105.     #my $vendor = Actor::get($args->{ID});
  106.     #$messageSender->sendEnteringVender($vendor->{ID});
  107. }
  108.  
  109. sub hook_shop_info {
  110.     my (undef, $args) = @_;
  111.     die unless $socket->connected();
  112.    
  113.     # built-in shopper support.
  114.     # storeList(undef, $args);
  115.    
  116.     #my %shop;
  117.     my $vender_id = unpack("V",$args->{venderID});
  118.     my $vender_actor = Actor::get($args->{venderID});
  119.    
  120.     $shop{pos}{x} = $shop{actor}->{'pos_to'}{'x'};
  121.     $shop{pos}{y} = $shop{actor}->{'pos_to'}{'y'};
  122.    
  123.     my $vender_name = $vender_actor->name;
  124.     my $vender_shop_name = $venderLists{$args->{venderID}}{'title'};
  125.    
  126.     return if !$vender_actor->{'pos_to'}{'x'};
  127.     return if !$vender_actor->{'pos_to'}{'y'};
  128.     #warning $vender_id." | ".$vender_shop_name."\n";
  129.    
  130.     my %store = (
  131.             title => $venderLists{$args->{venderID}}{'title'} || "Loja sem nome",
  132.             vender_id => unpack("V",$args->{venderID}),
  133.             vender_name => $vender_actor->name,
  134.             location => { map => $field->baseName(), x => $vender_actor->{'pos_to'}{'x'}, y => $vender_actor->{'pos_to'}{'y'} }
  135.         );
  136.    
  137.     for (my $i = 0; $i <= $#{$args->{itemList}}; $i++) {
  138.         next if (!$args->{itemList}[$i]{nameID});
  139.         my $item = $args->{itemList}[$i];
  140.         @{$item->{cards_split}} = &core_cards_split($item->{cards});
  141.         delete $item->{cards};
  142.         #$item->{full_name} = itemName($item);
  143.         $item->{full_name} = $item->{name};
  144.         my $string = sprintf("%s %s %s %s %s %s\n", itemName($item), $item->{price}, $item->{amount}, $item->{type}, $item->{id}, $item->{upgrade});
  145.         #warning sprintf("%s %s %s %s %s %s\n", itemName($item), $item->{price}, $item->{amount}, $item->{type}, $item->{id}, $item->{upgrade});
  146.         push (@{$store{items}}, $item);
  147.        
  148.     }
  149.    
  150.     my $stored = nfreeze \%store;
  151.     #warning "Sizeof ".length($stored)."\n";
  152.     my $full_data = "ADD".$stored;
  153.     $socket->send(length($full_data).$full_data."\n") or die $!;
  154.    
  155.    
  156.     # data to send to a server
  157.     #my $req = 'hello world';
  158.     #my $size = $socket->send($req);     
  159.     # notify server that request has been sent
  160.     #shutdown($socket, 1);
  161. }
  162.  
  163. sub core_cards_split { # split card data info. should be 8b
  164.     my $core_cards_data = shift;
  165.     my @ret_array;
  166.     if (length($core_cards_data) != 8) { die "Error in function core_cards_split: core_cards_data should be 8bytes \n"; }
  167.     for (my $i_c =  0; $i_c < length($core_cards_data); $i_c += 2) {
  168.         push (@ret_array, unpack("s", substr($core_cards_data, $i_c, $i_c + 2)));
  169.     }
  170.     return @ret_array;
  171. }
  172.  
  173.  
  174. sub storeList {
  175.     my ($packet, $args) = @_;
  176.     my $venderID = $args->{venderID};
  177.     my $price = $args->{price};
  178.     my $name = $args->{name};
  179.     my $number = $args->{number};
  180.     my $amount = $args->{amount};
  181.  
  182.     my $prefix = "shopper_";
  183.     my $i = 0;
  184.  
  185.     while (exists $config{$prefix.$i}) {
  186.        
  187.         my $maxPrice = $config{$prefix.$i."_maxPrice"};
  188.         my $maxAmount = $config{$prefix.$i."_maxAmount"};
  189.  
  190.         my $invIndex = main::findIndexString_lc($char->{'inventory'}, "name", $config{$prefix.$i});
  191.         my $item = $char->{'inventory'}[$invIndex];
  192.         # message "checking ".lc($name)." against ".lc($config{$prefix.$i})."\n";
  193.         if (lc($name) eq lc($config{$prefix.$i})) {
  194.             warning "$name found!!!\n";
  195.             message "Info: $price $name $number $amount \n";
  196.            
  197.             if (main::checkSelfCondition($prefix.$i) &&
  198.             ($price <= $maxPrice) &&
  199.             (lc($name) eq lc($config{$prefix.$i}))
  200.             )
  201.         {
  202.  
  203.             if ($amount >= $maxAmount) {
  204.                 message "$name found!!! Buying it for $price (max price: $maxPrice).\n";
  205.                 $messageSender->sendBuyBulkVender($venderID, [{itemIndex => $number, amount => $maxAmount}], $venderCID);
  206.                 configModify($prefix.$i."_disabled", 1);
  207.             } else {
  208.                 message "$name found ($amount of $maxAmount)!!! Buying it for $price (max price: $maxPrice).\n";
  209.                 $messageSender->sendBuyBulkVender($venderID, [{itemIndex => $number, amount => $amount}], $venderCID);
  210.                 configModify($prefix.$i."_maxAmount", ($maxAmount - $amount));
  211.             }
  212.         }
  213.         }
  214.        
  215.        
  216.         $i++;
  217.     }
  218. }
  219.  
  220. 1;
Advertisement
Add Comment
Please, Sign In to add comment