PenUltima Online Forum Index Official Core: 096.7
Official Core: 097 2008-02-26
Donate towards the POL web hosting bill!
 POL Home   FAQ   Search    Memberlist   Usergroups    Register    Profile   Log in to check your private messages   Log in
Player Vendors!

 
Post new topic   Reply to topic    PenUltima Online Forum Index -> General Help (095)
Display posts from previous:   

Author Message
StrelOK



Joined: 28 Dec 2006
Posts: 15
Location: Russia

PostPosted: Thu Dec 28, 2006 9:29 pm    Post subject: Player Vendors! Reply with quote

All greetings!
At me a problem with player vendors, they sell things only to the owners! How it to correct?

Author Message
lokaum



Joined: 25 Dec 2006
Posts: 29

PostPosted: Thu Dec 28, 2006 10:18 pm    Post subject: Reply with quote

can show the script?

Author Message
StrelOK



Joined: 28 Dec 2006
Posts: 15
Location: Russia

PostPosted: Fri Dec 29, 2006 9:15 am    Post subject: Reply with quote

Here the script, is a default! чё in it to correct it is necessary that normally worked?

Code:
use npc;
use basic;
use os;
use uo;
use util;

include "util/bank";
include "include/attributes";
include "include/eventID";
include "include/sysEvent";
include "include/randName";
include "include/vetement";
include "include/utility";
include "include/mrcSpawn";
include "include/dist";
include "include/client";
include "include/NPCBackpacks";
include "include/yesNo";
include "include/canAccess";

const UOBJ_GOLD_COIN := 0xeed;
const STARTHAIR := 0x2030;
const ENDHAIR := 0x2060;

set_priority( 50 );

var inv_fs, inv_pb;
var me := Self();
var master := CInt(GetObjProperty(me, "master"));
var cont := GetObjProperty(me, "cont");
var firstname;

set_critical(1);
  var vendors := GetGlobalProperty("pcvendors");
  if(!vendors)
    vendors := {};
  endif
  if(me.serial in vendors)
  else
   vendors.append(me.serial);
  endif
  SetGlobalProperty("pcvendors", vendors);
set_critical(0);

program merchant()
  Detach();
  run_script_to_completion("NPCKeeper", me);
  start_script(":playervendor:payCounter", me);
  var nme := SplitWords(me.name);
  firstname := lower(nme[1]);
  var oldpack := me.backpack;
  if(oldpack.objtype != 0x966c)
    MoveItemToLocation(oldpack, 5851, 1161, 0, MOVEITEM_FORCELOCATION);
    var newpack := CreateItemAtLocation(5851, 1162, 0, 0x966c, 1);
    EquipItem(me, newpack);
    foreach thing in ListRootItemsInContainer(oldpack)
      MoveItemToContainer(thing, newpack);
    endforeach
    DestroyItem(oldpack);
  endif
  inv_pb := find_or_create_in_pack(me.serial + " PB", 0xe75);
  inv_fs := find_or_create_in_pack(me.serial + " 1C", 0xe75);
  SetObjProperty(inv_pb, "Vendor", me.serial);
  SetObjProperty(inv_fs, "Vendor", me.serial);
  SetObjProperty(inv_pb, "Vendored", me.serial);
  SetObjProperty(inv_fs, "Vendored", me.serial);
  SetObjProperty(inv_pb, "Master", master);
  SetObjProperty(inv_fs, "Master", master);
  if(!inv_fs || !inv_pb || !inv_fs)
    exit;
  endif
  SetObjProperty(me,"serial", me.serial);
  EnableEvents( SYSEVENT_ITEM_GIVEN + SYSEVENT_MERCHANT_SOLD + SYSEVENT_DOUBLECLICKED);
  EnableEvents( SYSEVENT_SPEECH, 4);
  var res;
  var ev;
  var text;
  while(1)
    ev := os::wait_for_event(120);
    if(ev)
      var who := ev.source;
      case (ev.type)
       SYSEVENT_DOUBLECLICKED: if(CheckLineOfSight(me, who))
                                  SendOpenSpecialContainer(who, inv_fs);
                                else
                                  SendSysMessage(who, "You cannot see that.");
                                endif
        SYSEVENT_SPEECH:        text := lower(ev.text);
                                if((text[firstname] and text["buy"]) or (text["vendor"] and text["buy"]))
                                  TurnToward(who);
                                  if(!CheckLineOfSight(me, who))
                                    PrintTextAbovePrivate(me, "Who is speaking? I cannot see you.", who);
                                  else
                                    process_sale(ev.source);
                                  endif
                                elseif((text[firstname] and text["purchase"]) or (text["vendor"] and text["purchase"]))
                                  if(who.serial == master)
                                    addthingstobuy(who);
                                  endif
                                elseif(((text[firstname]) && (text["dismiss"])) and (ev.source.serial == master))
                                  TurnToward(who);
                                  if(YesNo(who, "Fire him?"))
                                    Fireme();
                                  endif
                                elseif((text[firstname] and text["sell"]) or (text["vendor"] and text["sell"]))
                                  TurnToward(who);
                                  SpoutBuyList(who);
                                elseif((text[firstname] and text["contact"]) or (text["vendor"] and text["contact"]))
                                  TurnToward(who);
                                  if(who.serial == master)
                                    cont := recontact(who);
                                    SetObjProperty(me, "cont", cont);
                                  else
                                    PrintTextAbovePrivate(me, "You may contact my employer " + cont, who);
                                  endif
                                elseif(((text[firstname] and text["collect"]) or (text["vendor"] and text["collect"])) && (who.serial == master))
                                  TurnToward(who);
                                  cashout(who);
                                elseif(((text[firstname] and text["gold"]) or (text["vendor"] and text["gold"])) && (who.serial == master))
                                  TurnToward(who);
                                  cashout(who);
                                elseif(((text[firstname] and text["status"]) or (text["vendor"] and text["status"])) && (who.serial == master))
                                  TurnToward(who);
                                  statuscheck(who);
                                elseif(((text[firstname] and text["info"]) or (text["vendor"] and text["info"])) && (who.serial == master))
                                  TurnToward(who);
                                  statuscheck(who);
                                elseif(((text[firstname] and text["wear"]) or (text["vendor"] and text["wear"])) && (who.serial == master))
                                  TurnToward(who);
                                  PrintTextAbovePrivate(me, "What shall I wear?", who);
                                  var this := Target(who);
                                  if (!can_access(ev.source, this))
                                    PrintTextAbovePrivate(me, "I don't see what you are talking about.", ev.source);
                                  elseif (this in ListEquippedItems(ev.source))
                                    PrintTextAbovePrivate(me, "Please take that off, first!", ev.source);
                                  else
                                    if (Distance(me, this) < 3)
                                      wear_item( this);
                                    else
                                      PrintTextAbovePrivate(me, "That is too far away.", ev.source);
                                    endif
                                  endif
                                elseif(((text[firstname] and text["strip"]) or (text["vendor"] and text["strip"])) && (who.serial == master))
                                  TurnToward( who );
                                  PrintTextAbovePrivate(me, "Ooh, I think I feel a draft!", who);
                                  strip_items(who);
                                elseif((text[firstname] and text["help"]) or (text["vendor"] and text["help"]))
                                  TurnToward( who );
                                  PrintTextAbovePrivate(me, "I will obey the following orders:", who);
                                  sleep(1);
                                  PrintTextAbovePrivate(me, "dismiss, sell, contact, collect,", who);
                                  sleep(2);
                                  PrintTextAbovePrivate(me, "wear, strip, status and purchase", who);
                                endif
        SYSEVENT_ITEM_GIVEN:    if(who.serial == master)
                                  SetObjProperty(ev.container, "Hold", 1);
                                  stockitem(ev);
                                  EraseObjProperty(ev.container, "Hold");
                                else
                                  buyitem(who, ev.item);
                                endif
      endcase
      sleep(1);
    endif
    if(GetObjProperty(me,"deadbeat"))
      Fireme();
    endif
  endwhile
endprogram

function clearance(who, items)
  foreach trg in items
    trg.name := GetObjProperty(trg,"OldName");
    EraseObjProperty(trg, "OldName");
    EraseObjProperty(trg, "Vendored");
    EraseObjProperty(trg, "price");
    EraseObjProperty(trg, "Owner");
    EraseObjProperty(trg, "Master");
    if(trg.isA(POLCLASS_CONTAINER))
      SetObjProperty(trg, "Owner", who.serial);
    endif
  endforeach
endfunction

function statuscheck(who);
  var gold := CInt(GetObjProperty(me, "g"));
  var rsrv := CInt(GetObjProperty(me, "r"));
  var fees := 0;
  var mypay := 50;
  foreach item in inv_fs
    fees := fees + GetObjProperty(item,"price");
  endforeach
  mypay := mypay + Cint(fees / 100);
  var gamedays := (gold + rsrv) / mypay;
  var realdays := gamedays / 8;
  PrintTextAbovePrivate(me, "I am holding " + gold + " gold coins for you.", who);
  sleep(1);
  PrintTextAbovePrivate(me, "and am holding " + rsrv + " gold coins for future wages.", who);
  sleep(1);
  if(realdays == 1)
    PrintTextAbovePrivate(me, "I have enough gold to continue working for " + gamedays + " day. [1 real world day]", who);
  else
    PrintTextAbovePrivate(me, "I have enough gold to continue working for " + gamedays + " days. [" + realdays + " real world days]", who);
  endif
endfunction

function process_sale(who);
  var gold := GetObjProperty(me,"g");
  if(Distance(me, who) > 3)
    PrintTextAbovePrivate(me, "You must come closer if you wish to purchase something.", who);
    return;
  endif
  PrintTextAbovePrivate(me, "What do you wish to purchase?", who);
  var trg := Target(who);
  if(!trg)
    SendSysMessage(who,"cancelled");
    return;
  endif
  var ok := 0;
  foreach item in EnumerateItemsInContainer(inv_fs)
    if(trg == item)
      ok := 1;
      break;
    endif
  endforeach
  if(ok == 0)
    PrintTextAbovePrivate(me, "You cannot purchase that", who);
    return;
  elseif(ok == 1)
    var bankbox := FindBankBox(who);
    var price := CInt(GetObjProperty(trg, "price"));
    if((!price) || (price == error))
      PrintTextAbovePrivate(me, "Im sorry, but that is not for sale.", who);
      return;
    endif
    var holder := {};
    set_critical(1);
    if(GetPayment(who, price))
      trg.movable:=1;
      if(MoveItemToContainer(trg, who.backpack))
        PrintTextAbovePrivate(me,"I have withdrawn " + price + " gold from your backpack.", who);
        SetObjProperty(me,"g", (price + gold));
        holder.append(trg);
        if(trg.isA(POLCLASS_CONTAINER))
          foreach thing in EnumerateItemsInContainer(trg)
            holder.append(thing);
          endforeach
        endif
        clearance(who, holder);
      else
        PrintTextAbovePrivate(me,"You do not have enough room for that in your backpack", who);
        GiveRefund(who, price);
      endif
    else
      var contents := EnumerateItemsInContainer(bankbox);
      var amt := 0;
      foreach item in contents
        if((item.objtype == 0xeed) && (item.amount >= price))
          amt := item;
          break;
        endif
      endforeach
      if(amt != 0)
        if(SubtractAmount(amt, price))
          if(MoveItemToContainer(trg, who.backpack))
            PrintTextAbovePrivate(me,"I have withdrawn " + price + " gold from your bank account.", who);
            SetObjProperty(me,"g", (price + gold));
            holder.append(trg);
            if(trg.isA(POLCLASS_CONTAINER))
              foreach thing in EnumerateItemsInContainer(trg)
                holder.append(thing);
              endforeach
            endif
            clearance(who, holder);
          else
            PrintTextAbovePrivate(me,"You do not have enough room for that in your backpack", who);
            AddAmount(amt, price);
          endif
        endif
      else
        PrintTextAbovePrivate(me,"You cannot afford this item.", who);
      endif
    endif
    set_critical(0);
  endif
endfunction

function stockitem(tev)
  if((tev.item.objtype == UOBJ_GOLD_COIN) and (!tev.container))
    TakeGold(tev);
    return;
  endif
  var tname;
  var item := tev.item;
  SetObjProperty(item, "OldName", item.name);
  PrintTextAbovePrivate(me, "How much shall I charge for this item? ", tev.source);
  var cost := CInt(RequestInput(tev.source, item, ""));
  if(cost < 0)
    PrintTextAbovePrivate(me, "You cannot sell items for values below zero", tev.source);
    EraseObjProperty(item, "Master");
    EraseObjProperty(item, "price");
    EraseObjProperty(item, "OldName");
    EraseObjProperty(item, "Vendored");
    item.movable := 1;
    MoveItemToContainer(item, tev.source.backpack);
    return;
  elseif(cost > 60000)
    PrintTextAbovePrivate(me, "You cannot price items for more than 60000 gold.", tev.source);
    if(item.isa(POLCLASS_CONTAINER))
      foreach thing in EnumerateItemsInContainer(item)
        thing.name := GetObjProperty(thing,"OldName");
        EraseObjProperty(thing, "OldName");
        EraseObjProperty(thing, "Vendored");
        EraseObjProperty(thing, "price");
        thing.movable := 1;
      endforeach
    endif
    EraseObjProperty(item, "Master");
    EraseObjProperty(item, "price");
    EraseObjProperty(item, "OldName");
    EraseObjProperty(item, "Vendored");
    item.movable := 1;
    MoveItemToContainer(item, tev.source.backpack);
    return;
  elseif(cost == 0)
    if(item.isa(POLCLASS_CONTAINER))
      if((item.objtype == 0x1940) || (item.objtype == 0xefa) || (item.objtype == 0x6100))
        PrintTextAbovePrivate(me, "You cannot sell that item for 0 gold.", tev.source);
        if(item.isa(POLCLASS_CONTAINER))
          foreach thing in EnumerateItemsInContainer(item)
            thing.name := GetObjProperty(thing,"OldName");
            EraseObjProperty(thing, "OldName");
            EraseObjProperty(thing, "Vendored");
            EraseObjProperty(thing, "price");
            thing.movable := 1;
          endforeach
        endif
        EraseObjProperty(item, "Master");
        EraseObjProperty(item, "price");
        EraseObjProperty(item, "OldName");
        EraseObjProperty(item, "Vendored");
        item.movable := 1;
        MoveItemToContainer(item, tev.source.backpack);
        return;
      else
        var items := 0;
        foreach thing in EnumerateItemsInContainer(item)
          items := 1;
          break;
        endforeach
        if(items == 1)
          PrintTextAbovePrivate(me, "Well, just keep it, then", tev.source);
          if(item.isa(POLCLASS_CONTAINER))
            foreach thing in EnumerateItemsInContainer(item)
              thing.name := GetObjProperty(thing,"OldName");
              EraseObjProperty(thing, "OldName");
              EraseObjProperty(thing, "Vendored");
              EraseObjProperty(thing, "price");
              thing.movable := 1;
            endforeach
          endif
          EraseObjProperty(item, "Master");
          EraseObjProperty(item, "price");
          EraseObjProperty(item, "OldName");
          EraseObjProperty(item, "Vendored");
          item.movable := 1;
          MoveItemToContainer(item, tev.source.backpack);
          return;
        endif
        PrintTextAbovePrivate(me, "How shall I advertise this item?", tev.source);
        tname := RequestInput(tev.source, item, "");
        SetObjProperty(item, "price", "Not For Sale");
        cost := "Not For Sale";
      endif
    else
      PrintTextAbovePrivate(me, "Well, just keep it, then", tev.source);
      if(item.isa(POLCLASS_CONTAINER))
        foreach thing in EnumerateItemsInContainer(item)
          thing.name := GetObjProperty(thing,"OldName");
          EraseObjProperty(thing, "OldName");
          EraseObjProperty(thing, "Vendored");
          EraseObjProperty(thing, "price");
          thing.movable := 1;
        endforeach
      endif
      EraseObjProperty(item, "Master");
      EraseObjProperty(item, "price");
      EraseObjProperty(item, "OldName");
      EraseObjProperty(item, "Vendored");
      item.movable := 1;
      MoveItemToContainer(item, tev.source.backpack);
      return;
    endif
  endif
  if(item.isa(POLCLASS_CONTAINER))
    var theoldname;
    foreach thing in EnumerateItemsInContainer(item)
      theoldname := thing.desc;
      if(!item.desc)
        theoldname := "";
      endif
      SetName(thing, thing.desc + " [Cost: Not For Sale]");
      SetObjProperty(thing, "OldName", theoldname);
      SetObjProperty(thing, "Vendored", me.serial);
      SetObjProperty(thing, "price", "Not For Sale");
      thing.movable := 1;
    endforeach
    SetObjProperty(item, "Master", master);
    item.movable := 1;
  endif
  var oldname := item.desc;
  if(!item.desc)
    oldname := "";
  endif
  SetObjProperty(item, "OldName", oldname);
  SetObjProperty(item, "price", CInt(cost));
  SetObjProperty(item, "Vendored", me.serial);
  if(tname)
    SetName(item, tname + " [Cost: " + cost + " ]");
  else
    SetName(item, item.desc + " [Cost: " + cost + " ]");
  endif
  if(!tev.vendor)
    MoveItemToContainer(item, inv_fs);
  endif
  if(cost == "Not For Sale")
    PrintTextAbovePrivate(me, "I'll just hang on to that for ya.", tev.source);
  else
    PrintTextAbovePrivate(me, "I will sell that for " + cost + " gold.", tev.source);
  endif
endfunction

function cashout(person)
  var mygold := CInt(GetObjProperty(me, "g"));
  var payment := 0;
  var rsrv := GetObjProperty(me,"r");
  var pbank := FindBankBox(person);
  if(mygold > 0)
    while(mygold > 60000)
      CreateItemInContainer(pbank, UOBJ_GOLD_COIN, 60000);
      payment := payment + 60000;
      mygold := mygold - 60000;
    endwhile
    payment := payment + mygold;
    PrintTextAbovePrivate(me, "Ive placed " + payment + " gold coins in your bank box.", person);
    CreateItemInContainer(pbank, UOBJ_GOLD_COIN, mygold);
    SetObjProperty(me, "g", 0);
  else
    PrintTextAbovePrivate(me, "I am not holding any gold for you.", person);
  endif
  if(rsrv)
    PrintTextAbovePrivate(me, "You have left me " + rsrv + " reserve gold coins to use towards my future wages.", person);
  else
    PrintTextAbovePrivate(me, "but you have left me nothing towards my future wages.", person);
  endif
endfunction

function recontact(who)
  var cnt := SendTextEntryGump( who, "How shall I tell people to contact you? ", TE_CANCEL_DISABLE, TE_STYLE_NORMAL, 50);
  return cnt;
endfunction

function wear_item(item)
  foreach thing in ListEquippedItems(me)
    MoveItemToContainer(thing, inv_pb);
  endforeach
  EquipItem(me, item);
  foreach thingie in EnumerateItemsInContainer(inv_pb)
    EquipItem(me, thingie);
  endforeach
  foreach thingie in EnumerateItemsInContainer(inv_pb)
    MoveItemToLocation(thingie, me.x, me.y, me.z, MOVEITEM_FORCELOCATION );
  endforeach
endfunction

function strip_items(mmaster)
  foreach thing in ListEquippedItems(me)
    if ((thing.objtype < STARTHAIR) || (thing.objtype > ENDHAIR))
      MoveItemToContainer(thing, inv_pb);
    endif
  endforeach
  foreach thing in EnumerateItemsInContainer(inv_fs)
    if (thing.container.serial == inv_fs.serial)
      MoveItemToContainer(thing, inv_pb);
    endif
  endforeach
  foreach thingie in EnumerateItemsInContainer(inv_pb)
    if (thingie.container.serial == inv_pb.serial)
      MoveItemToContainer(thingie, mmaster.backpack);
    endif
  endforeach
endfunction

function Fireme()
  var mypack := findmypack(me.serial);
  var mygold := CInt(GetObjProperty(me, "g"));
  var payment := 0;
  if(mygold > 0)
    while(mygold > 60000)
      CreateItemInContainer(mypack, UOBJ_GOLD_COIN, 60000);
      payment := payment + 60000;
      mygold := mygold - 60000;
    endwhile
    CreateItemInContainer(mypack, UOBJ_GOLD_COIN, mygold);
  endif
  foreach thing in ListRootItemsInContainer(inv_fs)
    MoveItemToContainer(thing, mypack);
  endforeach
  foreach thingy in ListRootItemsInContainer(inv_pb)
    MoveItemToContainer(thingy, mypack);
  endforeach
  RevokePrivilege( me, "invul" );
  say("I regret nothing!");
  ApplyRawDamage( me, GetHp(me) +3);
endfunction

function addthingstobuy(who)
    var buylist := {};
    var buyprice := { };
    var buyobj := { };
    var i;
    if (!GetObjProperty(me,"buylist"))
        buylist := {};
        buyprice := {};
        buyobj := { };
    else
        buylist := GetObjProperty(me,"buylist");
        buyprice := GetObjProperty(me,"buyprice");
        buyobj := GetObjProperty(me,"buyobj");
    endif
    PrintTextAbovePrivate(me, "What do you want me to buy?", who);
    var what := Target( master );
        if ((!what) || (what == error) || (GetStrength(what)) )
        PrintTextAbovePrivate(me, "Nevermind", who);
        return;
        endif
    if (what.desc in buylist)
        PrintTextAbovePrivate(me, "I will no longer purchase "+what.desc, who);
        var newbuylist := { };
        var newbuyprice := { };
        var newbuyobj := { };
        for (i := 1; i<=len(buylist); i:=i+1)
            if (buylist[i] != what.desc)
                newbuylist[len(newbuylist)+1] := buylist[i];
                newbuyprice[len(newbuyprice)+1] := buyprice[i];
                newbuyobj[len(newbuyobj)+1] := buyobj[i];
            endif
        endfor
        SetObjProperty(me,"buylist",newbuylist);
        SetObjProperty(me,"buyprice",newbuyprice);
        SetObjProperty(me,"buyobj",newbuyobj);
        return;
    endif
    if (!what.objtype)
        PrintTextAbovePrivate(me, "I can't buy those.  What the hell is that, anyway?", who);
        return;
    endif
    buylist[ len(buylist)+1] := what.desc;
    buyprice[ len(buyprice)+1] := CInt(SendTextEntryGump( master,"How much shall I pay for this item? ", TE_CANCEL_ENABLE, TE_STYLE_NORMAL));
    buyobj[ len(buyobj)+1] := what.objtype;
    if (len(buylist)==1)
      PrintTextAbovePrivate(me, "I will purchase "+buylist[1], master);
    elseif (len(buylist)==2)
        PrintTextAbovePrivate(me, "I will purchase "+buylist[1] +" and "+ buylist[2], master);
    else
        var buying := "I will purchase "+buylist[1];
        for (i := 2; i<=len(buylist)-1; i:=i+1)
            buying := buying + ", " +buylist[i];
        endfor
        buying := buying + " and " + buylist[len(buylist)];
        PrintTextAbovePrivate(me, buying, master);
    endif
    SetObjProperty(me,"buylist",buylist);
    SetObjProperty(me,"buyprice",buyprice);
    SetObjProperty(me,"buyobj",buyobj);
endfunction

function SpoutBuyList(you)
  var buylist := {};
  var buyprice := {};
  var i;
  if (!GetObjProperty(me,"buylist"))
    PrintTextAbovePrivate(me, "I don't buy anything.", you);
    return;
  else
    buylist := GetObjProperty(me,"buylist");
    buyprice := GetObjProperty(me,"buyprice");
  endif
  for (i := 1; i<=len(buylist); i:=i+1)
    PrintTextAbovePrivate(me, "I'll pay "+ buyprice[i] + " for " + buylist[i], you);
    sleep(2);
  endfor
  PrintTextAbovePrivate(me, "Just hand me what you want me to buy.", you);
endfunction

function buyitem(you, it)
    var mypack := findmypack(me.serial);
    var itsownerserial := CInt(GetObjProperty(it, "ownerserial"));
    if (itsownerserial == CInt(master))
        PrintTextAbovePrivate(me, "I'll see that this is returned to my employer.", you);
        MoveItemToContainer(it,mypack);
        NotifyMaster(you.name + " gave me an item of yours.");
        return;
    endif
    var buylist := {};
    var buyprice := { };
    var buyobj := { };
    var i;
    if (!GetObjProperty(me,"buylist"))
      PrintTextAbovePrivate(me, "I don't buy anything", you);
        MoveItemToContainer(it,you.backpack);
        return;
    else
        buylist := GetObjProperty(me,"buylist");
        buyprice := GetObjProperty(me,"buyprice");
        buyobj := GetObjProperty(me,"buyobj");
    endif
    if (!(it.objtype in buyobj))
      PrintTextAbovePrivate(me, "Ugh, I don't want that.", you);
        MoveItemToContainer(it,you.backpack);
        return;
    endif
    var index := 0;
    for (i := 1; i<=len(buylist); i:=i+1)
        if (it.objtype == buyobj[i])
            index := i;
            break;
        endif
    endfor
    if (!index)
      PrintTextAbovePrivate(me, "Ugh, I don't want that.", you);
        MoveItemToContainer(it,you.backpack);
        return;
    endif
    var mygold := CInt(GetObjProperty(me, "g"));
    if ( (mygold-250) < (buyprice[index]*it.amount))
      PrintTextAbovePrivate(me, "Sorry, I can't afford that right now.", you);
        MoveItemToContainer(it,you.backpack);
        return;
    endif
    var itamount := it.amount;
    var itdesc := it.desc;
    if ( grabitem(it,mypack) )
      PrintTextAbovePrivate(me, "Thank you!  Here's your " + (buyprice[index]*itamount) + " gold.", you);
            CreateItemInContainer(you.backpack, UOBJ_GOLD_COIN, buyprice[index]*itamount );
        NotifyMaster(you.name + " just sold me " + itdesc);
    else
        NotifyMaster("My backpack is full!");
        MoveItemToContainer(it,you.backpack);
        return;
    endif
    var theprice := buyprice[index]*itamount;
    var mypay := CInt(GetObjProperty(me,"mypay"));
    var commission := CInt( 0.05 * theprice);
    mygold := mygold - theprice;
    mypay := mypay + commission;
    if (mygold >= mypay)
        mypay := 0;
        mygold := mygold - mypay;
    else
        mypay := mypay - mygold;
        mygold := 0;
    endif
    SetObjProperty(me, "mypay",mypay);
    SetObjProperty(me, "g", mygold);
endfunction

function NotifyMaster(themessage)
    foreach onlinechr in EnumerateOnlineCharacters()
        if (onlinechr.serial == master)
        SendSysMessage(onlinechr, me.name + " : " + themessage);
        break;
        endif
    endforeach
endfunction

function TakeGold(ev)
    var goldamount := ev.item.amount;
    var mygold := CInt(GetObjProperty(me, "r"));
    if(goldamount)
      mygold := mygold + goldamount;
      var totalgold := CInt(GetObjProperty(me,"g")) + mygold;
      PrintTextAbovePrivate(me, "I am holding " + totalgold + " gold for you.", ev.source);
    endif
    SetObjProperty(me, "r", mygold);
    DestroyItem(ev.item);
endfunction

function grabitem(it,mypack)
  var mystuff := EnumerateItemsInContainer(mypack);
  if (it.amount > 1 )
    foreach item in mystuff
      if (item.objtype == it.objtype)
        if (CreateItemInContainer( mypack, it.objtype, it.amount ))
          DestroyItem(it);
          return 1;
        else
          return 0;
        endif
      endif
    endforeach
  else
    foreach item in mystuff
      if ((item.objtype == it.objtype) && (item.amount > 1 ))
        if ( CreateItemInContainer( mypack, it.objtype, it.amount ) )
          DestroyItem(it);
          return 1;
        else
          return 0;
        endif
      endif
    endforeach
  endif
  if (MoveItemToContainer(it,mypack))
    return 1;
  else
    return 0;
  endif
endfunction

function GetPayment(player, price)
  var backpack := EnumerateItemsInContainer(player.backpack);
  var a := 0;
  foreach item in backpack
    if ((item.objtype == 0xeed) && (item.amount >= price) )
      if(SubtractAmount(item, price))
        a := 1;
        break;
      endif
    endif
  endforeach
  if(a == 1)
    return 1;
  else
    return 0;
  endif
endfunction

function Giverefund(who, price)
  CreateItemInContainer(who.backpack, 0xeed, price);
endfunction

function find_or_create_in_pack(name, objtype);
  var mypack := me.backpack;
  var check := 0;
  foreach thing in ListRootItemsInContainer(mypack)
    if(thing.name == name)
      check := thing;
      break;
    endif
  endforeach
  if(check == 0)
    check := CreateItemInContainer(mypack, objtype, 1);
    SetName(check, name);
  endif
  return check;
endfunction

Author Message
StrelOK



Joined: 28 Dec 2006
Posts: 15
Location: Russia

PostPosted: Fri Dec 29, 2006 9:15 am    Post subject: Reply with quote

Here the script, is a default! чё in it to correct it is necessary that normally worked?

Code:
use npc;
use basic;
use os;
use uo;
use util;

include "util/bank";
include "include/attributes";
include "include/eventID";
include "include/sysEvent";
include "include/randName";
include "include/vetement";
include "include/utility";
include "include/mrcSpawn";
include "include/dist";
include "include/client";
include "include/NPCBackpacks";
include "include/yesNo";
include "include/canAccess";

const UOBJ_GOLD_COIN := 0xeed;
const STARTHAIR := 0x2030;
const ENDHAIR := 0x2060;

set_priority( 50 );

var inv_fs, inv_pb;
var me := Self();
var master := CInt(GetObjProperty(me, "master"));
var cont := GetObjProperty(me, "cont");
var firstname;

set_critical(1);
  var vendors := GetGlobalProperty("pcvendors");
  if(!vendors)
    vendors := {};
  endif
  if(me.serial in vendors)
  else
   vendors.append(me.serial);
  endif
  SetGlobalProperty("pcvendors", vendors);
set_critical(0);

program merchant()
  Detach();
  run_script_to_completion("NPCKeeper", me);
  start_script(":playervendor:payCounter", me);
  var nme := SplitWords(me.name);
  firstname := lower(nme[1]);
  var oldpack := me.backpack;
  if(oldpack.objtype != 0x966c)
    MoveItemToLocation(oldpack, 5851, 1161, 0, MOVEITEM_FORCELOCATION);
    var newpack := CreateItemAtLocation(5851, 1162, 0, 0x966c, 1);
    EquipItem(me, newpack);
    foreach thing in ListRootItemsInContainer(oldpack)
      MoveItemToContainer(thing, newpack);
    endforeach
    DestroyItem(oldpack);
  endif
  inv_pb := find_or_create_in_pack(me.serial + " PB", 0xe75);
  inv_fs := find_or_create_in_pack(me.serial + " 1C", 0xe75);
  SetObjProperty(inv_pb, "Vendor", me.serial);
  SetObjProperty(inv_fs, "Vendor", me.serial);
  SetObjProperty(inv_pb, "Vendored", me.serial);
  SetObjProperty(inv_fs, "Vendored", me.serial);
  SetObjProperty(inv_pb, "Master", master);
  SetObjProperty(inv_fs, "Master", master);
  if(!inv_fs || !inv_pb || !inv_fs)
    exit;
  endif
  SetObjProperty(me,"serial", me.serial);
  EnableEvents( SYSEVENT_ITEM_GIVEN + SYSEVENT_MERCHANT_SOLD + SYSEVENT_DOUBLECLICKED);
  EnableEvents( SYSEVENT_SPEECH, 4);
  var res;
  var ev;
  var text;
  while(1)
    ev := os::wait_for_event(120);
    if(ev)
      var who := ev.source;
      case (ev.type)
       SYSEVENT_DOUBLECLICKED: if(CheckLineOfSight(me, who))
                                  SendOpenSpecialContainer(who, inv_fs);
                                else
                                  SendSysMessage(who, "You cannot see that.");
                                endif
        SYSEVENT_SPEECH:        text := lower(ev.text);
                                if((text[firstname] and text["buy"]) or (text["vendor"] and text["buy"]))
                                  TurnToward(who);
                                  if(!CheckLineOfSight(me, who))
                                    PrintTextAbovePrivate(me, "Who is speaking? I cannot see you.", who);
                                  else
                                    process_sale(ev.source);
                                  endif
                                elseif((text[firstname] and text["purchase"]) or (text["vendor"] and text["purchase"]))
                                  if(who.serial == master)
                                    addthingstobuy(who);
                                  endif
                                elseif(((text[firstname]) && (text["dismiss"])) and (ev.source.serial == master))
                                  TurnToward(who);
                                  if(YesNo(who, "Fire him?"))
                                    Fireme();
                                  endif
                                elseif((text[firstname] and text["sell"]) or (text["vendor"] and text["sell"]))
                                  TurnToward(who);
                                  SpoutBuyList(who);
                                elseif((text[firstname] and text["contact"]) or (text["vendor"] and text["contact"]))
                                  TurnToward(who);
                                  if(who.serial == master)
                                    cont := recontact(who);
                                    SetObjProperty(me, "cont", cont);
                                  else
                                    PrintTextAbovePrivate(me, "You may contact my employer " + cont, who);
                                  endif
                                elseif(((text[firstname] and text["collect"]) or (text["vendor"] and text["collect"])) && (who.serial == master))
                                  TurnToward(who);
                                  cashout(who);
                                elseif(((text[firstname] and text["gold"]) or (text["vendor"] and text["gold"])) && (who.serial == master))
                                  TurnToward(who);
                                  cashout(who);
                                elseif(((text[firstname] and text["status"]) or (text["vendor"] and text["status"])) && (who.serial == master))
                                  TurnToward(who);
                                  statuscheck(who);
                                elseif(((text[firstname] and text["info"]) or (text["vendor"] and text["info"])) && (who.serial == master))
                                  TurnToward(who);
                                  statuscheck(who);
                                elseif(((text[firstname] and text["wear"]) or (text["vendor"] and text["wear"])) && (who.serial == master))
                                  TurnToward(who);
                                  PrintTextAbovePrivate(me, "What shall I wear?", who);
                                  var this := Target(who);
                                  if (!can_access(ev.source, this))
                                    PrintTextAbovePrivate(me, "I don't see what you are talking about.", ev.source);
                                  elseif (this in ListEquippedItems(ev.source))
                                    PrintTextAbovePrivate(me, "Please take that off, first!", ev.source);
                                  else
                                    if (Distance(me, this) < 3)
                                      wear_item( this);
                                    else
                                      PrintTextAbovePrivate(me, "That is too far away.", ev.source);
                                    endif
                                  endif
                                elseif(((text[firstname] and text["strip"]) or (text["vendor"] and text["strip"])) && (who.serial == master))
                                  TurnToward( who );
                                  PrintTextAbovePrivate(me, "Ooh, I think I feel a draft!", who);
                                  strip_items(who);
                                elseif((text[firstname] and text["help"]) or (text["vendor"] and text["help"]))
                                  TurnToward( who );
                                  PrintTextAbovePrivate(me, "I will obey the following orders:", who);
                                  sleep(1);
                                  PrintTextAbovePrivate(me, "dismiss, sell, contact, collect,", who);
                                  sleep(2);
                                  PrintTextAbovePrivate(me, "wear, strip, status and purchase", who);
                                endif
        SYSEVENT_ITEM_GIVEN:    if(who.serial == master)
                                  SetObjProperty(ev.container, "Hold", 1);
                                  stockitem(ev);
                                  EraseObjProperty(ev.container, "Hold");
                                else
                                  buyitem(who, ev.item);
                                endif
      endcase
      sleep(1);
    endif
    if(GetObjProperty(me,"deadbeat"))
      Fireme();
    endif
  endwhile
endprogram

function clearance(who, items)
  foreach trg in items
    trg.name := GetObjProperty(trg,"OldName");
    EraseObjProperty(trg, "OldName");
    EraseObjProperty(trg, "Vendored");
    EraseObjProperty(trg, "price");
    EraseObjProperty(trg, "Owner");
    EraseObjProperty(trg, "Master");
    if(trg.isA(POLCLASS_CONTAINER))
      SetObjProperty(trg, "Owner", who.serial);
    endif
  endforeach
endfunction

function statuscheck(who);
  var gold := CInt(GetObjProperty(me, "g"));
  var rsrv := CInt(GetObjProperty(me, "r"));
  var fees := 0;
  var mypay := 50;
  foreach item in inv_fs
    fees := fees + GetObjProperty(item,"price");
  endforeach
  mypay := mypay + Cint(fees / 100);
  var gamedays := (gold + rsrv) / mypay;
  var realdays := gamedays / 8;
  PrintTextAbovePrivate(me, "I am holding " + gold + " gold coins for you.", who);
  sleep(1);
  PrintTextAbovePrivate(me, "and am holding " + rsrv + " gold coins for future wages.", who);
  sleep(1);
  if(realdays == 1)
    PrintTextAbovePrivate(me, "I have enough gold to continue working for " + gamedays + " day. [1 real world day]", who);
  else
    PrintTextAbovePrivate(me, "I have enough gold to continue working for " + gamedays + " days. [" + realdays + " real world days]", who);
  endif
endfunction

function process_sale(who);
  var gold := GetObjProperty(me,"g");
  if(Distance(me, who) > 3)
    PrintTextAbovePrivate(me, "You must come closer if you wish to purchase something.", who);
    return;
  endif
  PrintTextAbovePrivate(me, "What do you wish to purchase?", who);
  var trg := Target(who);
  if(!trg)
    SendSysMessage(who,"cancelled");
    return;
  endif
  var ok := 0;
  foreach item in EnumerateItemsInContainer(inv_fs)
    if(trg == item)
      ok := 1;
      break;
    endif
  endforeach
  if(ok == 0)
    PrintTextAbovePrivate(me, "You cannot purchase that", who);
    return;
  elseif(ok == 1)
    var bankbox := FindBankBox(who);
    var price := CInt(GetObjProperty(trg, "price"));
    if((!price) || (price == error))
      PrintTextAbovePrivate(me, "Im sorry, but that is not for sale.", who);
      return;
    endif
    var holder := {};
    set_critical(1);
    if(GetPayment(who, price))
      trg.movable:=1;
      if(MoveItemToContainer(trg, who.backpack))
        PrintTextAbovePrivate(me,"I have withdrawn " + price + " gold from your backpack.", who);
        SetObjProperty(me,"g", (price + gold));
        holder.append(trg);
        if(trg.isA(POLCLASS_CONTAINER))
          foreach thing in EnumerateItemsInContainer(trg)
            holder.append(thing);
          endforeach
        endif
        clearance(who, holder);
      else
        PrintTextAbovePrivate(me,"You do not have enough room for that in your backpack", who);
        GiveRefund(who, price);
      endif
    else
      var contents := EnumerateItemsInContainer(bankbox);
      var amt := 0;
      foreach item in contents
        if((item.objtype == 0xeed) && (item.amount >= price))
          amt := item;
          break;
        endif
      endforeach
      if(amt != 0)
        if(SubtractAmount(amt, price))
          if(MoveItemToContainer(trg, who.backpack))
            PrintTextAbovePrivate(me,"I have withdrawn " + price + " gold from your bank account.", who);
            SetObjProperty(me,"g", (price + gold));
            holder.append(trg);
            if(trg.isA(POLCLASS_CONTAINER))
              foreach thing in EnumerateItemsInContainer(trg)
                holder.append(thing);
              endforeach
            endif
            clearance(who, holder);
          else
            PrintTextAbovePrivate(me,"You do not have enough room for that in your backpack", who);
            AddAmount(amt, price);
          endif
        endif
      else
        PrintTextAbovePrivate(me,"You cannot afford this item.", who);
      endif
    endif
    set_critical(0);
  endif
endfunction

function stockitem(tev)
  if((tev.item.objtype == UOBJ_GOLD_COIN) and (!tev.container))
    TakeGold(tev);
    return;
  endif
  var tname;
  var item := tev.item;
  SetObjProperty(item, "OldName", item.name);
  PrintTextAbovePrivate(me, "How much shall I charge for this item? ", tev.source);
  var cost := CInt(RequestInput(tev.source, item, ""));
  if(cost < 0)
    PrintTextAbovePrivate(me, "You cannot sell items for values below zero", tev.source);
    EraseObjProperty(item, "Master");
    EraseObjProperty(item, "price");
    EraseObjProperty(item, "OldName");
    EraseObjProperty(item, "Vendored");
    item.movable := 1;
    MoveItemToContainer(item, tev.source.backpack);
    return;
  elseif(cost > 60000)
    PrintTextAbovePrivate(me, "You cannot price items for more than 60000 gold.", tev.source);
    if(item.isa(POLCLASS_CONTAINER))
      foreach thing in EnumerateItemsInContainer(item)
        thing.name := GetObjProperty(thing,"OldName");
        EraseObjProperty(thing, "OldName");
        EraseObjProperty(thing, "Vendored");
        EraseObjProperty(thing, "price");
        thing.movable := 1;
      endforeach
    endif
    EraseObjProperty(item, "Master");
    EraseObjProperty(item, "price");
    EraseObjProperty(item, "OldName");
    EraseObjProperty(item, "Vendored");
    item.movable := 1;
    MoveItemToContainer(item, tev.source.backpack);
    return;
  elseif(cost == 0)
    if(item.isa(POLCLASS_CONTAINER))
      if((item.objtype == 0x1940) || (item.objtype == 0xefa) || (item.objtype == 0x6100))
        PrintTextAbovePrivate(me, "You cannot sell that item for 0 gold.", tev.source);
        if(item.isa(POLCLASS_CONTAINER))
          foreach thing in EnumerateItemsInContainer(item)
            thing.name := GetObjProperty(thing,"OldName");
            EraseObjProperty(thing, "OldName");
            EraseObjProperty(thing, "Vendored");
            EraseObjProperty(thing, "price");
            thing.movable := 1;
          endforeach
        endif
        EraseObjProperty(item, "Master");
        EraseObjProperty(item, "price");
        EraseObjProperty(item, "OldName");
        EraseObjProperty(item, "Vendored");
        item.movable := 1;
        MoveItemToContainer(item, tev.source.backpack);
        return;
      else
        var items := 0;
        foreach thing in EnumerateItemsInContainer(item)
          items := 1;
          break;
        endforeach
        if(items == 1)
          PrintTextAbovePrivate(me, "Well, just keep it, then", tev.source);
          if(item.isa(POLCLASS_CONTAINER))
            foreach thing in EnumerateItemsInContainer(item)
              thing.name := GetObjProperty(thing,"OldName");
              EraseObjProperty(thing, "OldName");
              EraseObjProperty(thing, "Vendored");
              EraseObjProperty(thing, "price");
              thing.movable := 1;
            endforeach
          endif
          EraseObjProperty(item, "Master");
          EraseObjProperty(item, "price");
          EraseObjProperty(item, "OldName");
          EraseObjProperty(item, "Vendored");
          item.movable := 1;
          MoveItemToContainer(item, tev.source.backpack);
          return;
        endif
        PrintTextAbovePrivate(me, "How shall I advertise this item?", tev.source);
        tname := RequestInput(tev.source, item, "");
        SetObjProperty(item, "price", "Not For Sale");
        cost := "Not For Sale";
      endif
    else
      PrintTextAbovePrivate(me, "Well, just keep it, then", tev.source);
      if(item.isa(POLCLASS_CONTAINER))
        foreach thing in EnumerateItemsInContainer(item)
          thing.name := GetObjProperty(thing,"OldName");
          EraseObjProperty(thing, "OldName");
          EraseObjProperty(thing, "Vendored");
          EraseObjProperty(thing, "price");
          thing.movable := 1;
        endforeach
      endif
      EraseObjProperty(item, "Master");
      EraseObjProperty(item, "price");
      EraseObjProperty(item, "OldName");
      EraseObjProperty(item, "Vendored");
      item.movable := 1;
      MoveItemToContainer(item, tev.source.backpack);
      return;
    endif
  endif
  if(item.isa(POLCLASS_CONTAINER))
    var theoldname;
    foreach thing in EnumerateItemsInContainer(item)
      theoldname := thing.desc;
      if(!item.desc)
        theoldname := "";
      endif
      SetName(thing, thing.desc + " [Cost: Not For Sale]");
      SetObjProperty(thing, "OldName", theoldname);
      SetObjProperty(thing, "Vendored", me.serial);
      SetObjProperty(thing, "price", "Not For Sale");
      thing.movable := 1;
    endforeach
    SetObjProperty(item, "Master", master);
    item.movable := 1;
  endif
  var oldname := item.desc;
  if(!item.desc)
    oldname := "";
  endif
  SetObjProperty(item, "OldName", oldname);
  SetObjProperty(item, "price", CInt(cost));
  SetObjProperty(item, "Vendored", me.serial);
  if(tname)
    SetName(item, tname + " [Cost: " + cost + " ]");
  else
    SetName(item, item.desc + " [Cost: " + cost + " ]");
  endif
  if(!tev.vendor)
    MoveItemToContainer(item, inv_fs);
  endif
  if(cost == "Not For Sale")
    PrintTextAbovePrivate(me, "I'll just hang on to that for ya.", tev.source);
  else
    PrintTextAbovePrivate(me, "I will sell that for " + cost + " gold.", tev.source);
  endif
endfunction

function cashout(person)
  var mygold := CInt(GetObjProperty(me, "g"));
  var payment := 0;
  var rsrv := GetObjProperty(me,"r");
  var pbank := FindBankBox(person);
  if(mygold > 0)
    while(mygold > 60000)
      CreateItemInContainer(pbank, UOBJ_GOLD_COIN, 60000);
      payment := payment + 60000;
      mygold := mygold - 60000;
    endwhile
    payment := payment + mygold;
    PrintTextAbovePrivate(me, "Ive placed " + payment + " gold coins in your bank box.", person);
    CreateItemInContainer(pbank, UOBJ_GOLD_COIN, mygold);
    SetObjProperty(me, "g", 0);
  else
    PrintTextAbovePrivate(me, "I am not holding any gold for you.", person);
  endif
  if(rsrv)
    PrintTextAbovePrivate(me, "You have left me " + rsrv + " reserve gold coins to use towards my future wages.", person);
  else
    PrintTextAbovePrivate(me, "but you have left me nothing towards my future wages.", person);
  endif
endfunction

function recontact(who)
  var cnt := SendTextEntryGump( who, "How shall I tell people to contact you? ", TE_CANCEL_DISABLE, TE_STYLE_NORMAL, 50);
  return cnt;
endfunction

function wear_item(item)
  foreach thing in ListEquippedItems(me)
    MoveItemToContainer(thing, inv_pb);
  endforeach
  EquipItem(me, item);
  foreach thingie in EnumerateItemsInContainer(inv_pb)
    EquipItem(me, thingie);
  endforeach
  foreach thingie in EnumerateItemsInContainer(inv_pb)
    MoveItemToLocation(thingie, me.x, me.y, me.z, MOVEITEM_FORCELOCATION );
  endforeach
endfunction

function strip_items(mmaster)
  foreach thing in ListEquippedItems(me)
    if ((thing.objtype < STARTHAIR) || (thing.objtype > ENDHAIR))
      MoveItemToContainer(thing, inv_pb);
    endif
  endforeach
  foreach thing in EnumerateItemsInContainer(inv_fs)
    if (thing.container.serial == inv_fs.serial)
      MoveItemToContainer(thing, inv_pb);
    endif
  endforeach
  foreach thingie in EnumerateItemsInContainer(inv_pb)
    if (thingie.container.serial == inv_pb.serial)
      MoveItemToContainer(thingie, mmaster.backpack);
    endif
  endforeach
endfunction

function Fireme()
  var mypack := findmypack(me.serial);
  var mygold := CInt(GetObjProperty(me, "g"));
  var payment := 0;
  if(mygold > 0)
    while(mygold > 60000)
      CreateItemInContainer(mypack, UOBJ_GOLD_COIN, 60000);
      payment := payment + 60000;
      mygold := mygold - 60000;
    endwhile
    CreateItemInContainer(mypack, UOBJ_GOLD_COIN, mygold);
  endif
  foreach thing in ListRootItemsInContainer(inv_fs)
    MoveItemToContainer(thing, mypack);
  endforeach
  foreach thingy in ListRootItemsInContainer(inv_pb)
    MoveItemToContainer(thingy, mypack);
  endforeach
  RevokePrivilege( me, "invul" );
  say("I regret nothing!");
  ApplyRawDamage( me, GetHp(me) +3);
endfunction

function addthingstobuy(who)
    var buylist := {};
    var buyprice := { };
    var buyobj := { };
    var i;
    if (!GetObjProperty(me,"buylist"))
        buylist := {};
        buyprice := {};
        buyobj := { };
    else
        buylist := GetObjProperty(me,"buylist");
        buyprice := GetObjProperty(me,"buyprice");
        buyobj := GetObjProperty(me,"buyobj");
    endif
    PrintTextAbovePrivate(me, "What do you want me to buy?", who);
    var what := Target( master );
        if ((!what) || (what == error) || (GetStrength(what)) )
        PrintTextAbovePrivate(me, "Nevermind", who);
        return;
        endif
    if (what.desc in buylist)
        PrintTextAbovePrivate(me, "I will no longer purchase "+what.desc, who);
        var newbuylist := { };
        var newbuyprice := { };
        var newbuyobj := { };
        for (i := 1; i<=len(buylist); i:=i+1)
            if (buylist[i] != what.desc)
                newbuylist[len(newbuylist)+1] := buylist[i];
                newbuyprice[len(newbuyprice)+1] := buyprice[i];
                newbuyobj[len(newbuyobj)+1] := buyobj[i];
            endif
        endfor
        SetObjProperty(me,"buylist",newbuylist);
        SetObjProperty(me,"buyprice",newbuyprice);
        SetObjProperty(me,"buyobj",newbuyobj);
        return;
    endif
    if (!what.objtype)
        PrintTextAbovePrivate(me, "I can't buy those.  What the hell is that, anyway?", who);
        return;
    endif
    buylist[ len(buylist)+1] := what.desc;
    buyprice[ len(buyprice)+1] := CInt(SendTextEntryGump( master,"How much shall I pay for this item? ", TE_CANCEL_ENABLE, TE_STYLE_NORMAL));
    buyobj[ len(buyobj)+1] := what.objtype;
    if (len(buylist)==1)
      PrintTextAbovePrivate(me, "I will purchase "+buylist[1], master);
    elseif (len(buylist)==2)
        PrintTextAbovePrivate(me, "I will purchase "+buylist[1] +" and "+ buylist[2], master);
    else
        var buying := "I will purchase "+buylist[1];
        for (i := 2; i<=len(buylist)-1; i:=i+1)
            buying := buying + ", " +buylist[i];
        endfor
        buying := buying + " and " + buylist[len(buylist)];
        PrintTextAbovePrivate(me, buying, master);
    endif
    SetObjProperty(me,"buylist",buylist);
    SetObjProperty(me,"buyprice",buyprice);
    SetObjProperty(me,"buyobj",buyobj);
endfunction

function SpoutBuyList(you)
  var buylist := {};
  var buyprice := {};
  var i;
  if (!GetObjProperty(me,"buylist"))
    PrintTextAbovePrivate(me, "I don't buy anything.", you);
    return;
  else
    buylist := GetObjProperty(me,"buylist");
    buyprice := GetObjProperty(me,"buyprice");
  endif
  for (i := 1; i<=len(buylist); i:=i+1)
    PrintTextAbovePrivate(me, "I'll pay "+ buyprice[i] + " for " + buylist[i], you);
    sleep(2);
  endfor
  PrintTextAbovePrivate(me, "Just hand me what you want me to buy.", you);
endfunction

function buyitem(you, it)
    var mypack := findmypack(me.serial);
    var itsownerserial := CInt(GetObjProperty(it, "ownerserial"));
    if (itsownerserial == CInt(master))
        PrintTextAbovePrivate(me, "I'll see that this is returned to my employer.", you);
        MoveItemToContainer(it,mypack);
        NotifyMaster(you.name + " gave me an item of yours.");
        return;
    endif
    var buylist := {};
    var buyprice := { };
    var buyobj := { };
    var i;
    if (!GetObjProperty(me,"buylist"))
      PrintTextAbovePrivate(me, "I don't buy anything", you);
        MoveItemToContainer(it,you.backpack);
        return;
    else
        buylist := GetObjProperty(me,"buylist");
        buyprice := GetObjProperty(me,"buyprice");
        buyobj := GetObjProperty(me,"buyobj");
    endif
    if (!(it.objtype in buyobj))
      PrintTextAbovePrivate(me, "Ugh, I don't want that.", you);
        MoveItemToContainer(it,you.backpack);
        return;
    endif
    var index := 0;
    for (i := 1; i<=len(buylist); i:=i+1)
        if (it.objtype == buyobj[i])
            index := i;
            break;
        endif
    endfor
    if (!index)
      PrintTextAbovePrivate(me, "Ugh, I don't want that.", you);
        MoveItemToContainer(it,you.backpack);
        return;
    endif
    var mygold := CInt(GetObjProperty(me, "g"));
    if ( (mygold-250) < (buyprice[index]*it.amount))
      PrintTextAbovePrivate(me, "Sorry, I can't afford that right now.", you);
        MoveItemToContainer(it,you.backpack);
        return;
    endif
    var itamount := it.amount;
    var itdesc := it.desc;
    if ( grabitem(it,mypack) )
      PrintTextAbovePrivate(me, "Thank you!  Here's your " + (buyprice[index]*itamount) + " gold.", you);
            CreateItemInContainer(you.backpack, UOBJ_GOLD_COIN, buyprice[index]*itamount );
        NotifyMaster(you.name + " just sold me " + itdesc);
    else
        NotifyMaster("My backpack is full!");
        MoveItemToContainer(it,you.backpack);
        return;
    endif
    var theprice := buyprice[index]*itamount;
    var mypay := CInt(GetObjProperty(me,"mypay"));
    var commission := CInt( 0.05 * theprice);
    mygold := mygold - theprice;
    mypay := mypay + commission;
    if (mygold >= mypay)
        mypay := 0;
        mygold := mygold - mypay;
    else
        mypay := mypay - mygold;
        mygold := 0;
    endif
    SetObjProperty(me, "mypay",mypay);
    SetObjProperty(me, "g", mygold);
endfunction

function NotifyMaster(themessage)
    foreach onlinechr in EnumerateOnlineCharacters()
        if (onlinechr.serial == master)
        SendSysMessage(onlinechr, me.name + " : " + themessage);
        break;
        endif
    endforeach
endfunction

function TakeGold(ev)
    var goldamount := ev.item.amount;
    var mygold := CInt(GetObjProperty(me, "r"));
    if(goldamount)
      mygold := mygold + goldamount;
      var totalgold := CInt(GetObjProperty(me,"g")) + mygold;
      PrintTextAbovePrivate(me, "I am holding " + totalgold + " gold for you.", ev.source);
    endif
    SetObjProperty(me, "r", mygold);
    DestroyItem(ev.item);
endfunction

function grabitem(it,mypack)
  var mystuff := EnumerateItemsInContainer