Compare commits

...

20 Commits

Author SHA1 Message Date
Pascal Abresch f93e52b080 actually add the api calls... oops 2019-10-04 06:38:23 +02:00
Pascal Abresch 6b2bee3ef9 use api call, and fix the quarry eating struts for breakfast 2019-10-04 06:35:17 +02:00
Pascal Abresch df36ba3fdf minor fix 2019-10-04 06:34:27 +02:00
Pascal Abresch db695a7c03 mode noce cleaning code to own file 2019-10-04 06:18:23 +02:00
Pascal Abresch 6e4b87ec57 minor fix 2019-10-04 05:38:02 +02:00
Pascal Abresch 67c8636a4f Applied constants to node definitions 2019-10-04 05:13:42 +02:00
Pascal Abresch c5b25dc552 moved texture 2019-10-04 05:13:18 +02:00
Pascal Abresch f969b3152c updated texture location 2019-10-04 05:12:09 +02:00
Pascal Abresch 4f00a62a63 some textures 2019-10-04 04:44:30 +02:00
Pascal Abresch 9f596f99e2 removed debug code 2019-10-04 04:39:42 +02:00
Pascal Abresch 13b78ff838 Added math.order
apparently builtin already has the math. namespace, testing for it doesn't seam to work?
but assigning an empty table over it makes it angry, so lets not do that
2019-10-04 04:38:18 +02:00
Pascal Abresch a3c297ac21 move metalfurnace to new wakeup thingy thing 2019-10-04 04:01:06 +02:00
Pascal Abresch 34d01977fa fix energy wakeup, wooh! 2019-10-04 04:00:21 +02:00
Pascal Abresch ca7c23e2fc added api constants 2019-10-04 03:59:47 +02:00
Pascal Abresch 975c2d609c added guard for spaekdebug 2019-10-04 03:52:57 +02:00
Pascal Abresch d3d8d43df4 Minor fix 2019-10-04 03:23:06 +02:00
Pascal Abresch 179fdb57b8 Minor fix 2019-10-04 03:22:24 +02:00
Pascal Abresch 9b710c5299 moved mtg compat code into own file 2019-10-04 03:18:27 +02:00
Pascal Abresch 1b12ed04d3 texture for steel_chasis 2019-10-04 02:48:38 +02:00
Pascal Abresch de6dbf0c77 texture renames and group fixes 2019-10-04 02:41:29 +02:00
28 changed files with 229 additions and 151 deletions

View File

@ -0,0 +1,14 @@
-- .lua is the file extension, because i dont want to get yelled at
-- i just realized, because this is all just my code depending on it i can define names like i want :D^
TRUE = 1
FALSE = 0
-- sparktech_techy
-- TODO: replace this later? like wiht a better name
WRENCHABLE = 1
-- energy_type
ENERGY_PRODUCER = 2
ENERGY_STORE = 3
ENERGY_CONSUMER = 4

61
sparkapi/lua/dig.lua Normal file
View File

@ -0,0 +1,61 @@
if not sparktech then sparktech = {} end
function sparktech.empty_inventory(source, destination, listname) ---
--- expects those in already inventory formats
--
local inventory_lists = source:get_lists()
if not inventory_lists then return true end
for i, list in pairs(inventory_lists) do
for n=1, #list do
if destination:room_for_item(listname, list[n]) then
destination:add_item("main", list[n])
else
return false
end
end
end
return true
end
function sparktech.drop_inventory(nodepos, quilty) ---
--- evacutate the mines, quickly now!
local inventory_lists = minetest.get_meta(nodepos):get_inventory():get_lists()
for i, list in pairs(inventory_lists) do
for n=1, #list do
minetest.item_drop(list[n], quilty, nodepos)
end
end
end
function sparktech.dig_node(nodepos, inventory, listname, strictmode, quilty) ---
--- call with position, your inventory, and the listname
-- strictmode true: give me all you can
-- strictmode false: it is okay to drop items to the ground
local node = minetest.get_node(nodepos)
local node_inv = minetest.get_meta(nodepos):get_inventory()
if not sparktech.empty_inventory(node_inv, inventory, listname) then
if not strictmode then
sparktech.drop_inventory(nodepos)
else
return false
end
end
if inventory:room_for_item(listname, ItemStack(node["name"])) then
inventory:add_item(listname, ItemStack(node["name"]))
else
if not strictmode then
minetest.item_drop(ItemStack(node["name"]), quilty, nodepos)
else
return false
end
end
minetest.remove_node(nodepos)
return true
end

16
sparkapi/lua/energy.lua Normal file
View File

@ -0,0 +1,16 @@
if not sparktech then sparktech = {} end
function sparktech.can_drain_energy(target_pos, ammount) ---
--- check whether you can drain
return minetest.get_meta(target_pos):get_int("energy") >= ammount
end
function sparktech.drain_energy(target_pos, ammount)
local target = minetest.get_meta(target_pos)
local current = target:get_int("energy")
if sparktech.can_drain_energy(target_pos, ammount) then
target:set_int("energy", current - ammount)
return true
end
return false
end

8
sparkapi/lua/math.lua Normal file
View File

@ -0,0 +1,8 @@
function math.order(x, y) -- might change to arbitrary args later, but now now ... this is just the simple impl written for the quarry
if not x or not y then return nil end
if x <= y then
return x, y
else
return y, x
end
end

View File

@ -20,38 +20,9 @@ function sparktech.register_wrench(name, dictionary)
end
local on_place = function(itemstack, placer, pointed_thing)
if pointed_thing["type"] == "node" then
local node = minetest.get_node(pointed_thing["under"])
if minetest.get_item_group(node["name"], "sparktech_techy") > 0 then
local nodemeta = minetest.get_meta(pointed_thing["under"])
local item = ItemStack(node["name"])
if minetest.get_item_group(item:get_name(), "sparktech_energy_storeonbreak") > 0 then
item:set_metadata(nodemeta:get_int("energy"))
end
minetest.remove_node(pointed_thing["under"])
sparktech.remove_node_from_net(pointed_thing.under, node)
local node_inv = nodemeta:get_inventory()
local inv = placer:get_inventory()
local inventory_lists = node_inv:get_lists()
for i, list in pairs(inventory_lists) do
for n=1, #list do
if inv:room_for_item("main", list[n]) then
inv:add_item("main", list[n])
else
minetest.item_drop(list[n], placer, pointed_thing["under"])
end
end
end
if inv:room_for_item("main", item) then
inv:add_item("main", item)
else
minetest.item_drop(item, placer, pointed_thing["under"])
end
end
if not sparktech.dig_node then dofile("./dig.lua") end
sparktech.dig_node(pointed_thing["under"], placer:get_inventory(), "main", false, placer)
sparktech.remove_node_from_net(pointed_thing.under, minetest.get_node(pointed_thing.under))
end
return itemstack
end

View File

@ -0,0 +1,16 @@
minetest.register_craft({
output = "sparkmachine:quarry_marker",
recipe = {
{ "sparkmachine:static_strut", "sparkmachine:static_strut" },
{ "default:steel_ingot", "default:copper_ingot" }
}
})
minetest.register_craft({
output = "sparkmachine:lv_furnace",
recipe = {
{ "default:clay_brick", "sparkcore:cable", "default:clay_brick"},
{ "default:clay_brick", "group:steel_chasis", "default:clay_brick" },
{ "default:clay_brick", "sparkcore:cable","default:clay_brick" }
}
})

View File

@ -17,7 +17,7 @@ minetest.register_craft({
minetest.register_craftitem(NAME .. ":steel_chasis", {
groups = { steel_chasis = 1 }, -- group for a single item because we keep moving files around, this way it will work even if the modname changes
description = "Steel chasis",
inventory_image = "chasis.png",
inventory_image = "[inventorycube{sparkcomponent_steel_sideplate.png{sparkcomponent_steel_sideplate.png{sparkcomponent_steel_sideplate.png",
stack_max = 128,
})

View File

Before

Width:  |  Height:  |  Size: 164 B

After

Width:  |  Height:  |  Size: 164 B

View File

@ -1,4 +1,5 @@
local NAME = minetest.get_current_modname()
local MAX_ENERGY
minetest.register_node(NAME ..":capacitor", {
description = "Capacitor",
@ -11,11 +12,11 @@ minetest.register_node(NAME ..":capacitor", {
"capacitor_side.png"
},
groups = {
sparktech_techy = 3,
sparktech_energy_type = 3,
sparktech_energy_storeonbreak = 1,
sparktech_energy_max = 30000,
sparktech_net_trigger = 1,
sparktech_techy = WRENCHABLE,
sparktech_energy_type = ENERGY_STORE,
sparktech_energy_storeonbreak = TRUE,
sparktech_energy_max = MAX_ENERGY,
sparktech_net_trigger = TRUE,
}
})

View File

@ -7,9 +7,9 @@ local function round(x)
end
local function wakeup(pos,share)
--called to test if a node needs to be woken uü
--called to test if a node needs to be woken up
local node = minetest.get_node(pos)
if (minetest.get_item_group(node.name, "sparktech_energy_wakeup") == 1) then
if (minetest.get_item_group(node.name, "sparktech_energy_wakeup") >= 1) then
local ntype = minetest.get_item_group(node.name, "spaktech_energy_type")
local meta = minetest.get_meta(pos)
local energy = meta:get_int("energy")
@ -19,7 +19,7 @@ local function wakeup(pos,share)
minetest.get_node_timer(pos):start(0.5)
end
elseif ntype == 4 then
if minetest.get_item_group(node.name, "sparktech_energy_may") == energy then
if minetest.get_item_group(node.name, "sparktech_energy_wakeup") == energy then -- set the value to when you want to be woken up key
minetest.get_node_timer(pos):start(0.5)
end
end

View File

@ -1 +0,0 @@
../init.lua

18
sparkdebug/init.lua Normal file
View File

@ -0,0 +1,18 @@
local NAME = minetest.get_current_modname()
local PATH = minetest.get_modpath(NAME) .."/lua/"
local MODFILES = minetest.get_dir_list(PATH, false)
spacenum = 20 - string.len(NAME)
-- This assumes that the lua/ subdir contains lua code only.
if not minetest.settings:get("spark_debug_enable") then
minetest.debug("" .. NAME .. string.rep(" ", spacenum) .. "DISABLED")
return false
end
minetest.debug("" .. NAME .. string.rep(" ",spacenum) .. "init")
for i=1,table.getn(MODFILES),1
do
minetest.debug(""..NAME .. string.rep(" ",spacenum) .."load " .. MODFILES[i])
dofile(PATH .. MODFILES[i])
end

View File

@ -9,11 +9,11 @@ minetest.register_node("sparkdebug:energyvoid", {
"capacitor_side.png"
},
groups = {
sparkdebug = 1,
sparktech_energy_type = 4,
sparktech_net_trigger = 1,
sparkdebug = TRUE,
sparktech_energy_type = ENERGY_CONSUMER,
sparktech_net_trigger = TRUE,
sparktech_energy_max = 10000,
sparktech_techy = 1
sparktech_techy = WRENCHABLE
}
})
@ -28,11 +28,11 @@ minetest.register_node("sparkdebug:energysource", {
"capacitor_side.png"
},
groups = {
sparkdebug = 1,
sparktech_energy_type = 2,
sparktech_net_trigger = 1,
sparkdebug = TRUE,
sparktech_energy_type = ENERGY_PRODUCER,
sparktech_net_trigger = TRUE,
sparktech_energy_max = 10000,
sparktech_techy = 1
sparktech_techy = WRENCHABLE
}
})

View File

@ -0,0 +1 @@
spark_debug_enable ([WARNING: ARBITRARY LUA CODE [very bad!]] enable sparkdebug) bool false

View File

@ -1,5 +1,6 @@
local fuel_multiplier = 2
local interval = 0.5
local FUEL_MULTIPLIER = 2
local INTERVAL= 0.5
local MAX_ENERGY = 2000
local NAME = minetest.get_current_modname()
@ -23,7 +24,7 @@ local function is_item_allowed(pos, target, _, stack)
end
local function ongetitem(pos) -- could add checking if energy >= max energy here, not really required since timer does that first thing anyway
local timer = minetest.get_node_timer(pos):start(interval)
local timer = minetest.get_node_timer(pos):start(INTERVAL)
end
local function update_formspec(pos)
@ -57,11 +58,11 @@ minetest.register_node(NAME .. ":burnergenerator", {
"generator.png"},
paramtype2 = "facedir",
groups = {
sparktech_energy_wakeup = 1,
sparktech_techy = 1,
sparktech_energy_type = 2,
sparktech_net_trigger = 1,
sparktech_energy_max = 2000
sparktech_techy = WRENCHABLE,
sparktech_energy_wakeup = TRUE,
sparktech_energy_type = ENERGY_PRODUCER,
sparktech_net_trigger = TRUE,
sparktech_energy_max = MAX_ENERGY
},
on_construct = function(pos)
local meta = minetest.get_meta(pos)
@ -69,7 +70,7 @@ minetest.register_node(NAME .. ":burnergenerator", {
meta:set_int("rem_energy_", 0)
local inv = meta:get_inventory()
inv:set_size('fuel', 1)
-- minetest.get_node_timer(pos):start(interval)
-- minetest.get_node_timer(pos):start(INTERVAL)
-- not required! its not like we got items on construct
end,
@ -118,7 +119,7 @@ minetest.register_node(NAME .. ":burnergenerator", {
update_formspec(pos) -- Later this should only be done when a player looks into the block
minetest.get_node_timer(pos):start(interval)
minetest.get_node_timer(pos):start(INTERVAL)
end
})

View File

@ -1,4 +1,5 @@
local NAME = minetest.get_current_modname()
local MAX_ENERGY = 50
minetest.register_node(NAME .. ":solar", {
description = "Solar Cell",
@ -16,10 +17,10 @@ minetest.register_node(NAME .. ":solar", {
}
},
groups = {
sparktech_techy = 1,
sparktech_energy_type = 2,
sparktech_net_trigger = 1,
sparktech_energy_max = 50
sparktech_techy = WRENCHABLE,
sparktech_energy_type = ENERGY_PRODUCER,
sparktech_net_trigger = TRUE,
sparktech_energy_max = MAX_ENERGY
}
})

View File

@ -1,3 +1,2 @@
default
sparkcore
sparkapi

View File

@ -1,4 +1,5 @@
local NAME = minetest.get_current_modname()
local MAX_ENERGY = 300
local modifier = 10 -- Cooking cost modifier
local time_modifier = 1.5 -- Cooking time modifier
@ -46,7 +47,7 @@ local function update_formspec(pos)
cfmsp = cfmsp ..
sparktech.makebar("energy2.png", 0, 1.125, 9.75, 0.25,
energy, minetest.get_item_group(minetest.get_node(pos).name, "sparktech_energy_max")
energy, minetest.get_item_group(MAX_ENERGY)
, 0)
for item=0, 1 do
@ -117,21 +118,21 @@ minetest.register_node( NAME .. ":lv_furnace", {
description = "Electric furnace",
tiles = {
"furnace2.png",
"furnace2.png",
"furnace2.png",
"furnace2.png",
"backplate.png",
"frontplate.png"
NAME .. "_steel_sideplate.png",
NAME .. "_steel_sideplate.png",
NAME .. "_steel_sideplate.png",
NAME .. "_steel_sideplate.png",
NAME .. "_steel_backplate.png",
NAME .. "_furnace_frontplate.png"
},
paramtype2 = "facedir",
groups = {
sparktech_techy = 1,
sparktech_energy_type = 4,
sparktech_net_trigger = 1,
sparktech_energy_max = 300,
spark_energy_timer = 2
sparktech_techy = WRENCHABLE,
sparktech_energy_type = ENERGY_CONSUMER,
sparktech_net_trigger = TRUE,
sparktech_energy_max = MAX_ENERGY,
sparktech_energy_wakeup = 10
},
on_timer = mytime, -- add a mytimer function
@ -160,12 +161,3 @@ minetest.register_node( NAME .. ":lv_furnace", {
--on_metadata_inventory_move = ongetitem, --doesnt seem necesarry to me, if the item moves in the inventory schould not change the cooking process
on_metadata_inventory_put = ongetitem
})
minetest.register_craft({
output = NAME .. ":lv_furnace",
recipe = {
{ "default:clay_brick", "sparkcore:cable", "default:clay_brick"},
{ "default:clay_brick", "group:steel_chasis", "default:clay_brick" },
{ "default:clay_brick", "sparkcore:cable","default:clay_brick" }
}
})

View File

@ -3,8 +3,9 @@ local ENERGYCOST = {
static_strut = 20,
dynamic_struct = 24,
hardness_mod = 1,
mining_cost = 25,
mining = 25,
}
local MAX_ENERGY = 3000
local FORMSPEC = sparktech.add_inventory(19.8,8,
"list[current_name;quarry;0,0;16,6;]")
local MAX_SIZE = 64
@ -14,15 +15,6 @@ local function Position(x, y, z) ---
return {x=x, y=y, z=z}
end
local function order(x, y) ---
--- Returns (smaller, bigger)
if x <= y then
return x, y
else
return y,x
end
end
local function try_drain_energy(target_pos, amount) ---
--- Returns true if drained, false otherwise
--- Removes amount energy from target_pos if energy >= amount
@ -65,7 +57,8 @@ end
local function dig_node(pos, quarrypos)
local node = minetest.get_node(pos)
if node.name ~= "air" and try_drain_energy(quarrypos, ENERGYCOST.mining_cost) then
if node.name ~= "air" and sparktech.drain_energy(quarrypos, ENERGYCOST.mining) then
local quarry = minetest.get_meta(quarrypos)
local quarry_inv = quarry:get_inventory()
@ -96,9 +89,9 @@ local function on_marker_placed(pos, quarry_pos, player)
end
local minx, maxx = order(pos.x, quarry_pos.x)
local miny, maxy = order(pos.y, quarry_pos.y)
local minz, maxz = order(pos.z, quarry_pos.z)
local minx, maxx = math.order(pos.x, quarry_pos.x)
local miny, maxy = math.order(pos.y, quarry_pos.y)
local minz, maxz = math.order(pos.z, quarry_pos.z)
local diffx = maxx - minx
local diffy = maxy - miny
@ -109,7 +102,6 @@ local function on_marker_placed(pos, quarry_pos, player)
diffz < 2 or diffz >= MAX_SIZE
then
notify.hud.sendtext(player, "Invalid dimensions for quarry 3x3x3")
-- minetest.chat_send_player(player:get_player_name(), "Invalid dimensions for quarry")
return
end
@ -130,12 +122,10 @@ end
local function place_strut(position, quarrypos)
if minetest.get_node(position).name == "air" then
local placed = false
if try_remove_item(quarrypos, "quarry", NAME .. ":static_strut") then
if try_drain_energy(quarrypos, ENERGYCOST.static_strut) then
if sparktech.can_drain_energy(quarrypos, ENERGYCOST.static_strut) then
if try_remove_item(quarrypos, "quarry", NAME .. ":static_strut") then
minetest.set_node(position, { name = NAME .. ":static_strut"})
placed = true
else
-- TODO Restore items
end
end
return true, placed
@ -145,9 +135,9 @@ end
local function prepare_area(pos, pos2)
local placement_done = true
local minx, maxx = order(pos.x, pos2.x)
local miny, maxy = order(pos.y, pos2.y)
local minz, maxz = order(pos.z, pos2.z)
local minx, maxx = math.order(pos.x, pos2.x)
local miny, maxy = math.order(pos.y, pos2.y)
local minz, maxz = math.order(pos.z, pos2.z)
for x=minx , maxx do
for y=miny, maxy do
for z=minz, maxz do
@ -191,6 +181,7 @@ end
local function timer_trigger(pos, elapsed)
local meta = minetest.get_meta(pos)
if not meta then assert("FUCK") end
local framenum = meta:get_int("current_frame")
local marker_pos = minetest.string_to_pos(meta:get_string("marker"))
@ -225,9 +216,9 @@ local function timer_trigger(pos, elapsed)
else
--shrink the operational area here to a 2d space with one piece of border taken away to drill there
--
local posx, pos2x = order(pos.x, marker_pos.x)
local posy, pos2y = order(pos.y, marker_pos.y)
local posz, pos2z = order(pos.z, marker_pos.z)
local posx, pos2x = math.order(pos.x, marker_pos.x)
local posy, pos2y = math.order(pos.y, marker_pos.y)
local posz, pos2z = math.order(pos.z, marker_pos.z)
posx = posx +1
pos2x = pos2x -1
posz = posz + 1
@ -248,11 +239,9 @@ end
minetest.register_node( NAME .. ":quarry_marker", {
descritption = "quarry marker",
tiles = {
"marker.png"
},
groups = {
oddly_breakable_by_hand = 1
NAME .. "marker.png"
},
groups = { sparktech_techy = 1 },
after_place_node = marker_construct,
})
@ -266,7 +255,7 @@ minetest.register_node( NAME .. ":static_strut", {
NAME .. ":lv_quarry"
},
tiles = {
"strut.png"
NAME .. "_strut.png"
},
node_box = {
type = "connected",
@ -278,31 +267,28 @@ minetest.register_node( NAME .. ":static_strut", {
connect_front = {-0.2, -0.2, -0.5, 0.2, 0.2, -0.2},
connect_left = {-0.5, -0.2, -0.2, -0.2, 0.2, 0.2},
},
groups = {
oddly_breakable_by_hand = 1
}
groups = { sparktech_techy = 1 }
})
minetest.register_node( NAME .. ":lv_quarry", {
description = "Electric Quarry",
tiles = {
"quarry.png",
"quarry.png",
"quarry.png",
"quarry.png",
"backplate.png",
"quarry_frontplate.png"
NAME .. "_steel_sideplate.png",
NAME .. "_steel_sideplate.png",
NAME .. "_steel_sideplate.png",
NAME .. "_steel_sideplate.png",
NAME .. "_steel_backplate.png",
NAME .. "_quarry_frontplate.png"
},
paramtype2 = "facedir",
groups = {
sparktech_techy = 1,
sparktech_struty = 1,
sparktech_energy_type = 4,
sparktech_net_trigger = 1,
sparktech_energy_max = 3000,
spark_energy_timer = 2
sparktech_techy = WRENCHABLE,
sparktech_energy_type = ENERGY_CONSUMER,
sparktech_net_trigger = TRUE,
sparktech_energy_max = MAX_ENERGY,
sparktech_energy_wakeup = ENERGYCOST.mining
},
on_timer = timer_trigger,
@ -322,13 +308,6 @@ minetest.register_craft({
}
})
minetest.register_craft({
output = NAME .. ":quarry_marker",
recipe = {
{ NAME .. ":static_strut", NAME .. ":static_strut" },
{ "default:steel_ingot", "default:copper_ingot" }
}
})
minetest.register_craft({
output = NAME .. ":static_strut 16",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 186 B

View File

Before

Width:  |  Height:  |  Size: 696 B

After

Width:  |  Height:  |  Size: 696 B

View File

Before

Width:  |  Height:  |  Size: 559 B

After

Width:  |  Height:  |  Size: 559 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 B

View File

Before

Width:  |  Height:  |  Size: 233 B

After

Width:  |  Height:  |  Size: 233 B

View File

@ -1,4 +1,5 @@
local NAME = minetest.get_current_modname()
local MAX_ENERGY = 200
local formspec = sparktech.add_inventory(8,1.5,
"list[current_name;charge;0,0;1,1;]")
@ -8,20 +9,20 @@ local SPEED = 10
minetest.register_node(NAME ..":charger", {
description = "Electric Charger",
tiles = {
"charger_top.png",
"charger_top.png",
"charger_side.png",
"charger_side.png",
"charger_side.png",
"charger_side.png"
NAME .. "_steel_sideplate.png",
NAME .. "_steel_sideplate.png",
NAME .. "_steel_sideplate.png",
NAME .. "_steel_sideplate.png",
NAME .. "_steel_backplate.png",
NAME .. "_charger_frontplate.png",
},
groups = {
sparktech_techy = 3,
sparktech_energy_type = 4,
sparktech_energy_storeonbreak = 1,
sparktech_energy_max = 200,
sparktech_net_trigger = 1,
spark_energy_timer = 2
sparktech_techy = WRENCHABLE,
sparktech_energy_type = ENERGY_CONSUMER,
sparktech_energy_storeonbreak = TRUE,
sparktech_net_trigger = TRUE,
sparktech_energy_max = MAX_ENERGY,
sparktech_energy_wakeup = 10
},
allow_metadata_inventory_put = function (_, _, _, itemstack)
if minetest.get_item_group(itemstack:get_name(), "sparktech_chargable") > 0 then

View File

@ -2,7 +2,7 @@ local NAME = minetest.get_current_modname()
sparktech.register_wrench(NAME .. ":wrench", {
description = "Wrench",
inventory_image = "wrench.png",
inventory_image = NAME .. "_wrench.png",
stack_max = 1,
range = 6.0
})

Binary file not shown.

After

Width:  |  Height:  |  Size: 559 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 B

View File

Before

Width:  |  Height:  |  Size: 316 B

After

Width:  |  Height:  |  Size: 316 B