(Player owned) item frame shop


Author: calico-kid
Created: 2014-07-22T19:49:50-0400
Edited: 2014-09-12T00:11:16-0400
Denizen Version: 1496
Views: 756
Downloads: 1222
Likes: 3


WGET
Description: This script also can set server owned shops but allows for player owned shops as well.

This is a variation of the server owned item frame shop script, once again i cannot take full credit for this work as aufdemrand had a major part in laying the foundation for the server owned version. and many others helped make this work like mcmonkey talimar1 fullwall morphan1 and others.
Please give this script a like if you like it or use it so others can find it when they look for a shop script. thanks

Note: If you currently have the server owned version of the item frame shop on your server you will need to remove it for this script to work. this script has the option of making a store a server owned shop. for more details on this please visit https://www.youtube.com/watch?v=6uv_JhZpnYY for a short script setup tutorial. however if you do not plan to have player owned shops then i highly reccomend using the server version of the item frame shop script.

once again this works with the prices yaml you can find that here: http://scripts.citizensnpcs.co/view/f58jln place this script in the denizen folder not in the scripts folder.

thanks for looking at this script hope you enjoy it feel free to comment on any additional features you would like to see added. enjoy

StorekeeperPlayerOwned:
  type: assignment
  debug: true
  
  default constants:
    server_price_requirment: true
    store open hour: 5
    store close hour: 18
    store greetings: li@Welcome to my store!
      |Feel free to look around!
      |Just give me a click if you need something!

  actions:

    # Just some setup of the triggers
    on remove:
    - flag server playerstore:<-:<npc.flag[playerstore]>
    on assignment:
    - trigger name:proximity toggle:true radius:30
    - trigger name:click toggle:true
    - trigger name:chat toggle:true
    - trigger name:damage toggle:true
    - flag npc cashregister:5
    on enter proximity:
    - foreach <npc.flag[playerstore].as_cuboid.list_entities> {
      - if !<def[value].has_framed_item> {
        - adjust %value% framed:<npc.flag[storeitems].get[<npc.flag[storeitemlocations].find[<def[value].location>]>]>
        }
      }
    on move proximity:
    - if !<<player.flag[storekeepernpc]>.flag[playerstore].as_cuboid.is_within[<player.location>]> && '<player.inventory.contains[i@shopping bag]>' {
      - inventory add o:in@<player.name>_shopping_bag d:<<player.flag[storekeepernpc]>.inventory>
      - take "i@shopping bag"
      - narrate "<dark_red>No stealing items from my store!!"
      }
    - if <player> == <npc.owner> && <npc.can_see[<player>]> && !<player.flag[greeted]> {
      - narrate "<dark_purple>Hello <player.name> just ask for <green>'help' <dark_purple>if you need a command refresher for your shop"
      - flag player greeted duration:5m
      } else if !<player.flag[greeted]> && <npc.can_see[<player>]> {
      - if !<npc.flag[greeting]> == null {
        - narrate "<aqua><npc.flag[greeting].random>"
        }
        else {
        - narrate "<aqua><el@val[<npc.constant[store greetings]>].as_list.random>"
        }
      - flag player greeted duration:30s
      }
    on damage:
    - flag player storekeepernpc:n@<npc>
    - if <player> == <npc.owner> {
      - narrate "<dark_purple> The balance is <green><npc.flag[cashregister].as_int>"
      - narrate "<dark_purple>would you like to <green>'give' <dark_purple>money to your store or <green>'take' <dark_purple>money from your store?"
      } else if '!<player.inventory.contains[i@shopping bag]>' && '!<player.inventory.contains[i@selling bag]>' {
      - note 'in@player bag' as:<player.name>_shopping_bag
      - animate <npc> arm_swing
      - flag player storekeepernpc:<npc>
      - narrate '<aqua>Here, have a complimentary shopping bag!'
      - give <player> 'i@shopping bag'
      } else if <player.item_in_hand> == 'i@shopping bag' && <npc.owner> == server {
      - define total_price 0 
      - foreach <in@<player.name>_shopping_bag.list_contents> { 
        - adjust %value% quantity:1 save:item2
        - if <server.flag[<<entry[item2].result>.full.escaped>]> == null { 
          - flag server <<entry[item2].result>.full.escaped>:1.00 
          } 
        - adjust %value% quantity:1 save:item
        - define price <yaml[prices].read[prices.<<entry[item].result>.full.escaped>].mul[2].mul[<server.flag[<entry[item].result.full.escaped>]>].mul[<%value%.qty>]> 
        - define total_price <el@val[%total_price%].add[%price%]> 
        } 
      - narrate "<aqua>Ready to check out? Just click me with your bag!"
      - narrate "<aqua>your total price is <green>%total_price%"
      } else if <player.item_in_hand> == 'i@shopping bag' {
      - define total_price 0 
      - foreach <in@<player.name>_shopping_bag.list_contents> { 
        - if !<npc.flag[sell_<%value%.full.escaped>].mul[<%value%.qty>]> == null {
          - define price <npc.flag[sell_<%value%.full.escaped>].mul[<%value%.qty>]>
          }
          else {
          - define price <el@val[<npc.flag[sell_<%value%.full.escaped>]>].mul[<%value%.qty>]>
          - define total_price <el@val[%total_price%].add[%price%]> 
          }
        } 
      - narrate "<aqua>Ready to check out? Just click me with your bag!"
      - narrate "<aqua>your total price is <green>%total_price%"
      } else if <player.item_in_hand> == 'i@selling bag' && <npc.owner> == server {
      - define total_price 0 
      - foreach <in@<player.name>_shopping_bag.list_contents> { 
        - adjust %value% quantity:1 save:item
        - define price <yaml[prices].read[prices.<<entry[item].result>.escaped>].mul[<%value%.qty>]> 
        - define total_price <el@val[%total_price%].add[%price%]> 
        } 
      - narrate "<aqua>Ready to sell items? Just right click me with your bag!"
      - narrate "<aqua>your total price is <green>%total_price%"
      } else if <player.item_in_hand> == 'i@selling bag' {
      - define total_price 0 
      - foreach <in@<player.name>_selling_bag.list_contents> { 
        - define price <npc.flag[buy_%value%].as_int> 
        - define total_price <el@val[%total_price%].add[%price%]> 
        } 
      - narrate "<aqua>Ready to sell items? Just right click me with your bag!"
      - narrate "<aqua>your total price is <green>%total_price%"
      }
      else {
      - flag player storekeepernpc:n@<npc>
      }
      
    on chat:
    - if <context.message> == greeting && <player> == <npc.owner> {
      - narrate "<dark_purple>Would you like to <green>add <dark_purple>or <green>remove<dark_purple> a greeting?"
      - flag player greeting
      - determine cancelled
      }
    - if <player.flag[greeting]> == true && <player> == <npc.owner> {
      - if <context.message> == add {
        - if <npc.flag[greeting].as_list.size> > 4 {
          - narrate "You cannot exceed five greetings!"
          - flag player greeting:!
          - determine cancelled
          - queue clear
          }
          else {
          - narrate "<dark_purple>Please say the greeting you would like to add to your store"
          - flag player greeting:!
          - flag player addgreeting
          - determine cancelled
          }
        }
        else if <context.message> == remove && <npc.owner> == <player> {
        - flag player greeting:!
        - flag player removegreeting
        - narrate "What line number would you like to remove?"
        - foreach <npc.flag[greeting].as_list> {
          - narrate "%loop_index%=%value%"
          }
        - determine cancelled
        }
      }
    - if <player.flag[removegreeting]> == true && <player> == <npc.owner> {
      - narrate "<npc.flag[greeting].get[<context.message>]>"
      - narrate "Has been removed"
      - flag npc greeting[<context.message>]:<-
      - flag player removegreeting:!
      - determine cancelled
      }
    - if <player.flag[addgreeting]> == true && <player> == <npc.owner> {
      - flag npc greeting:->:<context.message>
      - flag player addgreeting:!
      - narrate "<dark_purple>You added a new greeting to your list. Your new greeting is"
      - narrate "<green><context.message>"
      - determine cancelled
      }
    - if <context.message> == expand && <player> == <npc.owner> {
      - execute as_op "npc select <npc.id> as:<player>"
      - flag server playerstore:<-:<npc.flag[playerstore]>
      - give i@storelocationstick4
      - narrate "<dark_purple>please reselect the bottom and top corners of your cuboid then drop the selector"
      - determine cancelled
      }
    - if <context.message> == help && <player> == <npc.owner> {
      - narrate "<dark_purple>your shop commands are <green> Greeting, items, give, take, set, unset, expand."
      - narrate "<dark_purple>Click the npc with an item to set a price for it"
      - narrate "<dark_purple>Right click the npc without an item to view inventory for the store"
      - determine cancelled
      }
    - if <context.message> == items && <player> == <npc.owner> {
      - if <npc.flag[buyback]> == null {
        - narrate "<aqua>No items have been sold to your shop"
        }
        else {
        - give <npc.flag[buyback]>
        - flag npc buyback:!
        - determine cancelled
        }
      }
    - if <player.flag[givingtocashregister]> == true && <player> == <npc.owner> {
      - flag npc cashregister:+:<context.message>
      - take money qty:<context.message>
      - narrate "<dark_purple>You give <green><context.message> <dark_purple>to the cash register. The balance is now <green><npc.flag[cashregister].as_int>"
      - flag player givingtocashregister:!
      - determine cancelled
      }
    - if <context.message> == give && <player> == <npc.owner> {
      - flag player givingtocashregister
      - narrate "<dark_purple>How much would you like to give to the store?"
      - determine cancelled
      }
    - if <context.message> == take && <player> == <npc.owner> {
      - flag player takingfromcashregister
      - narrate "<dark_purple>How much would you like to take from the store?"
      - determine cancelled
      }
    - if <player.flag[takingfromcashregister]> == true && <player> == <npc.owner> {
      - if <npc.flag[cashregister]> > <context.message> {
        - flag npc cashregister:-:<context.message>
        - give money qty:<context.message>
        - narrate "<dark_purple>You take <green><context.message> <dark_purple>from the cash register. The balance is now <green><npc.flag[cashregister].as_int>"
        - flag player takingfromcashregister:!
        - determine cancelled
        }
        else if <npc.flag[cashregister]> < <context.message> {
        - narrate "<dark_red>You havnt got that much money in your cashregister!"
        }
      }
    - if <context.message> == unset && <player> == <npc.owner> {
      - flag server playerstore:<-:<npc.flag[playerstore]>
      - narrate "<dark_red>your store is now unprotected! tell the npc to 'set' the store back up when you are done editing"
      - determine cancelled
      }
    - if <context.message> == sell {
      - if <npc.owner> == server {
        - note 'in@selling bag' as:<player.name>_selling_bag
        - animate <npc> arm_swing
        - narrate '<aqua>Here is your item selling bag!'
        }
        else {
        - note 'in@player bag' as:<player.name>_selling_bag
        - animate <npc> arm_swing
        - narrate '<aqua>Here is your item selling bag!'
        - narrate "<aqua>We buy the following items that you have"
        - foreach <player.inventory.list_contents.simple> {
          - if !<npc.flag[buy_<%value%.full.escaped>]> == null {
            - if <%value%.display> == null {
              - narrate "<aqua>We buy <green><%value%.material.name> <aqua>for <green><npc.flag[buy_<%value%.escaped>]> coins a piece"
              }
              else {
              - narrate "<aqua>We buy <green><%value%.display> <aqua>for <green><npc.flag[buy_<%value%.full.escaped>]> coins a piece"
              }
            }
          }
        }
      - drop 'i@selling bag' <npc.location.add[<npc.location.direction.vector.mul[2]>].add[0,1,0]> 
      - determine cancelled
      }
    - if <context.message> == set && <player> == <npc.owner> && !<server.flag[playerstore].as_list> contains <npc.flag[playerstore]> {
      - narrate "<&b>your store is now open for business!"
      - flag server playerstore:->:<npc.flag[playerstore]>
      - flag npc storeitems:!
      - foreach <npc.flag[playerstore].as_cuboid.list_entities> {
        - if <def[value].entity_type> == item_frame {
          - flag npc storeitems:->:<def[value].framed_item>
          - flag npc storeitemlocations:->:<def[value].location>
          }
        }
      - determine cancelled
      }
    - if <context.message> == buying && <player> == <npc.owner> {
      - if <npc.constant[server_price_requirment]> == true {
        - narrate "<dark_purple>please set a price below <green><yaml[prices].read[prices.<npc.flag[currentitem]>]> <dark_purple>for that item."
        - flag player settype:buy
        - determine cancelled
        }
        else {
        - flag player settype:buy
        - narrate "<dark_purple>please set a price for that item"
        - determine cancelled
        }
      }
    - if <context.message> == selling && <player> == <npc.owner> {
      - if <npc.constant[server_price_requirment]> == true {
        - narrate "<dark_purple>please set a price above <green><yaml[prices].read[prices.<npc.flag[currentitem]>]> <dark_purple>for that item."
        - flag player settype:sell
        - determine cancelled
        }
        else {
        - flag player settype:sell
        - narrate "<dark_purple>please set a price for that item"
        - determine cancelled
        }
      }
    - if !<npc.flag[currentitem]> == null && <player> == <npc.owner> {
      - if <player.flag[settype]> == buy && <npc.constant[server_price_requirment]> == true {
        - if <context.message> > <yaml[prices].read[prices.<npc.flag[currentitem]>]> && <context.message.is[matches].to[integer]> {
          - narrate "<dark_red>your price needs to be below the base price. this price will not be set for this item."
          - flag npc currentitem:!
          - flag player settype:!
          - determine cancelled
          }
          else if <context.message> < <yaml[prices].read[prices.<npc.flag[currentitem]>]> && <context.message.is[matches].to[integer]> {
          - flag npc <player.flag[settype]>_<npc.flag[currentitem]>:<context.message>
          - if <<npc.flag[currentitem].unescaped>.display> == null {
            - narrate "<dark_purple><<npc.flag[currentitem].unescaped>.material.name> <player.flag[settype]> price is now set to <green><context.message>"
            }
            else {
            - narrate "<dark_purple><<npc.flag[currentitem].unescaped>.display> <player.flag[settype]> price is now set to <green><context.message>"
            }
          - flag npc currentitem:!
          - flag player settype:!
          - determine cancelled
          }
          else {
          - narrate "<dark_red>That doesn not match a valid number! please set a proper number for a price"
          - determine cancelled
          }
        }
      }
    - if !<npc.flag[currentitem]> == null && <player> == <npc.owner> {
      - if <player.flag[settype]> == sell && <npc.constant[server_price_requirment]> == true {
        - if <context.message> < <yaml[prices].read[prices.<npc.flag[currentitem]>]> && <context.message.is[matches].to[integer]> {
          - narrate "<dark_red>your price needs to be above the base price. this price will not be set for this item."
          - flag npc currentitem:!
          - flag player settype:!
          - determine cancelled
          }
          else if <context.message> > <yaml[prices].read[prices.<npc.flag[currentitem]>]> && <context.message.is[matches].to[integer]> {
          - flag npc <player.flag[settype]>_<npc.flag[currentitem]>:<context.message>
          - if <<npc.flag[currentitem].unescaped>.display> == null {
            - narrate "<dark_purple><<npc.flag[currentitem].unescaped>.material.name> <player.flag[settype]> price is now set to <green><context.message>"
            }
            else {
            - narrate "<dark_purple><<npc.flag[currentitem].unescaped>.display> <player.flag[settype]> price is now set to <green><context.message>"
            }
          - flag npc currentitem:!
          - flag player settype:!
          - determine cancelled
          }
          else {
          - narrate "<dark_red>That doesn not match a valid number! please set a proper number for a price"
          - determine cancelled
          }
        }
      }
    - if !<npc.flag[currentitem]> == null && <player> == <npc.owner> { 
      - if !<npc.constant[server_price_requirment]> == true {
        - if <context.message.is[matches].to[integer]> {
          - flag npc <player.flag[settype]>_<npc.flag[currentitem]>:<context.message>
          - if <<npc.flag[currentitem].unescaped>.display> == null {
            - narrate "<dark_purple><<npc.flag[currentitem].unescaped>.material.name> <player.flag[settype]> price is now set to <green><context.message>"
            }
            else {
            - narrate "<dark_purple><<npc.flag[currentitem].unescaped>.display> <player.flag[settype]> price is now set to <green><context.message>"
            }
          - flag npc currentitem:!
          - flag player settype:!
          - determine cancelled
          }
          else {
          - narrate "<dark_red>That is not a valid number. please select a valid number for the price"
          - determine cancelled
          }
        }
    on click:
    - if <player> == <npc.owner> && !<player.item_in_hand> == i@air {
      - adjust <player.item_in_hand> quantity:1 save:item8
      - flag npc currentitem:<entry[item8].result.full.escaped>
      - narrate "<dark_purple>will you be <green>'selling' <dark_purple>or <green>'buying' <dark_purple>for this item?"
      - queue clear
      - determine cancelled
      }
      else if <player> == <npc.owner> && <player.item_in_hand> == i@air {
      - inventory open d:<npc.inventory>
      }
 
    - if <player.item_in_hand> == "i@shopping bag" { 
      - if <in@<player.name>_shopping_bag.qty> == 0 { 
        - narrate "<aqua>your shopping bag is empty!" 
        } else if <npc.owner> == server {
        - flag player delay duration:3s
        - chat "ok let's total these items up for you then!" 
        - define total_price 0 
        - foreach <in@<player.name>_shopping_bag.list_contents> { 
          - adjust %value% quantity:1 save:item2
          - if <server.flag[<<entry[item2].result>.full.escaped>]> == null { 
            - flag server <<entry[item2].result>.full.escaped>:1.00 
            } 
          - adjust %value% quantity:1 save:item
          - define price <yaml[prices].read[prices.<<entry[item].result>.full.escaped>].mul[2].mul[<server.flag[<entry[item].result.full.escaped>]>].mul[<%value%.qty>]> 
          - define total_price <el@val[%total_price%].add[%price%]> 
          } 
        - if <player.money> < %total_price% { 
          - narrate "<dark_red>YOU NEED MONEYS D=" 
          - queue clear 
          } 
        - flag player bagnumber:+:1
        - note "in@player bag" "as:<player.name> <player.flag[bagnumber].as_int>_item_bag"
        - take money qty:%total_price% 
        - run "itemgiverPlayer Owned" delay:1s 
        - take 'i@shopping bag'
        - narrate "<aqua>The shopkeeper takes <green>%total_price% coins"
        - narrate "<gold>You are all checked out. have a great day!"
        - narrate "<red>Do not open your item bag until you are ready to take all the items out"
        - foreach <in@<player.name>_shopping_bag.list_contents.full.escaped> { 
          - adjust %value% quantity:1 save:item9
          - flag server <entry[item9].result>adjust:+:<def[value].qty>
          - run script:price_adjuster def:<entry[item9].result>
          }
        } 
        else { 
        - flag player delay duration:3s
        - chat "ok let's total these items up for you then!" 
        - define total_price 0 
        - foreach <in@<player.name>_shopping_bag.list_contents> { 
          - adjust %value% quantity:1 save:item2
          - if <server.flag[<<entry[item2].result>.full.escaped>]> == null { 
            - flag server <<entry[item2].result>.full.escaped>:1.00 
            } 
          - define price <el@val[<npc.flag[sell_<entry[item2].result.full.escaped>]>].mul[<%value%.qty>]>
          - define total_price <el@val[%total_price%].add[%price%]> 
          } 
        - if <player.money> < %total_price% { 
          - narrate "<dark_red>YOU NEED MONEYS D=" 
          - queue clear 
          } 
        - if <npc.inventory.list_contents.simple> contains <in@<player.name>_shopping_bag.list_contents.simple> {
          - narrate "<aqua>I am sorry but we just ran out of some of those items!"
          - queue clear
          }
        - flag player bagnumber:+:1
        - note "in@player bag" "as:<player.name> <player.flag[bagnumber].as_int>_item_bag"
        - take money qty:%total_price% 
        - flag npc cashregister:+:%total_price%
        - run "itemgiverPlayer Owned" delay:1s 
        - take 'i@shopping bag'
        - narrate "<aqua>The shopkeeper takes <green>%total_price% coins"
        - narrate "<gold>You are all checked out. have a great day!"
        - narrate "<red>Do not open your item bag until you are ready to take all the items out"
        - foreach <in@<player.name>_shopping_bag.list_contents.full.escaped> { 
          - adjust %value% quantity:1 save:item9
          - flag server <entry[item9].result>adjust:+:<def[value].qty>
          - run script:price_adjuster def:<entry[item9].result>
          }
        }          
      } else if <player.item_in_hand> == "i@selling bag" { 
      - flag player delay duration:3s
      - if <in@<player.name>_selling_bag.qty> == 0 { 
        - narrate "<dark_red>your selling bag is empty!" 
        } else if <in@<player.name>_selling_bag.contains['i@shopping bag']> {
        - chat "i am sorry but i do not buy back my shopping bags."
        } else if <npc.owner> == server {
        - chat "ok let's total these items up for you then!" 
        - define total_price 0 
        - foreach <in@<player.name>_selling_bag.list_contents> { 
          - adjust %value% quantity:1 save:item
          - define price <yaml[prices].read[prices.<<entry[item].result>.full.escaped>].mul[<%value%.qty>]> 
          - define total_price <el@val[%total_price%].add[%price%]> 
          } 
        - note 'in@selling bag' as:<player.name>_selling_bag
        - give money qty:%total_price% 
        - take 'i@selling bag'
        - narrate "<aqua>The shopkeeper gives you <green>%total_price% coins"
        - foreach <in@<player.name>_shopping_bag.list_contents.full.escaped> { 
          - adjust %value% quantity:1 save:item9
          - flag server <<entry[item9].result>adjust:-:<def[value].qty>
          - run script:price_adjuster def:<entry[item9].result>
          }
        - queue clear
        }
        else {
        - chat "ok let's total these items up for you then!" 
        - define total_price 0 
        - foreach <in@<player.name>_selling_bag.list_contents> { 
          - adjust %value% quantity:! save:item
          - define price <el@val[<npc.flag[buy_<%item%.full.escaped>]>].mul[<%value%.qty>]>
          - define total_price <el@val[%total_price%].add[%price%]> 
          } 
        - if %total_price% < <npc.flag[wallet].as_int> {
          - flag npc buyback:->:<in@<player.name>_selling_bag.list_contents>
          - note 'in@player bag' as:<player.name>_selling_bag
          - give money qty:%total_price% 
          - flag npc cashregister:-:%total_price%
          - take 'i@selling bag'
          - narrate "<aqua>The shopkeeper gives you <green>%total_price% coins"
          - foreach <in@<player.name>_shopping_bag.list_contents.full.escaped> { 
            - adjust %value% quantity:1 save:item9
            - flag server <entry[item9].result>adjust:-:<def[value].qty>
            - run script:price_adjuster def:<entry[item9].result>
            }
          - queue clear
          } 
          else {
          - narrate "<aqua>I am sorry I don't have the funds to buy all of that back!"
          }
        }
      } else {
      - if in@<player.inventory> contains 'i@shopping bag' || in@<player.inventory> contains 'i@selling bag' {
      } else if <player> == <npc.owner> {
      - queue clear
      }
      else {
      - chat "Please visit http://youtu.be/2f3Dk4cPCXs for a short tutorial of how to use our stores."
      }
itemgiverPlayer Owned:
  type: task
  debug: true
  script:
  - inventory add o:in@<player.name>_shopping_bag 'd:in@<player.name> <player.flag[bagnumber].as_int>_item_bag'
  - ^adjust 'i@item_bag' "lore:<player.name> <player.flag[bagnumber].as_int>" save:playersbag
  - give <entry[playersbag].result.full>
Item Frame Shop Player Owned:
  type: world
  debug: true
  events:
    on server start:
    - yaml load:prices.yml id:prices
    on price command:
    - if <player.is_op> {
      - adjust <player.item_in_hand.full> quantity:1 save:item3
      - if !<yaml[prices].contains[prices.<entry[item3].result.full.escaped>]> {
        - flag player setpriceserver:<entry[item3].result.full.escaped>
        - narrate "<dark_purple>what is the base price you want for that item?"
        - determine cancelled
        }
        else {
        - narrate "<dark_purple>That item already has a current price of <green><yaml[prices].read[prices.<entry[item3].result.full.escaped>]>"
        - narrate "<dark_purple>To adjust that items price use the /adjust_price command"
        - determine cancelled
        }
      }
    on adjust_price command:
    - adjust <player.item_in_hand.full> quantity:1 save:item3
    - yaml id:prices set prices.<entry[item3].result.full.escaped>:!
    - flag player setpriceserver:<entry[item3].result.full.escaped>
    - narrate "<dark_purple>what is the base price you want for that item?"
    - determine fulfilled
    on player chats:
    - if <player.is_op> && !<player.flag[setpriceserver]> == null {
      - if <context.message.is[matches].to[integer]> {
        - yaml id:prices set prices.<player.flag[setpriceserver]>:<context.message>
        - yaml savefile:prices.yml id:prices
        - narrate "<dark_purple><<player.flag[setpriceserver].unescaped>.display> price is now set to <green><yaml[prices].read[prices.<player.flag[setpriceserver]>]>"
        - flag setpriceserver:!
        - determine cancelled
        }
        else {
        - narrate "<dark_red>That is not a valid number"
        - narrate "<dark_purple>what is the base price you want for that item?"
        - determine cancelled
        }
      }
    on stop command:
    - foreach <server.flag[storenpcs].as_list> {
      - flag %value% playerstoreinventory:<def[value].inventory.list_contents>
      }
    on entity teleports:
    - if '<player.inventory.contains[i@shopping bag]>' {
      - queue clear
      } 
      else if '<player.inventory.contains[i@shopping bag]>' {
      - inventory add o:in@<player.name>_shopping_bag d:<<player.flag[storekeepernpc]>.inventory>
      - take "i@shopping bag"
      - narrate "<dark_red>No stealing items from my store!!"
      }
    on player quits:
    - if '<player.inventory.contains[i@shopping bag]>' {
      - inventory add o:in@<player.name>_shopping_bag d:<<player.flag[storekeepernpc]>.inventory>
      - take "i@shopping bag"
      - narrate "<dark_red>No stealing items from my store!!"
      }
    on store_setup command:
    - give <player> i@playerstorekeeperegg
    - determine fulfilled
    on player clicks with i@playerstorekeeperegg:
    - if <global.flag[playerstore].escape_contents> == null {
      - run "storelocationstick3" as:<player> delay:1t
      - create player storekeeper <player.location.cursor_on.add[0.5,1,0.5]>
      - execute as_op "npc select"
      - narrate "<dark_purple>please select the bottom and top corners of your cuboid then drop the selector"
      - take i@playerstorekeeperegg
      - lookclose <player.selected_npc> state:true
      - queue clear
      }
    - foreach <global.flag[playerstore].escape_contents> {
      - if <def[value].unescaped.as_cuboid.is_within[<context.location>]> {
        - narrate "you cannot place your store inside of someone another store"
        - determine cancelled
        }
      }
    - foreach <global.flag[playerstore].escape_contents> {
      - if !<def[value].unescaped.as_cuboid.is_within[<context.location>]> {
        - run "storelocationstick3" as:<player> delay:1t
        - create player storekeeper <player.location.cursor_on.add[0.5,1,0.5]>
        - execute as_op "npc select"
        - narrate "<dark_purple>please select the bottom and top corners of your cuboid then drop the selector"
        - take i@playerstorekeeperegg
        - lookclose <player.selected_npc> state:true
        - queue clear
        }
      }
    on item_frame damaged by entity_explosion:
    - foreach <global.flag[playerstore].escape_contents> {
      - if <def[value].unescaped.as_cuboid.is_within[<context.entity.location>]> {
        - determine cancelled
        }
      }
    on item_frame damaged by block_explosion:
    - foreach <global.flag[playerstore].escape_contents> {
      - if <def[value].unescaped.as_cuboid.is_within[<context.entity.location>]> {
        - determine cancelled
        }
      }
    on player right clicks with i@storelocationstick4:
    - if <global.flag[playerstore].escape_contents> == null {
      - run "storelocationstick2" def:<context.location> as:<player> delay:1t
      - flag player location1:<context.location>
      - narrate "<dark_purple>Cuboid location 1 selected"
      - determine cancelled
      }
    - foreach <global.flag[playerstore].escape_contents> {
      - if <def[value].unescaped.as_cuboid.is_within[<context.location>]> {
        - determine cancelled
        }
        else {
        - run "storelocationstick2" def:<context.location> as:<player> delay:1t
        - flag player location1:<context.location>
        - narrate "<dark_purple>Cuboid location 1 selected"
        - determine cancelled
        }
      }
    on player left clicks with i@storelocationstick4:
    - if <global.flag[playerstore].escape_contents> == null {
      - run "storelocationstick2" def:<context.location> as:<player> delay:1t
      - flag player location2:<context.location>
      - narrate "<dark_purple>Cuboid location 2 selected"
      - determine cancelled
      }
    - foreach <global.flag[playerstore].escape_contents> {
      - if <def[value].unescaped.as_cuboid.is_within[<context.location>]> {
        - determine cancelled
        }
        else {
        - flag player location2:<context.location>
        - run "storelocationstick2" def:<context.location> as:<player> delay:1t
        - narrate "<dark_purple>Cuboid location 2 selected"
        - determine cancelled
        }
      }
    on player drops i@storelocationstick4:
    - execute as_op "npc owner <player.name> --id <player.selected_npc.id>"
    - assignment set npc:<player.selected_npc> script:StorekeeperPlayerOwned
    - flag <player.selected_npc> playerstore:cu@<player.flag[location1]>|<player.flag[location2]>
    - flag player location1:!
    - flag player location2:!
    - flag server storenpcs:->:<npc>
    - run "storeselectorremover2" delay:1t
    - narrate "<dark_purple>tell the npc <green>'SET' <dark_purple>to set the items in the frame"
    - determine cancelled
    on player right clicks e@item_frame:
    - foreach <global.flag[playerstore].escape_contents> {
      - if <def[value].unescaped.as_cuboid.is_within[<context.location>]> {
        - if <player.item_in_hand.scriptname> == 'shopping bag' {
          - if <in@<player.name>_shopping_bag.stacks> >= 18 {
            - narrate "<aqua>Your shopping bag is full!"
            } 
            else if <<player.flag[storekeepernpc]>.owner> == server {
            - inventory add o:<c.entity.framed_item> d:in@<player.name>_shopping_bag
            - if <c.entity.framed_item.display> != null 
              narrate "<aqua>You add a <green><c.entity.framed_item.display> <aqua>to your shopping bag."
              else 
              narrate "<aqua>You add <green><c.entity.framed_item.material.name.replace[_].with[ ]> <aqua>to your shopping bag."
              - playsound <player> sound:DIG_GRASS
            }
            else if <<player.flag[storekeepernpc]>.inventory.list_contents.simple> contains <context.entity.framed_item> {
            - inventory add o:<c.entity.framed_item> d:in@<player.name>_shopping_bag
            - take <c.entity.framed_item> from:<<player.flag[storekeepernpc]>.inventory>
            - if <c.entity.framed_item.display> != null 
              narrate "<aqua>You add a <green><c.entity.framed_item.display> <aqua>to your shopping bag."
              else 
              narrate "<aqua>You add <green><c.entity.framed_item.material.name.replace[_].with[ ]> <aqua>to your shopping bag."
              - playsound <player> sound:DIG_GRASS
              }
              else {
              - narrate "<dark_red>That item is out of stock!"
              }
            }
          - determine cancelled
          }
        }
      }
    on player places block:
    - foreach <global.flag[playerstore].escape_contents> {
      - if <def[value].unescaped.as_cuboid.is_within[<context.location>]> {
        - if <player.is_sneaking> && <player.is_op> {
          - queue clear
          } else {
          - determine cancelled
          }
        }
      }
    on player breaks e@item_frame:
    - foreach <global.flag[playerstore].escape_contents> {
      - if <def[value].unescaped.as_cuboid.is_within[<context.location>]> {
        - if <player.is_sneaking> && <player.is_op> {
          - queue clear
          } 
          else {
          - if <c.hanging.framed_item.display> != null 
            narrate "It's a <c.hanging.framed_item.display>."
            else 
            narrate "It's <c.hanging.framed_item.material.formatted>."
          - narrate "Right click it with your shopping bag to add it to your transaction."
          - determine cancelled
          }
        }
      }

    on player breaks block:
    - foreach <global.flag[playerstore].escape_contents> {
      - if <def[value].unescaped.as_cuboid.is_within[<context.location>]> {
        - if <player.is_sneaking> && <player.is_op> {
          - queue clear
          } else {
          - determine cancelled
          }
        - if <player.flag[storekeeper_warned]> == null {
            - narrate '<aqua>[storekeeper] -> You<&co> <dark_red>Hey! <aqua>You break it, you buy it! <dark_red>Be careful!'
            - flag <player> storekeeper_warned duration:5s
          } 
        }
      }
    
    on entity damages e@item_frame:
    - foreach <global.flag[playerstore].escape_contents> {
      - if <def[value].unescaped.as_cuboid.is_within[<context.entity.location>]> {
        - if <player.is_sneaking> && <player.is_op> {
          - queue clear
          } 
          else {
          - foreach <global.flag[playerstore].escape_contents> {
            - if <def[value].unescaped.as_cuboid.is_within[<context.entity.location>]> {
              - if <server.flag[<context.entity.framed_item.full.escaped>]> == null {
                - flag server <context.entity.framed_item.full.escaped>:1.00
                - determine cancelled
                } 
                else if <<player.flag[storekeepernpc]>.owner> == server {
                - define price <yaml[prices].read[prices.<context.entity.framed_item.full.escaped>].mul[2].mul[<server.flag[<context.entity.framed_item.full.escaped>]>].as_int>
                - narrate "<green>%price%"
                - determine cancelled
                }
                else {
                - define price <<player.flag[storekeepernpc]>.flag[sell_<context.entity.framed_item.full.escaped>]>
                - narrate "<green>%price%"
                - determine cancelled
                }
              }
            }
          }
        }
      }
      
    on player right clicks entity with i@shopping bag:
    - if <context.entity.as_npc> == <npc> {
      - flag player shopkeeper:<npc>
      }
    on player places item_frame:
    - foreach <global.flag[playerstore].escape_contents> {
      - if <def[value].unescaped.as_cuboid.is_within[<context.location>]> {
        - if <player.is_sneaking> && <player.is_op> {
          - queue clear
          } else {
          - determine cancelled
          }
        }
      }
    on player right clicks with i@shopping bag:  
    - define is_shopping false  
    - foreach <global.flag[playerstore].escape_contents> {  
      - if <player.location.is_within[<def[value].unescaped>]> {  
        - define is_shopping true  
        - foreach stop  
        }  
      }  
    - if !<player.inventory.qty[i@shopping bag]> >= 2 {
      - take 'i@shopping bag' qty:36
      - note 'in@player bag' as:<player.name>_shopping_bag
      }
    - if !%is_shopping% {  
      - inventory clear d:in@<player.name>_shopping_bag  
      - take 'i@shopping bag'  
      - narrate '<dark_red>You are not shopping right now!'  
      }  
      else if <in@<player.name>_shopping_bag||null> == null && %is_shopping% {  
      - note 'in@player bag' as:<player.name>_shopping_bag  
      }   
      else if %is_shopping% {
      - if !<context.location.find.entities[item].within[1].exclude[<player>].get[1]||null> == null {
        - inventory add o:<<player.location.cursor_on.find.entities[item].within[1].exclude[<player>].get[1]>.item> d:in@<player.name>_shopping_bag    
        - narrate "<aqua>You add <green><<context.location.find.entities[item].within[1].exclude[<player>].get[1]>.item.material.name.replace[_].with[ ]> <aqua>to your shopping bag."
        }
        else if !<player.location.cursor_on.find.entities[item].within[1].exclude[<player>].get[1]||null> == null {
        - inventory add o:<<player.location.cursor_on.find.entities[item].within[1].exclude[<player>].get[1]>.item> d:in@<player.name>_shopping_bag    
        - narrate "<aqua>You add <green><<player.location.cursor_on.find.entities[item].within[1].exclude[<player>].get[1]>.item.material.name.replace[_].with[ ]> <aqua>to your shopping bag."
        }
        else {
        - narrate '<aqua>You take a look in your shopping bag...'  
        - inventory open d:in@<player.name>_shopping_bag  
        }
      }   
    - determine cancelled  
 

    on player right clicks with i@selling bag:
    - define is_shopping false  
    - foreach <global.flag[playerstore].escape_contents> {  
      - if <player.location.is_within[<def[value].unescaped>]> {  
        - define is_shopping true  
        - foreach stop  
        }  
      }  
    - if !%is_shopping% {  
      - inventory clear d:in@<player.name>_selling_bag
      - narrate '<dark_red>You are not in a shop right now!'
      - take 'i@selling bag'
      - determine cancelled
      }  
      else if <in@<player.name>_shopping_bag||null> == null && %is_shopping% {  
      - note 'in@player bag' as:<player.name>_selling_bag
      - inventory open d:in@<player.name>_selling_bag
      - determine cancelled
      }   
      else if %is_shopping% {  
      - inventory open d:in@<player.name>_selling_bag
      - determine cancelled
      }   
    - determine cancelled  
    
    on player right clicks with i@item_bag:
    - foreach <global.flag[playerstore].escape_contents> {
      - if <def[value].unescaped.as_cuboid.is_within[<context.location>]> && <player.location.facing[<player.flag[shopkeeper]>]> {
        } else {
        - narrate '<aqua>You take a look in your shopping bag...'
        - inventory open "d:in@<context.item.lore.as_string.strip_color>_item_bag"
        }
      - determine cancelled   
      }
    on player drops i@shopping bag:
    - narrate '<aqua>You ditch your shopping bag.'
    - if !<<player.flag[storekeepernpc]>.owner> == server {
      - inventory add o:in@<player.name>_shopping_bag 'd:<<player.flag[storekeepernpc]>.inventory>'
      }
    - run "bagremovertaskPlayer Owned" delay:1t
    - determine cancelled
    on player drops i@selling bag:
    - narrate '<aqua>You ditch your selling bag.'
    - run "bagremovertask1Player Owned" delay:1t
    - determine cancelled
    on player clicks in inventory:
    - if <c.inventory> == 'in@<player.name>_shopping_bag' && <player.item_in_hand> == 'i@shopping bag' {
      - determine passively cancelled
      - inventory update d:<player.inventory>
      }
    - if <c.inventory> == 'in@<player.name>_shopping_bag' && <player.item_in_hand> == 'i@shopping bag' {
      - if <context.is_shift_click> {
        - determine passively cancelled
        - inventory update d:<player.inventory>
        }
      }
    - if <c.inventory> == 'in@<player.name>_selling_bag' {
      - if "li@i@shopping bag|i@selling bag|i@item_bag" contains <context.item> {
        - inventory update
        - determine cancelled
        }
      }
    on player picks up i@shopping bag:
    - if '<player.inventory.contains[i@shopping bag]>' {
        - determine cancelled
      } else {
        - note 'in@player bag' as:<player.name>_shopping_bag
        - narrate "<aqua>You pick up a brand new shopping bag. It's empty!"
      }
    on player closes inventory:
    - if <player.item_in_hand> == 'i@item_bag' {
      - if <context.inventory> == <player.inventory> {
      } else {
      - foreach <in@<player.item_in_hand.lore.as_string.strip_color>_item_bag.list_contents> {
        - drop %value% <player.location>
        }
      - narrate "<dark_red>your shopping bag ripped"
      - take iteminhand
      }
    on player picks up i@playerstorekeeperegg:
    - narrate "<aqua>To learn how to set up the frame shop please visit <green>https://www.youtube.com/watch?v=FlYEog5-KxU"
    on player clicks i@playerstorekeeperegg in inventory:
    - narrate "<aqua>To learn how to set up the frame shop please visit <green>https://www.youtube.com/watch?v=FlYEog5-KxU"
'player bag':
  type: inventory
  size: 18
 
  # It's empty!
'selling bag':
  type: inventory
  size: 18

'shopping bag':
  type: item

  material: boat
  display name: shopping bag
  lore:
  - Give this to a shopkeeper to check out.
  - Right click to see the contents.
'item_bag':
  type: item

  material: boat
  display name: item bag
  lore:
  - <red>this bag contains the items you bought
'selling bag':
  type: item

  material: boat
  display name: selling bag
  lore:
  - <green>Right click the shopkeeper with this bag to sell the items in it.
  - <green>Left click the shopkeeper with this bag to see what the 
  - <green>total price of your items will be.
storelocationstick4:
  type: item
  material: m@iron_hoe
  display name: store_selector_tool
storeselectorremover2:
  type: task
  debug: false
  script:
  - take i@storelocationstick4
bagremovertaskPlayer Owned:
  type: task
  debug: false
  script:
  - take 'i@shopping bag'
bagremovertask1Player Owned:
  type: task
  debug: false
  script:
  - take 'i@selling bag'
playerstorekeeperegg:
  type: item
  material: m@monster_egg
  display name: shop_keeper
storelocationstick3:
  type: task
  debug: false
  script:
  - give <player> "i@storelocationstick4"
storelocationstick2:
  type: task
  script:
  - showfake m@red_wool %1% to:<player> d:30s




Comments
No one has posted a comment! Post one below: