Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # economy companion plugin for openkore by marcelothebuilder
- package economy;
- use strict;
- # use DBI;
- use Globals;
- use Misc;
- use Utils;
- use Log qw(message warning error);
- use IO::Socket::INET;
- use Storable qw(nfreeze); # nfreeze rather than freeze because
- # we want a network-portable string
- Plugins::register('economy','economy', \&plugin_unload);
- my $plugin_hooks = Plugins::addHooks(
- ['in_game', \&start3],
- ['packet_vender', \&hook_found_vender],
- ['packet_vender_store2', \&hook_shop_info],
- ['packet_vender_store', \&storeList]
- );
- # create a connecting socket
- my $socket;
- sub start3 {
- if (!$socket || !$socket->connected()) {
- $socket = new IO::Socket::INET (
- PeerHost => '127.0.0.1',
- PeerPort => '7778',
- Proto => 'tcp',
- );
- die "cannot connect to the server $!\n" unless $socket;
- print "connected to the server\n";
- #$| = 0;
- $socket->autoflush(1);
- die unless $socket->connected();
- my %self_info = (server => $servers[$config{'server'}]{'name'}, username => $config{username});
- my $stored = nfreeze \%self_info;
- #warning "Sizeof ".length("DEL".$stored)."\n";
- my $full_data = "IDD".$stored;
- #warning "Sending $full_data\n";
- $socket->send(length($full_data).$full_data."\n") or die $!;
- }
- }
- my $myCmds = Commands::register(
- ['chks', "use d>.",\&check_shops],
- ['setoff', "use d>.",\&set_off]
- );
- sub plugin_unload {
- Plugins::delHooks($plugin_hooks);
- }
- sub set_off {
- my %self_info = (map => $field->baseName(), x => $char->{pos_to}{x}, y => $char->{pos_to}{y});
- my $stored = nfreeze \%self_info;
- #warning "Sizeof ".length("DEL".$stored)."\n";
- my $full_data = "SOF".$stored;
- #warning "Sending $full_data\n";
- $socket->send(length($full_data).$full_data."\n") or die $!;
- }
- sub check_shops {
- die unless $socket->connected();
- #shutdown($socket, 1) or die $!;
- #return ;
- #$socket->flush();
- #close($socket);
- #shutdown($socket, 1);
- my %self_info = (map => $field->baseName(), x => $char->{pos_to}{x}, y => $char->{pos_to}{y});
- my $stored = nfreeze \%self_info;
- #warning "Sizeof ".length("DEL".$stored)."\n";
- my $full_data = "SOF".$stored;
- #warning "Sending $full_data\n";
- $socket->send(length($full_data).$full_data."\n") or die $!;
- if (@venderListsID == 0) {
- Log::warning "Called check shops with no vender around ".$char->{pos_to}{x}." ".$char->{pos_to}{y}."\n";
- }
- for (my $i = 0; $i < @venderListsID; $i++) { # borrow mercDB algorythm until we find a better solution for unknown venders.
- next if (!$venderListsID[$i]);
- my $vender_actor = Actor::get($venderListsID[$i]);
- next unless ($vender_actor->{'pos_to'}{'x'} && $vender_actor->{'pos_to'}{'y'});
- next unless (timeOut($venderLists{$venderListsID[$i]}{'accessTime'}, 10));
- # Log::warning "Sending entering vender \n";
- $venderLists{$venderListsID[$i]}{'accessTime'} = time;
- $messageSender->sendEnteringVender($venderListsID[$i]); # request shop info. then we should receive packet_vender_store2 soon.
- }
- }
- sub hook_found_vender {
- #my (undef, $args) = @_;
- #my $vendor = Actor::get($args->{ID});
- #$messageSender->sendEnteringVender($vendor->{ID});
- }
- sub hook_shop_info {
- my (undef, $args) = @_;
- die unless $socket->connected();
- # built-in shopper support.
- # storeList(undef, $args);
- #my %shop;
- my $vender_id = unpack("V",$args->{venderID});
- my $vender_actor = Actor::get($args->{venderID});
- $shop{pos}{x} = $shop{actor}->{'pos_to'}{'x'};
- $shop{pos}{y} = $shop{actor}->{'pos_to'}{'y'};
- my $vender_name = $vender_actor->name;
- my $vender_shop_name = $venderLists{$args->{venderID}}{'title'};
- return if !$vender_actor->{'pos_to'}{'x'};
- return if !$vender_actor->{'pos_to'}{'y'};
- #warning $vender_id." | ".$vender_shop_name."\n";
- my %store = (
- title => $venderLists{$args->{venderID}}{'title'} || "Loja sem nome",
- vender_id => unpack("V",$args->{venderID}),
- vender_name => $vender_actor->name,
- location => { map => $field->baseName(), x => $vender_actor->{'pos_to'}{'x'}, y => $vender_actor->{'pos_to'}{'y'} }
- );
- for (my $i = 0; $i <= $#{$args->{itemList}}; $i++) {
- next if (!$args->{itemList}[$i]{nameID});
- my $item = $args->{itemList}[$i];
- @{$item->{cards_split}} = &core_cards_split($item->{cards});
- delete $item->{cards};
- #$item->{full_name} = itemName($item);
- $item->{full_name} = $item->{name};
- my $string = sprintf("%s %s %s %s %s %s\n", itemName($item), $item->{price}, $item->{amount}, $item->{type}, $item->{id}, $item->{upgrade});
- #warning sprintf("%s %s %s %s %s %s\n", itemName($item), $item->{price}, $item->{amount}, $item->{type}, $item->{id}, $item->{upgrade});
- push (@{$store{items}}, $item);
- }
- my $stored = nfreeze \%store;
- #warning "Sizeof ".length($stored)."\n";
- my $full_data = "ADD".$stored;
- $socket->send(length($full_data).$full_data."\n") or die $!;
- # data to send to a server
- #my $req = 'hello world';
- #my $size = $socket->send($req);
- # notify server that request has been sent
- #shutdown($socket, 1);
- }
- sub core_cards_split { # split card data info. should be 8b
- my $core_cards_data = shift;
- my @ret_array;
- if (length($core_cards_data) != 8) { die "Error in function core_cards_split: core_cards_data should be 8bytes \n"; }
- for (my $i_c = 0; $i_c < length($core_cards_data); $i_c += 2) {
- push (@ret_array, unpack("s", substr($core_cards_data, $i_c, $i_c + 2)));
- }
- return @ret_array;
- }
- sub storeList {
- my ($packet, $args) = @_;
- my $venderID = $args->{venderID};
- my $price = $args->{price};
- my $name = $args->{name};
- my $number = $args->{number};
- my $amount = $args->{amount};
- my $prefix = "shopper_";
- my $i = 0;
- while (exists $config{$prefix.$i}) {
- my $maxPrice = $config{$prefix.$i."_maxPrice"};
- my $maxAmount = $config{$prefix.$i."_maxAmount"};
- my $invIndex = main::findIndexString_lc($char->{'inventory'}, "name", $config{$prefix.$i});
- my $item = $char->{'inventory'}[$invIndex];
- # message "checking ".lc($name)." against ".lc($config{$prefix.$i})."\n";
- if (lc($name) eq lc($config{$prefix.$i})) {
- warning "$name found!!!\n";
- message "Info: $price $name $number $amount \n";
- if (main::checkSelfCondition($prefix.$i) &&
- ($price <= $maxPrice) &&
- (lc($name) eq lc($config{$prefix.$i}))
- )
- {
- if ($amount >= $maxAmount) {
- message "$name found!!! Buying it for $price (max price: $maxPrice).\n";
- $messageSender->sendBuyBulkVender($venderID, [{itemIndex => $number, amount => $maxAmount}], $venderCID);
- configModify($prefix.$i."_disabled", 1);
- } else {
- message "$name found ($amount of $maxAmount)!!! Buying it for $price (max price: $maxPrice).\n";
- $messageSender->sendBuyBulkVender($venderID, [{itemIndex => $number, amount => $amount}], $venderCID);
- configModify($prefix.$i."_maxAmount", ($maxAmount - $amount));
- }
- }
- }
- $i++;
- }
- }
- 1;
Advertisement
Add Comment
Please, Sign In to add comment