Player Vendors!

Here you can post threads requesting help on the official POL Ultima Online Emulator Core 095. Note: Core 095 is no longer officially supported.
Post Reply
StrelOK
New User
Posts: 15
Joined: Thu Dec 28, 2006 5:27 pm

Player Vendors!

Post by StrelOK »

All greetings!
At me a problem with player vendors, they sell things only to the owners! How it to correct?
lokaum
Novice Poster
Posts: 45
Joined: Mon Dec 25, 2006 6:33 am

Post by lokaum »

can show the script?
StrelOK
New User
Posts: 15
Joined: Thu Dec 28, 2006 5:27 pm

Post by StrelOK »

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

Code: Select all

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
StrelOK
New User
Posts: 15
Joined: Thu Dec 28, 2006 5:27 pm

Post by StrelOK »

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

Code: Select all

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
StrelOK
New User
Posts: 15
Joined: Thu Dec 28, 2006 5:27 pm

Post by StrelOK »

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

Code: Select all

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
StrelOK
New User
Posts: 15
Joined: Thu Dec 28, 2006 5:27 pm

Post by StrelOK »

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

Code: Select all

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
StrelOK
New User
Posts: 15
Joined: Thu Dec 28, 2006 5:27 pm

Post by StrelOK »

Excuse, simply Internet not especially fast
User avatar
CWO
POL Expert
Posts: 1160
Joined: Sat Feb 04, 2006 5:49 pm

Post by CWO »

So what is it doing when someone who is not an owner tries to buy something? Is the vendor saying something? Is the vendor doing something?
StrelOK
New User
Posts: 15
Joined: Thu Dec 28, 2006 5:27 pm

Post by StrelOK »

The seller simply does not sell a thing, writes there is no place in a bag
User avatar
CWO
POL Expert
Posts: 1160
Joined: Sat Feb 04, 2006 5:49 pm

Post by CWO »

So now trace this back into your script. Apparently, its getting to this:

PrintTextAbovePrivate(me,"You do not have enough room for that in your backpack", who);

So now you have to look back at what steps it took to get here... its after an "else" so lets look at the "if" conditions.

if(MoveItemToContainer(trg, who.backpack))

Seems a bit wierd that this is failing you think? So now we need to know what problem POL is possibly having when doing that command. So now you change it to send a message with the error.

Code: Select all

var themove := MoveItemToContainer(trg, who.backpack);
SendSysMessage(who, CStr(themove));
If (themove)
replace the one line " if(MoveItemToContainer(trg, who.backpack)) " with the 3 lines I put in code there and see what message its sending you.
StrelOK
New User
Posts: 15
Joined: Thu Dec 28, 2006 5:27 pm

Post by StrelOK »

The problem has remained. It writes:
IF you want to buy something, just so.
You do not have enough room for that in your backpack
error errortext = " Could not remove item from its container. "
User avatar
CWO
POL Expert
Posts: 1160
Joined: Sat Feb 04, 2006 5:49 pm

Post by CWO »

Now how do owners put things on and take things off of the vendors? Do they just manage the backpack just as any other container? If so, this is probably an OnRemove problem. The fourth parameter of OnRemove is the "move type"

program OnRemove(who, backpack, item, movetype)

first thing in the script should be

if (movetype == MOVETYPE_COREMOVE)
return 1;
endif

This will allow any CORE move like MoveItemTo*/MoveObjectToLocation to be accepted. If its not even checking if its the core, just the owner, this is the problem.
StrelOK
New User
Posts: 15
Joined: Thu Dec 28, 2006 5:27 pm

Post by StrelOK »

Excuse, but I a beginner scripterи I have not absolutely understood that that you have written. And still I from Russia, me on English am difficult =)
User avatar
CWO
POL Expert
Posts: 1160
Joined: Sat Feb 04, 2006 5:49 pm

Post by CWO »

OK, you have to find out the objtype of the vendor's backpack. When you know the objtype, look in itemdesc.cfg for the definition. If it has an entry for OnRemoveScript look for that script. Then add in what I put in my last post.
Post Reply