From d207232b1e8330e3400f5b84faceb57a0321bb9d Mon Sep 17 00:00:00 2001 From: AiTechEye <40591179+AiTechEye@users.noreply.github.com> Date: Tue, 26 Jun 2018 09:06:31 +0200 Subject: [PATCH] Add files via upload --- aliveai_trader/depends.txt | 3 + aliveai_trader/init.lua | 494 +++++++++++++++++++++ aliveai_trader/readme.txt | 28 ++ aliveai_trader/textures/aliveai_trader.png | Bin 0 -> 2076 bytes aliveai_trader/textures/aliveai_worker.png | Bin 0 -> 504 bytes 5 files changed, 525 insertions(+) create mode 100644 aliveai_trader/depends.txt create mode 100644 aliveai_trader/init.lua create mode 100644 aliveai_trader/readme.txt create mode 100644 aliveai_trader/textures/aliveai_trader.png create mode 100644 aliveai_trader/textures/aliveai_worker.png diff --git a/aliveai_trader/depends.txt b/aliveai_trader/depends.txt new file mode 100644 index 0000000..90bc0c4 --- /dev/null +++ b/aliveai_trader/depends.txt @@ -0,0 +1,3 @@ +default +aliveai +nitroglycerine? \ No newline at end of file diff --git a/aliveai_trader/init.lua b/aliveai_trader/init.lua new file mode 100644 index 0000000..a74afa0 --- /dev/null +++ b/aliveai_trader/init.lua @@ -0,0 +1,494 @@ +aliveai_trader={} + +aliveai.savedata.trader=function(self) + if self.trader then + return { + trader_inventory=self.trader_inventory, + trader=self.trader, + trader_select=self.trader_select, + } + end + + if self.work_name then + return { + work_dig=self.work_dig, + work_take=self.work_take, + work_take_name=self.work_take_name, + work_place=self.work_place, + work_place_name=self.work_place_name, + work_add=self.work_add, + work_add_name=self.work_add_name, + work_name=self.work_name, + work_step=self.work_step + } + end +end + +aliveai.loaddata.trade=function(self,r) + if r.trader then + self.trader_inventory=r.trader_inventory + self.trader=r.trader + self.trader_select=r.trader_select + end + if r.work_name then + self.work_dig=r.work_dig + self.work_take=r.work_take + self.work_take_name=r.work_take_name + self.work_place=r.work_place + self.work_place_name=r.work_place_name + self.work_add=r.work_add + self.work_add_name=r.work_add_name + self.work_name=r.work_name + self.work_step=r.work_step + end + return self +end + + + +aliveai.create_bot({ + name="trader", + texture="aliveai_trader.png", + building=0, + annoyed_by_staring=0, + hp=40, + name_color="ffff00", + on_step=function(self,dtime) + if self.offering then + aliveai.rndwalk(self,false) + aliveai.stand(self) + return self + end + end, + click=function(self,clicker) + if not self.trader then + aliveai.say(self,"sorry, have no offer... try again") + self.spawn(self) + end + self.offering=true + aliveai.lookat(self,clicker:get_pos()) + aliveai_trader.form(self,clicker) + end, + spawn=function(self) + self.botname="Trader: " .. self.botname + self.object:set_properties({nametag=self.botname,nametag_color="#" .. self.botname}) + self.trader_inventory={} + self.trader={} + self.trader_select=1 + local count=0 + local c=1 + aliveai.showstatus(self,"creating offer") + for i=0,20,1 do + for i, v in pairs(minetest.registered_items) do + if math.random(1,10)==1 and not self.trader_inventory[i] and minetest.get_item_group(i, "not_in_creative_inventory")==0 and minetest.get_all_craft_recipes(i) then + count=count+1 + self.trader_inventory[i]=1 + if count>=20 then break end + end + end + if count>=20 then break end + end + if count<1 then + self.trader_inventory=nil + aliveai.showstatus(self,"failed to create offer") + return self + end + count=0 + for i=0,20,1 do + for i, v in pairs(minetest.registered_items) do + if math.random(1,20)==1 and not self.trader_inventory[i] and minetest.get_item_group(i, "not_in_creative_inventory")==0 and minetest.get_all_craft_recipes(i) then + count=count+1 + c=math.random(5,20) + if v.stack_max<10 then c=aliveai.random(1,v.stack_max) end + self.trader[i]=c + if count>=10 then return self end + end + end + end + if count<1 then + self.trader_inventory=nil + self.trader=nil + aliveai.showstatus(self,"failed to create prices") + return self + end + end, +}) +aliveai_trader.form=function(self,player) + local c=0 + local gui="" + local but="" + local but2="" + local x=0 + local y=0 + local name=player:get_player_name() + if not aliveai_trader.user then aliveai_trader.user={} end + aliveai_trader.user[name]=self + for i, v in pairs(self.trader_inventory) do + c=c+1 + but=but .. "item_image_button[" .. x.. "," .. y.. ";1,1;".. i ..";buy" .. c ..";]" + x=x+1 + if x>=10 then x=0 y=y+1 end + end + x=-1 + c=0 + for i, v in pairs(self.trader) do + c=c+1 + x=x+1 + but2=but2 .. "item_image_button[" .. x.. ",3;1,1;".. i ..";pay" .. c ..";\n\n\b\b\b\b".. v .. "]" + end + gui="" + .."size[10,4]" + .. but + .."label[0,2;Pay with:]" + .."label[" .. (self.trader_select-1.2) ..",2.5;(Selected)]" + .. but2 + minetest.after((0.1), function(gui) + return minetest.show_formspec(player:get_player_name(), "aliveai_trader.form",gui) + end, gui) +end + +minetest.register_on_player_receive_fields(function(player, form, pressed) + if form=="aliveai_trader.form" then + local name=player:get_player_name() + local self=aliveai_trader.user[name] + + if pressed.quit or not (self and self.object) then + if self and self.offering then self.offering=nil end + aliveai_trader.user[name]=nil + return self + end + + for i=1,10,1 do + if pressed["pay" .. i] then + self.trader_select=i + aliveai_trader.form(self,player) + return self + end + end + + for ii=1,20,1 do + if pressed["buy" .. ii] then + local c=0 + for i, v in pairs(self.trader_inventory) do + c=c+1 + if c==ii then + local cc=0 + local inv=player:get_inventory() + if not inv:room_for_item("main", i) then minetest.chat_send_player(name, "Your inventory are full") return end + for iii, vv in pairs(self.trader) do + cc=cc+1 + if cc==self.trader_select then + if not inv:contains_item("main", iii .. " " .. vv) then minetest.chat_send_player(name, "You dont have enough to buy") return end + inv:remove_item("main", iii .. " " .. vv) + aliveai.showstatus(self,"selling: " .. i .." for " .. iii .. " " .. vv) + end + end + inv:add_item("main", i) + return self + end + + end + return self + end + end + aliveai_trader.user[name]=nil + return self + end + + if form=="aliveai_worker.form" then + + if not pressed.quit then return end + + local pname=player:get_player_name() + local self=aliveai_trader.user[pname] + + if not pressed.order or not (self and self.object) then + if self and self.offering then self.offering=nil end + aliveai_trader.user[pname]=nil + aliveai.give_to_bot(self,player) + return self + end + + local names={} + local name="" + local name2="" + local node="" + local pos1={} + local pos2={} + + if pressed.work1=="dig" then + local n=pressed.work2.split(pressed.work2,",") + for i, v in pairs(n) do + if v~=n and v~="" and (minetest.registered_nodes[v] or string.find(v,"group:")~=nil) then + table.insert(names,v) + else + minetest.chat_send_player(pname, v .." is not a node or group") + return + end + end + elseif pressed.work1=="take from inventory" then + local n=pressed.work2.split(pressed.work2,",") + local x=tonumber(n[1]) + local y=tonumber(n[2]) + local z=tonumber(n[3]) + name=n[4] + if name==nil or name=="" then name="main" end + if x and y and z then + pos1={x=x,y=y,z=z} + else + if not (x and y and z) then minetest.chat_send_player(pname, "not all dimensions (x,y,z) is added") + else + minetest.chat_send_player(pname, "void position or name") + end + return + end + end + + if pressed.work3=="place" then + local n=pressed.work4.split(pressed.work4,",") + local x=tonumber(n[1]) + local y=tonumber(n[2]) + local z=tonumber(n[3]) + node=n[4] + if x and y and z and node and minetest.registered_nodes[node] then + pos2={x=x,y=y,z=z} + else + if not (x and y and z) then minetest.chat_send_player(pname, "not all dimensions (x,y,z) is added") + elseif node and not minetest.registered_nodes[node] then minetest.chat_send_player(pname, node .. " is not a node") + else + minetest.chat_send_player(pname, "void position or node") + end + return + end + elseif pressed.work3=="add to inventory" then + local n=pressed.work4.split(pressed.work4,",") + local x=tonumber(n[1]) + local y=tonumber(n[2]) + local z=tonumber(n[3]) + name2=n[4] + if name2==nil or name2=="" then name2="main" end + if x and y and z then + pos2={x=x,y=y,z=z} + else + minetest.chat_send_player(pname, "not all dimensions (x,y,z) is added") + return + end + end + + self.work_dig=nil + self.work_take=nil + self.work_take_name=nil + self.work_place=nil + self.work_place_name=nil + self.work_add=nil + self.work_add_name=nil + self.work_name=pname + self.work_step=1 + + if pressed.work1=="dig" then + self.work_dig=names + elseif pressed.work1=="take from inventory" then + self.work_take=pos1 + self.work_take_name=name + end + + if pressed.work3=="place" then + self.work_place=pos2 + self.work_place_name=node + elseif pressed.work3=="add to inventory" then + self.work_add=pos2 + self.work_add_name=name2 + end + + if pressed.quit or not (self and self.object) then + if self and self.offering then self.offering=nil end + aliveai_trader.user[pname]=nil + return self + end + aliveai_trader.user[pname]=nil + return self + end +end) + + +aliveai_trader.form2=function(self,player) + local name=player:get_player_name() + if not aliveai_trader.user then aliveai_trader.user={} end + aliveai_trader.user[name]=self + local work1="" + local work2="" + local id1=1 + local id2=1 + if self.work_dig then + local c="" + for i, v in pairs(self.work_dig) do + if i>1 then c="," end + work1=work1 .. c .. v + end + id1=1 + end + if self.work_take then + work1=self.work_take.x .. "," .. self.work_take.y .."," .. self.work_take.z .."," ..self.work_take_name + id1=2 + end + if self.work_place then + work2=self.work_place.x .. "," .. self.work_place.y .."," .. self.work_place.z .."," ..self.work_place_name + id2=1 + end + if self.work_add then + work2=self.work_add.x .. "," .. self.work_add.y .."," .. self.work_add.z .."," ..self.work_add_name + id2=2 + end + + if not (self.work_place or self.work_add) then + local pppos=player:get_pos() + pppos=aliveai.roundpos(pppos) + work2=aliveai.strpos(pppos) + end + + local gui="" + .."size[10,4]" + .."tooltip[work2;dig: default:dirt,group:stone...\ntake: x,y,z,inventory_name (default inventory name is main)]" + .."tooltip[work4;place: default:dirt,group:stone...\nadd: x,y,z,inventory_name (default inventory name is main)]" + .."dropdown[0,0;10,1;work1;dig,take from inventory;" .. id1 .."]" + .. "field[0,1;10,1;work2;;" .. work1 .."]" + .."dropdown[0,2;10,4;work3;place,add to inventory;" .. id2 .."]" + .. "field[0,3;10,1;work4;;" .. work2 .."]" + .."button_exit[0,3.2;2,2;order;order]" + minetest.after((0.1), function(gui) + return minetest.show_formspec(player:get_player_name(), "aliveai_worker.form",gui) + end, gui) +end + +aliveai.create_bot({ + name="worker", + texture="aliveai_worker.png", + building=0, + annoyed_by_staring=0, + hp=40, + name_color="ffff00", + crafting=0, + spawn=function(self) + self.botname="worker: " .. self.botname + self.object:set_properties({nametag=self.botname,nametag_color="#" .. self.botname}) + end, + click=function(self,clicker) + if self.work_name and self.work_name~=clicker:get_player_name() then return end + self.offering=true + aliveai.lookat(self,clicker:get_pos()) + aliveai_trader.form2(self,clicker) + end, + on_step=function(self,dtime) + if self.offering then + aliveai.rndwalk(self,false) + aliveai.stand(self) + return self + end +--path + if self.work_path and self.path then + aliveai.path(self) + if self.done=="path" or (math.random(1,10)==1 and aliveai.distance(self,self.work_path)9 then + aliveai.exit_mine(self) + self.work_step=2 + break + end + end + end + end +--take from inventory + if self.work_step==1 and self.work_take then + local p=aliveai.neartarget(self,self.work_take,self.arm,0) + if p then + local pos=aliveai.roundpos(self.object:get_pos()) + pos.y=pos.y-1 + p=aliveai.creatpath(self,pos,aliveai.roundpos(p)) + if p then + self.path=p + self.work_path=self.work_take + end + end + return + end +--place + if self.work_step==2 and self.work_place then + local p=aliveai.neartarget(self,self.work_place,self.arm,0) + if p then + local pos=aliveai.roundpos(self.object:get_pos()) + pos.y=pos.y-1 + p=aliveai.creatpath(self,pos,aliveai.roundpos(p)) + if p then + self.path=p + self.work_path=self.work_place + end + end + return + end +--add to inventory + if self.work_step==2 and self.work_add then + local p=aliveai.neartarget(self,self.work_add,self.arm,0) + if p then + local pos=aliveai.roundpos(self.object:get_pos()) + pos.y=pos.y-1 + p=aliveai.creatpath(self,pos,aliveai.roundpos(p)) + if p then + self.path=p + self.work_path=self.work_add + end + end + return + end + end, +}) diff --git a/aliveai_trader/readme.txt b/aliveai_trader/readme.txt new file mode 100644 index 0000000..6ec9165 --- /dev/null +++ b/aliveai_trader/readme.txt @@ -0,0 +1,28 @@ +threates / evil npc for aliveai + +worker: +right click the bot then you can choose: + + +dig: +list nodes names and groups to dig, like: +"default:dirt,default:tree,group:stone..." + +take: +position (x,y,z) of the chest/node the bots can take items from. +and the name of the inventory, leave the option to make it add "main" by is self: +"x,y,z,main" or "x,y,z" +e.g: +"234,392,-432,storge" + +add: +same as above, but will add items instead +"x,y,z,main" or "x,y,z" +e.g: +"234,392,-432,storge" + +place: +place nodes on a position +"x,y,z,node" +e.g: +"234,392,-432,default:wood" \ No newline at end of file diff --git a/aliveai_trader/textures/aliveai_trader.png b/aliveai_trader/textures/aliveai_trader.png new file mode 100644 index 0000000000000000000000000000000000000000..db3a2a42ff8351dd3a50a73201d9183ad20d870b GIT binary patch literal 2076 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