]> git.lizzy.rs Git - dragonblocks.git/blob - game/plants/api.js
3ceddcbf823ece1065b2563445ea77b57fc455fc
[dragonblocks.git] / game / plants / api.js
1 dragonblocks.registerGroup({
2         name: "plants_wood",
3 });
4 dragonblocks.registerGroup({
5         name: "plants_tree",
6 });
7 plants.registerTree = function(obj){
8         if(! (obj.name && obj.tree && obj.growtimeMin && obj.growtimeMax && obj.saplingDropChance))
9                 return;
10         obj.desc = obj.desc || dblib.humanFormat(obj.name);
11         obj.leavesName = obj.leavesName || "Leaves";
12         obj.treeName = obj.treeName || "Tree";
13         obj.woodName = obj.woodName || "Wood";
14         obj.saplingName = obj.saplingName || "Sapling";
15         obj.woodFromTree = obj.woodFromTree || 1;
16         let name = "plants:" + obj.name;
17         let texture = "plants_" + obj.name;
18         obj.tree.replace("leaves", name + "_leaves");
19         obj.tree.replace("tree", name + "_tree");
20         obj.tree.addFunction((node, x, y) => {
21                 if(node.stable && node.name != name + "_sapling")
22                         return false;
23         });
24         dragonblocks.registerNode({
25                 name: name + "_sapling",
26                 stable: true,
27                 mobstable: false,
28                 texture: texture + "_sapling.png",
29                 groups: ["snappy"],
30                 hardness: 2,
31                 onset: (x, y) => {
32                         dragonblocks.setTimer("growTimer", dblib.random(obj.growtimeMin, obj.growtimeMax), _ => {obj.tree.apply(x, y);}, dragonblocks.getNode(x, y).meta);
33                 },
34                 onremove: (x, y) => {
35                         dragonblocks.clearTimer("growTimer", dragonblocks.getNode(x, y).meta);
36                 },
37                 onplace: (x, y) => {
38                         if(dragonblocks.getNode(x, y + 1) && ! dragonblocks.getNode(x, y + 1).toNode().inGroup("dirt"))
39                                 return false;
40                 },
41                 desc: obj.desc + " " + obj.saplingName,
42                 stacksize: obj.stacksize,
43                 flammable: true,
44         });
45         dragonblocks.registerNode({
46                 name: name + "_tree",
47                 stable: true,
48                 mobstable: false,
49                 zIndex: -1,
50                 texture: texture + "_tree.png",
51                 groups: ["choppy", "plants_tree"],
52                 hardness: 7,
53                 desc: obj.desc + " " + obj.treeName,
54                 stacksize: obj.stacksize,
55                 flammable: true,
56                 onplace: (x, y) => {
57                         setTimeout(_ => {dragonblocks.getNode(x, y).mobstable = true})
58                 }
59         });
60         dragonblocks.registerNode({
61                 name: name + "_wood",
62                 stable: true,
63                 texture: texture + "_wood.png",
64                 groups: ["choppy", "plants_wood"],
65                 hardness: 6,
66                 desc: obj.desc + " " + obj.woodName,
67                 stacksize: obj.stacksize,
68                 flammable: true,
69         });
70         dragonblocks.registerNode({
71                 name: name + "_leaves",
72                 stable: true,
73                 mobstable: false,
74                 zIndex: -1,
75                 texture: texture + "_leaves.png",
76                 groups: ["snappy"],
77                 hardness: 3,
78                 drops: _ => {
79                         if(dblib.random(0, obj.saplingDropChance) == 0)
80                                 return name + "_sapling";
81                         return name + "_leaves";
82                 },
83                 desc: obj.desc + " " + obj.leavesName,
84                 stacksize: obj.stacksize,
85                 flammable: true,
86         });
87         dragonblocks.registerRecipe({
88                 result: name + "_wood " + obj.woodFromTree,
89                 recipe: [
90                         [name + "_tree"]
91                 ]
92         });
93 }
94 plants.registerSimple = function(obj){
95         if(! obj || ! obj.name || ! obj.growtimeMin || ! obj.growtimeMax || ! obj.maxHeight || ! obj.growOn)
96                 return;
97         obj.desc = obj.desc || dblib.humanFormat(obj.name);
98         obj.hardness = obj.hardness || 2,
99         obj.groups = obj.groups || ["snappy"];
100         let name = "plants:" + obj.name;
101         dragonblocks.registerNode({
102                 name: name,
103                 texture: "plants_" + obj.name + ".png",
104                 stable: true,
105                 mobstable: obj.mobstable,
106                 groups: obj.groups,
107                 hardness: obj.hardness,
108                 desc: obj.desc || dblib.humanFormat(obj.name),
109                 onset: (x, y) => {
110                         let meta = dragonblocks.getNode(x, y).meta;
111                         meta.growTime = dblib.random(obj.growtimeMin, obj.growtimeMax);
112                         meta.growInterval = setInterval(_ => {
113                                 if(! dragonblocks.getNode(x, y - 1) || dragonblocks.getNode(x, y - 1).stable)
114                                         return meta.growTime = dblib.random(obj.growtimeMin, obj.growtimeMax);
115                                 let iy = y + 1;
116                                 while(true){
117                                         if(! dragonblocks.getNode(x, iy))
118                                                 return meta.growTime = dblib.random(obj.growtimeMin, obj.growtimeMax);
119                                         else if(iy == y + obj.maxHeight)
120                                                 return meta.growTime = dblib.random(obj.growtimeMin, obj.growtimeMax);
121                                         else if(! dragonblocks.itemMatch(obj.growOn, dragonblocks.getNode(x, iy)))
122                                                 break;
123                                         else if(dragonblocks.getNode(x, iy).name == name)
124                                                 iy++;
125                                         else
126                                                 return meta.growTime = dblib.random(obj.growtimeMin, obj.growtimeMax);
127                                 }
128                                 meta.growTime--;
129                                 if(meta.growTime <= 0)
130                                         dragonblocks.setNode(x, y - 1, name);
131                         }, 1000);
132                 },
133                 onremove: (x, y) => {
134                           clearInterval(dragonblocks.getNode(x, y).meta.growInterval);
135                 },
136                 ondig: (x, y) => {
137                         if(obj.dropAbove && dragonblocks.getNode(x, y - 1) && dragonblocks.getNode(x, y - 1).name == name)
138                                 dragonblocks.player.digEnd(x, y - 1);
139                 },
140                 stacksize: obj.stacksize,
141                 flammable: true,
142         });
143 }
144 plants.registerFlower = function(){}
145 plants.registerGrass = function(){}