Advertisement
Guest User

Untitled

a guest
Jul 10th, 2018
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.09 KB | None | 0 0
  1. smartshop={user={},tmp={},dir={{x=0,y=0,z=-1},{x=-1,y=0,z=0},{x=0,y=0,z=1},{x=1,y=0,z=0}},dpos={
  2. {{x=0.2,y=0.2,z=0},{x=-0.2,y=0.2,z=0},{x=0.2,y=-0.2,z=0},{x=-0.2,y=-0.2,z=0}},
  3. {{x=0,y=0.2,z=0.2},{x=0,y=0.2,z=-0.2},{x=0,y=-0.2,z=0.2},{x=0,y=-0.2,z=-0.2}},
  4. {{x=-0.2,y=0.2,z=0},{x=0.2,y=0.2,z=0},{x=-0.2,y=-0.2,z=0},{x=0.2,y=-0.2,z=0}},
  5. {{x=0,y=0.2,z=-0.2},{x=0,y=0.2,z=0.2},{x=0,y=-0.2,z=-0.2},{x=0,y=-0.2,z=0.2}}}
  6. }
  7.  
  8. minetest.register_craft({
  9. output = "smartshop:shop",
  10. recipe = {
  11. {"default:chest_locked", "default:chest_locked", "default:chest_locked"},
  12. {"default:sign_wall_wood", "default:chest_locked", "default:sign_wall_wood"},
  13. {"default:sign_wall_wood", "default:torch", "default:sign_wall_wood"},
  14. }
  15. })
  16.  
  17. smartshop.use_offer=function(pos,player,n)
  18. local pressed={}
  19. pressed["buy" .. n]=true
  20. smartshop.user[player:get_player_name()]=pos
  21. smartshop.receive_fields(player,pressed)
  22. smartshop.user[player:get_player_name()]=nil
  23. smartshop.update(pos)
  24. end
  25.  
  26. smartshop.get_offer=function(pos)
  27. if not pos or not minetest.get_node(pos) then return end
  28. if minetest.get_node(pos).name~="smartshop:shop" then return end
  29. local meta=minetest.get_meta(pos)
  30. local inv=meta:get_inventory()
  31. local offer={}
  32. for i=1,4,1 do
  33. offer[i]={
  34. give=inv:get_stack("give" .. i,1):get_name(),
  35. give_count=inv:get_stack("give" .. i,1):get_count(),
  36. pay=inv:get_stack("pay" .. i,1):get_name(),
  37. pay_count=inv:get_stack("pay" .. i,1):get_count(),
  38. }
  39. end
  40. return offer
  41. end
  42.  
  43.  
  44. smartshop.receive_fields=function(player,pressed)
  45. local pos = smartshop.user[player:get_player_name()]
  46. if not pos then return end
  47. if pressed.customer then
  48. return smartshop.showform(smartshop.user[player:get_player_name()],player,true)
  49. elseif pressed.sellall then
  50. local meta=minetest.get_meta(pos)
  51. local pname=player:get_player_name()
  52. if meta:get_int("sellall")==0 then
  53. meta:set_int("sellall",1)
  54. minetest.chat_send_player(pname, "Sell your stock and give line")
  55. else
  56. meta:set_int("sellall",0)
  57. minetest.chat_send_player(pname, "Sell your stock only")
  58. end
  59. elseif pressed.tooglelime then
  60. local meta=minetest.get_meta(pos)
  61. local pname=player:get_player_name()
  62. if meta:get_int("type")==0 then
  63. meta:set_int("type",1)
  64. minetest.chat_send_player(pname, "Your stock is limeted")
  65. else
  66. meta:set_int("type",0)
  67. minetest.chat_send_player(pname, "Your stock is unlimeted")
  68. end
  69. elseif not pressed.quit then
  70. local n=1
  71. for i=1,4,1 do
  72. n=i
  73. if pressed["buy" .. i] then break end
  74. end
  75. local meta=minetest.get_meta(pos)
  76. local type=meta:get_int("type")
  77. local sellall=meta:get_int("sellall")
  78. local inv=meta:get_inventory()
  79. local pinv=player:get_inventory()
  80. local pname=player:get_player_name()
  81. if pressed["buy" .. n] then
  82. local name=inv:get_stack("give" .. n,1):get_name()
  83. local stack=name .." ".. inv:get_stack("give" .. n,1):get_count()
  84. local pay=inv:get_stack("pay" .. n,1):get_name() .." ".. inv:get_stack("pay" .. n,1):get_count()
  85. if name~="" then
  86. if type==1 and inv:room_for_item("main", pay)==false then minetest.chat_send_player(pname, "Error: The owners stock is full, cant receive, exchange aborted.") return end
  87. if type==1 and sellall==1 and inv:contains_item("main", stack)==false and inv:contains_item("give" .. n, stack)==true then
  88. inv:add_item("main", stack)
  89. inv:remove_item("give" .. n, stack)
  90. end
  91. if type==1 and inv:contains_item("main", stack)==false then minetest.chat_send_player(pname, "Error: The owners stock is end.") return end
  92. if not pinv:contains_item("main", pay) then minetest.chat_send_player(pname, "Error: You dont have enough in your inventory to buy this, exchange aborted.") return end
  93. if not pinv:room_for_item("main", stack) then minetest.chat_send_player(pname, "Error: Your inventory is full, exchange aborted.") return end
  94. pinv:remove_item("main", pay)
  95. pinv:add_item("main", stack)
  96. if type==1 then
  97. inv:remove_item("main", stack)
  98. inv:add_item("main", pay)
  99. end
  100. end
  101. end
  102. else
  103. smartshop.update_info(pos)
  104. if smartshop.user[player:get_player_name()] or minetest.check_player_privs(player:get_player_name(), {protection_bypass=true}) then
  105. local meta=minetest.get_meta(smartshop.user[player:get_player_name()])
  106. if meta:get_string("owner")==player:get_player_name() then
  107. smartshop.update(smartshop.user[player:get_player_name()],"update")
  108. end
  109. end
  110. smartshop.user[player:get_player_name()]=nil
  111. end
  112. end
  113.  
  114. minetest.register_on_player_receive_fields(function(player, form, pressed)
  115. if form=="smartshop.showform" then
  116. smartshop.receive_fields(player,pressed)
  117. end
  118. end)
  119.  
  120.  
  121.  
  122.  
  123. smartshop.update_info=function(pos)
  124. local meta=minetest.get_meta(pos)
  125. local inv = meta:get_inventory()
  126. local owner=meta:get_string("owner")
  127. local gve=0
  128. if meta:get_int("sellall")==1 then gve=1 end
  129. if meta:get_int("type")==0 then
  130. meta:set_string("infotext","(Smartshop by " .. owner ..") Stock is unlimeted")
  131. return false
  132. end
  133. local name=""
  134. local count=0
  135. local stuff={}
  136. for i=1,4,1 do
  137. stuff["count" ..i]=inv:get_stack("give" .. i,1):get_count()
  138. stuff["name" ..i]=inv:get_stack("give" .. i,1):get_name()
  139. stuff["stock" ..i]=gve*stuff["count" ..i]
  140. stuff["buy" ..i]=0
  141. for ii=1,32,1 do
  142. name=inv:get_stack("main",ii):get_name()
  143. count=inv:get_stack("main",ii):get_count()
  144. if name==stuff["name" ..i] then
  145. stuff["stock" ..i]=stuff["stock" ..i]+count
  146. end
  147. end
  148. local nstr=(stuff["stock" ..i]/stuff["count" ..i]) ..""
  149. nstr=nstr.split(nstr, ".")
  150. stuff["buy" ..i]=tonumber(nstr[1])
  151.  
  152. if stuff["name" ..i]=="" or stuff["buy" ..i]==0 then
  153. stuff["buy" ..i]=""
  154. stuff["name" ..i]=""
  155. else
  156. if string.find(stuff["name" ..i],":")~=nil then
  157. stuff["name" ..i]=stuff["name" ..i].split(stuff["name" ..i],":")[2]
  158. end
  159. stuff["buy" ..i]="(" ..stuff["buy" ..i] ..") "
  160. stuff["name" ..i]=stuff["name" ..i] .."\n"
  161. end
  162. end
  163. meta:set_string("infotext",
  164. "(Smartshop by " .. owner ..") Purchases left:\n"
  165. .. stuff.buy1 .. stuff.name1
  166. .. stuff.buy2 .. stuff.name2
  167. .. stuff.buy3 .. stuff.name3
  168. .. stuff.buy4 .. stuff.name4
  169. )
  170. end
  171.  
  172.  
  173.  
  174.  
  175. smartshop.update=function(pos,stat)
  176. --clear
  177. local spos=minetest.pos_to_string(pos)
  178. for _, ob in ipairs(minetest.env:get_objects_inside_radius(pos, 2)) do
  179. if ob and ob:get_luaentity() and ob:get_luaentity().smartshop and ob:get_luaentity().pos==spos then
  180. ob:remove()
  181. end
  182. end
  183. if stat=="clear" then return end
  184. --update
  185. local meta=minetest.get_meta(pos)
  186. local inv = meta:get_inventory()
  187. local node=minetest.get_node(pos)
  188. local dp = smartshop.dir[node.param2+1]
  189. if not dp then return end
  190. pos.x = pos.x + dp.x*0.01
  191. pos.y = pos.y + dp.y*6.5/16
  192. pos.z = pos.z + dp.z*0.01
  193. for i=1,4,1 do
  194. local item=inv:get_stack("give" .. i,1):get_name()
  195. local pos2=smartshop.dpos[node.param2+1][i]
  196. if item~="" then
  197. smartshop.tmp.item=item
  198. smartshop.tmp.pos=spos
  199. local e = minetest.env:add_entity({x=pos.x+pos2.x,y=pos.y+pos2.y,z=pos.z+pos2.z},"smartshop:item")
  200. e:setyaw(math.pi*2 - node.param2 * math.pi/2)
  201. end
  202. end
  203. end
  204.  
  205.  
  206. minetest.register_entity("smartshop:item",{
  207. hp_max = 1,
  208. visual="wielditem",
  209. visual_size={x=.20,y=.20},
  210. collisionbox = {0,0,0,0,0,0},
  211. physical=false,
  212. textures={"air"},
  213. smartshop=true,
  214. type="",
  215. on_activate = function(self, staticdata)
  216. if smartshop.tmp.item ~= nil then
  217. self.item=smartshop.tmp.item
  218. self.pos=smartshop.tmp.pos
  219. smartshop.tmp={}
  220. else
  221. if staticdata ~= nil and staticdata ~= "" then
  222. local data = staticdata:split(';')
  223. if data and data[1] and data[2] then
  224. self.item = data[1]
  225. self.pos = data[2]
  226. end
  227. end
  228. end
  229. if self.item ~= nil then
  230. self.object:set_properties({textures={self.item}})
  231. else
  232. self.object:remove()
  233. end
  234. end,
  235. get_staticdata = function(self)
  236. if self.item ~= nil and self.pos ~= nil then
  237. return self.item .. ';' .. self.pos
  238. end
  239. return ""
  240. end,
  241. })
  242.  
  243.  
  244. smartshop.showform=function(pos,player,re)
  245. local meta=minetest.get_meta(pos)
  246. local creative=meta:get_int("creative")
  247. local inv = meta:get_inventory()
  248. local gui=""
  249. local spos=pos.x .. "," .. pos.y .. "," .. pos.z
  250. local uname=player:get_player_name()
  251. local owner=meta:get_string("owner")==uname
  252. if minetest.check_player_privs(uname, {protection_bypass=true}) then owner=true end
  253. if re then owner=false end
  254. smartshop.user[uname]=pos
  255. if owner then
  256. if meta:get_int("type")==0 and not (minetest.check_player_privs(uname, {creative=true}) or minetest.check_player_privs(uname, {give=true})) then
  257. meta:set_int("creative",0)
  258. meta:set_int("type",1)
  259. creative=0
  260. end
  261. gui=""
  262. .."size[8,10]"
  263. .."button_exit[6,0;1.5,1;customer;Customer]"
  264. .."button[7.2,0;1,1;sellall;All]"
  265. .."label[0,0.2;Item:]"
  266. .."label[0,1.2;Price:]"
  267. .."list[nodemeta:" .. spos .. ";give1;2,0;1,1;]"
  268. .."list[nodemeta:" .. spos .. ";pay1;2,1;1,1;]"
  269. .."list[nodemeta:" .. spos .. ";give2;3,0;1,1;]"
  270. .."list[nodemeta:" .. spos .. ";pay2;3,1;1,1;]"
  271. .."list[nodemeta:" .. spos .. ";give3;4,0;1,1;]"
  272. .."list[nodemeta:" .. spos .. ";pay3;4,1;1,1;]"
  273. .."list[nodemeta:" .. spos .. ";give4;5,0;1,1;]"
  274. .."list[nodemeta:" .. spos .. ";pay4;5,1;1,1;]"
  275. if creative==1 then
  276. gui=gui .."label[0.5,-0.4;Your stock is unlimeted becaouse you have creative or give]"
  277. .."button[6,1;2.2,1;tooglelime;Toogle lime]"
  278. end
  279. gui=gui
  280. .."list[nodemeta:" .. spos .. ";main;0,2;8,4;]"
  281. .."list[current_player;main;0,6.2;8,4;]"
  282. .."listring[nodemeta:" .. spos .. ";main]"
  283. .."listring[current_player;main]"
  284. else
  285. gui=""
  286. .."size[8,6]"
  287. .."list[current_player;main;0,2.2;8,4;]"
  288. .."label[0,0.2;Item:]"
  289. .."label[0,1.2;Price:]"
  290. .."list[nodemeta:" .. spos .. ";give1;2,0;1,1;]"
  291. .."item_image_button[2,1;1,1;".. inv:get_stack("pay1",1):get_name() ..";buy1;\n\n\b\b\b\b\b" .. inv:get_stack("pay1",1):get_count() .."]"
  292. .."list[nodemeta:" .. spos .. ";give2;3,0;1,1;]"
  293. .."item_image_button[3,1;1,1;".. inv:get_stack("pay2",1):get_name() ..";buy2;\n\n\b\b\b\b\b" .. inv:get_stack("pay2",1):get_count() .."]"
  294. .."list[nodemeta:" .. spos .. ";give3;4,0;1,1;]"
  295. .."item_image_button[4,1;1,1;".. inv:get_stack("pay3",1):get_name() ..";buy3;\n\n\b\b\b\b\b" .. inv:get_stack("pay3",1):get_count() .."]"
  296. .."list[nodemeta:" .. spos .. ";give4;5,0;1,1;]"
  297. .."item_image_button[5,1;1,1;".. inv:get_stack("pay4",1):get_name() ..";buy4;\n\n\b\b\b\b\b" .. inv:get_stack("pay4",1):get_count() .."]"
  298. end
  299. minetest.after((0.1), function(gui)
  300. return minetest.show_formspec(player:get_player_name(), "smartshop.showform",gui)
  301. end, gui)
  302. end
  303.  
  304. minetest.register_node("smartshop:shop", {
  305. description = "Smartshop",
  306. tiles = {"default_chest_top.png^[colorize:#ffffff77^default_obsidian_glass.png"},
  307. groups = {choppy = 2, oddly_breakable_by_hand = 1,tubedevice = 1, tubedevice_receiver = 1},
  308. drawtype="nodebox",
  309. node_box = {type="fixed",fixed={-0.5,-0.5,-0.0,0.5,0.5,0.5}},
  310. paramtype2="facedir",
  311. paramtype = "light",
  312. sunlight_propagates = true,
  313. light_source = 10,
  314. tube = {insert_object = function(pos, node, stack, direction)
  315. local meta = minetest.get_meta(pos)
  316. local inv = meta:get_inventory()
  317. local added = inv:add_item("main", stack)
  318. return added
  319. end,
  320. can_insert = function(pos, node, stack, direction)
  321. local meta = minetest.get_meta(pos)
  322. local inv = meta:get_inventory()
  323. return inv:room_for_item("main", stack)
  324. end,
  325. input_inventory = "main",
  326. connect_sides = {left = 1, right = 1, front = 1, back = 1, top = 1, bottom = 1}},
  327. after_place_node = function(pos, placer)
  328. local meta=minetest.get_meta(pos)
  329. meta:set_string("owner",placer:get_player_name())
  330. meta:set_string("infotext", "Shop by: " .. placer:get_player_name())
  331. meta:set_int("type",1)
  332. meta:set_int("sellall",1)
  333. if minetest.check_player_privs(placer:get_player_name(), {creative=true}) or minetest.check_player_privs(placer:get_player_name(), {give=true}) then
  334. meta:set_int("creative",1)
  335. meta:set_int("type",0)
  336. meta:set_int("sellall",0)
  337. end
  338. end,
  339. on_construct = function(pos)
  340. local meta=minetest.get_meta(pos)
  341. meta:set_int("state", 0)
  342. meta:get_inventory():set_size("main", 32)
  343. meta:get_inventory():set_size("give1", 1)
  344. meta:get_inventory():set_size("pay1", 1)
  345. meta:get_inventory():set_size("give2", 1)
  346. meta:get_inventory():set_size("pay2", 1)
  347. meta:get_inventory():set_size("give3", 1)
  348. meta:get_inventory():set_size("pay3", 1)
  349. meta:get_inventory():set_size("give4", 1)
  350. meta:get_inventory():set_size("pay4", 1)
  351. end,
  352. on_rightclick = function(pos, node, player, itemstack, pointed_thing)
  353. smartshop.showform(pos,player)
  354. end,
  355. allow_metadata_inventory_put = function(pos, listname, index, stack, player)
  356. if minetest.get_meta(pos):get_string("owner")==player:get_player_name() or minetest.check_player_privs(player:get_player_name(), {protection_bypass=true}) then
  357. return stack:get_count()
  358. end
  359. return 0
  360. end,
  361. allow_metadata_inventory_take = function(pos, listname, index, stack, player)
  362. if minetest.get_meta(pos):get_string("owner")==player:get_player_name() or minetest.check_player_privs(player:get_player_name(), {protection_bypass=true}) then
  363. return stack:get_count()
  364. end
  365. return 0
  366. end,
  367. allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
  368. if minetest.get_meta(pos):get_string("owner")==player:get_player_name() or minetest.check_player_privs(player:get_player_name(), {protection_bypass=true}) then
  369. return count
  370. end
  371. return 0
  372. end,
  373. can_dig = function(pos, player)
  374. local meta=minetest.get_meta(pos)
  375. local inv=meta:get_inventory()
  376. if ((meta:get_string("owner")==player:get_player_name() or minetest.check_player_privs(player:get_player_name(), {protection_bypass=true})) and inv:is_empty("main") and inv:is_empty("pay1") and inv:is_empty("pay2") and inv:is_empty("pay3") and inv:is_empty("pay4") and inv:is_empty("give1") and inv:is_empty("give2") and inv:is_empty("give3") and inv:is_empty("give4")) or meta:get_string("owner")=="" then
  377. smartshop.update(pos,"clear")
  378. return true
  379. end
  380. end,
  381. })
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement