From d44bf53ea20136221d605e139f2b58328b68ce9c Mon Sep 17 00:00:00 2001 From: Pierre-Yves Rollo Date: Wed, 11 Nov 2015 14:26:39 +0100 Subject: [PATCH] First commit --- .gitignore | 3 + README.md | 8 + display_lib/API.md | 77 ++++++ display_lib/LICENSE.txt | 13 + display_lib/README.md | 11 + display_lib/depends.txt | 1 + display_lib/init.lua | 156 ++++++++++++ modpack.txt | 0 ontime_clocks/LICENSE.txt | 13 + ontime_clocks/README.md | 47 ++++ ontime_clocks/common.lua | 41 ++++ ontime_clocks/crafts.lua | 56 +++++ ontime_clocks/depends.txt | 3 + ontime_clocks/init.lua | 14 ++ ontime_clocks/nodes.lua | 224 ++++++++++++++++++ .../textures/ontime_clocks_digital.png | Bin 0 -> 208 bytes .../ontime_clocks_digital_background.png | Bin 0 -> 197 bytes .../textures/ontime_clocks_digital_digit.png | Bin 0 -> 223 bytes .../textures/ontime_clocks_frameless.png | Bin 0 -> 241 bytes .../ontime_clocks_frameless_inventory.png | Bin 0 -> 426 bytes .../ontime_clocks_green_digital_inventory.png | Bin 0 -> 300 bytes .../textures/ontime_clocks_needle_h36.png | Bin 0 -> 1533 bytes .../textures/ontime_clocks_needle_h48.png | Bin 0 -> 2517 bytes .../textures/ontime_clocks_needle_m36.png | Bin 0 -> 1902 bytes .../textures/ontime_clocks_needle_m48.png | Bin 0 -> 2772 bytes .../ontime_clocks_red_digital_inventory.png | Bin 0 -> 315 bytes .../textures/ontime_clocks_white.png | Bin 0 -> 285 bytes .../ontime_clocks_white_inventory.png | Bin 0 -> 534 bytes signs/LICENSE.txt | 13 + signs/README.md | 52 ++++ signs/common.lua | 217 +++++++++++++++++ signs/crafts.lua | 45 ++++ signs/depends.txt | 3 + signs/font.lua | 63 +++++ signs/init.lua | 15 ++ signs/nodes.lua | 203 ++++++++++++++++ signs/textures/signs_20.png | Bin 0 -> 232 bytes signs/textures/signs_21.png | Bin 0 -> 241 bytes signs/textures/signs_22.png | Bin 0 -> 235 bytes signs/textures/signs_23.png | Bin 0 -> 244 bytes signs/textures/signs_24.png | Bin 0 -> 247 bytes signs/textures/signs_25.png | Bin 0 -> 247 bytes signs/textures/signs_26.png | Bin 0 -> 246 bytes signs/textures/signs_27.png | Bin 0 -> 238 bytes signs/textures/signs_28.png | Bin 0 -> 242 bytes signs/textures/signs_29.png | Bin 0 -> 241 bytes signs/textures/signs_2a.png | Bin 0 -> 238 bytes signs/textures/signs_2b.png | Bin 0 -> 241 bytes signs/textures/signs_2c.png | Bin 0 -> 238 bytes signs/textures/signs_2d.png | Bin 0 -> 237 bytes signs/textures/signs_2e.png | Bin 0 -> 236 bytes signs/textures/signs_2f.png | Bin 0 -> 244 bytes signs/textures/signs_30.png | Bin 0 -> 239 bytes signs/textures/signs_31.png | Bin 0 -> 239 bytes signs/textures/signs_32.png | Bin 0 -> 247 bytes signs/textures/signs_33.png | Bin 0 -> 246 bytes signs/textures/signs_34.png | Bin 0 -> 247 bytes signs/textures/signs_35.png | Bin 0 -> 247 bytes signs/textures/signs_36.png | Bin 0 -> 244 bytes signs/textures/signs_37.png | Bin 0 -> 242 bytes signs/textures/signs_38.png | Bin 0 -> 240 bytes signs/textures/signs_39.png | Bin 0 -> 243 bytes signs/textures/signs_3a.png | Bin 0 -> 237 bytes signs/textures/signs_3b.png | Bin 0 -> 240 bytes signs/textures/signs_3c.png | Bin 0 -> 245 bytes signs/textures/signs_3d.png | Bin 0 -> 236 bytes signs/textures/signs_3e.png | Bin 0 -> 245 bytes signs/textures/signs_3f.png | Bin 0 -> 243 bytes signs/textures/signs_40.png | Bin 0 -> 259 bytes signs/textures/signs_41.png | Bin 0 -> 243 bytes signs/textures/signs_42.png | Bin 0 -> 240 bytes signs/textures/signs_43.png | Bin 0 -> 246 bytes signs/textures/signs_44.png | Bin 0 -> 242 bytes signs/textures/signs_45.png | Bin 0 -> 240 bytes signs/textures/signs_46.png | Bin 0 -> 241 bytes signs/textures/signs_47.png | Bin 0 -> 247 bytes signs/textures/signs_48.png | Bin 0 -> 240 bytes signs/textures/signs_49.png | Bin 0 -> 236 bytes signs/textures/signs_4a.png | Bin 0 -> 240 bytes signs/textures/signs_4b.png | Bin 0 -> 246 bytes signs/textures/signs_4c.png | Bin 0 -> 238 bytes signs/textures/signs_4d.png | Bin 0 -> 249 bytes signs/textures/signs_4e.png | Bin 0 -> 243 bytes signs/textures/signs_4f.png | Bin 0 -> 243 bytes signs/textures/signs_50.png | Bin 0 -> 241 bytes signs/textures/signs_51.png | Bin 0 -> 244 bytes signs/textures/signs_52.png | Bin 0 -> 238 bytes signs/textures/signs_53.png | Bin 0 -> 247 bytes signs/textures/signs_54.png | Bin 0 -> 237 bytes signs/textures/signs_55.png | Bin 0 -> 238 bytes signs/textures/signs_56.png | Bin 0 -> 243 bytes signs/textures/signs_57.png | Bin 0 -> 246 bytes signs/textures/signs_58.png | Bin 0 -> 245 bytes signs/textures/signs_59.png | Bin 0 -> 244 bytes signs/textures/signs_5a.png | Bin 0 -> 248 bytes signs/textures/signs_5b.png | Bin 0 -> 234 bytes signs/textures/signs_5c.png | Bin 0 -> 244 bytes signs/textures/signs_5d.png | Bin 0 -> 234 bytes signs/textures/signs_5e.png | Bin 0 -> 238 bytes signs/textures/signs_5f.png | Bin 0 -> 233 bytes signs/textures/signs_60.png | Bin 0 -> 234 bytes signs/textures/signs_61.png | Bin 0 -> 245 bytes signs/textures/signs_62.png | Bin 0 -> 242 bytes signs/textures/signs_63.png | Bin 0 -> 244 bytes signs/textures/signs_64.png | Bin 0 -> 243 bytes signs/textures/signs_65.png | Bin 0 -> 245 bytes signs/textures/signs_66.png | Bin 0 -> 240 bytes signs/textures/signs_67.png | Bin 0 -> 243 bytes signs/textures/signs_68.png | Bin 0 -> 240 bytes signs/textures/signs_69.png | Bin 0 -> 239 bytes signs/textures/signs_6a.png | Bin 0 -> 236 bytes signs/textures/signs_6b.png | Bin 0 -> 246 bytes signs/textures/signs_6c.png | Bin 0 -> 236 bytes signs/textures/signs_6d.png | Bin 0 -> 241 bytes signs/textures/signs_6e.png | Bin 0 -> 239 bytes signs/textures/signs_6f.png | Bin 0 -> 241 bytes signs/textures/signs_70.png | Bin 0 -> 242 bytes signs/textures/signs_71.png | Bin 0 -> 243 bytes signs/textures/signs_72.png | Bin 0 -> 241 bytes signs/textures/signs_73.png | Bin 0 -> 242 bytes signs/textures/signs_74.png | Bin 0 -> 243 bytes signs/textures/signs_75.png | Bin 0 -> 239 bytes signs/textures/signs_76.png | Bin 0 -> 244 bytes signs/textures/signs_77.png | Bin 0 -> 240 bytes signs/textures/signs_78.png | Bin 0 -> 244 bytes signs/textures/signs_79.png | Bin 0 -> 241 bytes signs/textures/signs_7a.png | Bin 0 -> 246 bytes signs/textures/signs_7b.png | Bin 0 -> 239 bytes signs/textures/signs_7c.png | Bin 0 -> 232 bytes signs/textures/signs_7d.png | Bin 0 -> 239 bytes signs/textures/signs_7e.png | Bin 0 -> 239 bytes signs/textures/signs_black_inventory.png | Bin 0 -> 265 bytes signs/textures/signs_black_left.png | Bin 0 -> 263 bytes signs/textures/signs_black_right.png | Bin 0 -> 258 bytes signs/textures/signs_blue_street.png | Bin 0 -> 436 bytes .../textures/signs_blue_street_inventory.png | Bin 0 -> 472 bytes signs/textures/signs_green_street.png | Bin 0 -> 274 bytes .../textures/signs_green_street_inventory.png | Bin 0 -> 279 bytes signs/textures/signs_poster.png | Bin 0 -> 1600 bytes signs/textures/signs_poster_inventory.png | Bin 0 -> 1582 bytes signs/textures/signs_wooden_inventory.png | Bin 0 -> 1289 bytes signs/textures/signs_wooden_left.png | Bin 0 -> 2559 bytes signs/textures/signs_wooden_right.png | Bin 0 -> 2562 bytes 143 files changed, 1278 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 display_lib/API.md create mode 100644 display_lib/LICENSE.txt create mode 100644 display_lib/README.md create mode 100644 display_lib/depends.txt create mode 100644 display_lib/init.lua create mode 100644 modpack.txt create mode 100644 ontime_clocks/LICENSE.txt create mode 100644 ontime_clocks/README.md create mode 100644 ontime_clocks/common.lua create mode 100644 ontime_clocks/crafts.lua create mode 100644 ontime_clocks/depends.txt create mode 100644 ontime_clocks/init.lua create mode 100644 ontime_clocks/nodes.lua create mode 100644 ontime_clocks/textures/ontime_clocks_digital.png create mode 100644 ontime_clocks/textures/ontime_clocks_digital_background.png create mode 100644 ontime_clocks/textures/ontime_clocks_digital_digit.png create mode 100644 ontime_clocks/textures/ontime_clocks_frameless.png create mode 100644 ontime_clocks/textures/ontime_clocks_frameless_inventory.png create mode 100644 ontime_clocks/textures/ontime_clocks_green_digital_inventory.png create mode 100644 ontime_clocks/textures/ontime_clocks_needle_h36.png create mode 100644 ontime_clocks/textures/ontime_clocks_needle_h48.png create mode 100644 ontime_clocks/textures/ontime_clocks_needle_m36.png create mode 100644 ontime_clocks/textures/ontime_clocks_needle_m48.png create mode 100644 ontime_clocks/textures/ontime_clocks_red_digital_inventory.png create mode 100644 ontime_clocks/textures/ontime_clocks_white.png create mode 100644 ontime_clocks/textures/ontime_clocks_white_inventory.png create mode 100644 signs/LICENSE.txt create mode 100644 signs/README.md create mode 100644 signs/common.lua create mode 100644 signs/crafts.lua create mode 100644 signs/depends.txt create mode 100644 signs/font.lua create mode 100644 signs/init.lua create mode 100644 signs/nodes.lua create mode 100644 signs/textures/signs_20.png create mode 100644 signs/textures/signs_21.png create mode 100644 signs/textures/signs_22.png create mode 100644 signs/textures/signs_23.png create mode 100644 signs/textures/signs_24.png create mode 100644 signs/textures/signs_25.png create mode 100644 signs/textures/signs_26.png create mode 100644 signs/textures/signs_27.png create mode 100644 signs/textures/signs_28.png create mode 100644 signs/textures/signs_29.png create mode 100644 signs/textures/signs_2a.png create mode 100644 signs/textures/signs_2b.png create mode 100644 signs/textures/signs_2c.png create mode 100644 signs/textures/signs_2d.png create mode 100644 signs/textures/signs_2e.png create mode 100644 signs/textures/signs_2f.png create mode 100644 signs/textures/signs_30.png create mode 100644 signs/textures/signs_31.png create mode 100644 signs/textures/signs_32.png create mode 100644 signs/textures/signs_33.png create mode 100644 signs/textures/signs_34.png create mode 100644 signs/textures/signs_35.png create mode 100644 signs/textures/signs_36.png create mode 100644 signs/textures/signs_37.png create mode 100644 signs/textures/signs_38.png create mode 100644 signs/textures/signs_39.png create mode 100644 signs/textures/signs_3a.png create mode 100644 signs/textures/signs_3b.png create mode 100644 signs/textures/signs_3c.png create mode 100644 signs/textures/signs_3d.png create mode 100644 signs/textures/signs_3e.png create mode 100644 signs/textures/signs_3f.png create mode 100644 signs/textures/signs_40.png create mode 100644 signs/textures/signs_41.png create mode 100644 signs/textures/signs_42.png create mode 100644 signs/textures/signs_43.png create mode 100644 signs/textures/signs_44.png create mode 100644 signs/textures/signs_45.png create mode 100644 signs/textures/signs_46.png create mode 100644 signs/textures/signs_47.png create mode 100644 signs/textures/signs_48.png create mode 100644 signs/textures/signs_49.png create mode 100644 signs/textures/signs_4a.png create mode 100644 signs/textures/signs_4b.png create mode 100644 signs/textures/signs_4c.png create mode 100644 signs/textures/signs_4d.png create mode 100644 signs/textures/signs_4e.png create mode 100644 signs/textures/signs_4f.png create mode 100644 signs/textures/signs_50.png create mode 100644 signs/textures/signs_51.png create mode 100644 signs/textures/signs_52.png create mode 100644 signs/textures/signs_53.png create mode 100644 signs/textures/signs_54.png create mode 100644 signs/textures/signs_55.png create mode 100644 signs/textures/signs_56.png create mode 100644 signs/textures/signs_57.png create mode 100644 signs/textures/signs_58.png create mode 100644 signs/textures/signs_59.png create mode 100644 signs/textures/signs_5a.png create mode 100644 signs/textures/signs_5b.png create mode 100644 signs/textures/signs_5c.png create mode 100644 signs/textures/signs_5d.png create mode 100644 signs/textures/signs_5e.png create mode 100644 signs/textures/signs_5f.png create mode 100644 signs/textures/signs_60.png create mode 100644 signs/textures/signs_61.png create mode 100644 signs/textures/signs_62.png create mode 100644 signs/textures/signs_63.png create mode 100644 signs/textures/signs_64.png create mode 100644 signs/textures/signs_65.png create mode 100644 signs/textures/signs_66.png create mode 100644 signs/textures/signs_67.png create mode 100644 signs/textures/signs_68.png create mode 100644 signs/textures/signs_69.png create mode 100644 signs/textures/signs_6a.png create mode 100644 signs/textures/signs_6b.png create mode 100644 signs/textures/signs_6c.png create mode 100644 signs/textures/signs_6d.png create mode 100644 signs/textures/signs_6e.png create mode 100644 signs/textures/signs_6f.png create mode 100644 signs/textures/signs_70.png create mode 100644 signs/textures/signs_71.png create mode 100644 signs/textures/signs_72.png create mode 100644 signs/textures/signs_73.png create mode 100644 signs/textures/signs_74.png create mode 100644 signs/textures/signs_75.png create mode 100644 signs/textures/signs_76.png create mode 100644 signs/textures/signs_77.png create mode 100644 signs/textures/signs_78.png create mode 100644 signs/textures/signs_79.png create mode 100644 signs/textures/signs_7a.png create mode 100644 signs/textures/signs_7b.png create mode 100644 signs/textures/signs_7c.png create mode 100644 signs/textures/signs_7d.png create mode 100644 signs/textures/signs_7e.png create mode 100644 signs/textures/signs_black_inventory.png create mode 100644 signs/textures/signs_black_left.png create mode 100644 signs/textures/signs_black_right.png create mode 100644 signs/textures/signs_blue_street.png create mode 100644 signs/textures/signs_blue_street_inventory.png create mode 100644 signs/textures/signs_green_street.png create mode 100644 signs/textures/signs_green_street_inventory.png create mode 100644 signs/textures/signs_poster.png create mode 100644 signs/textures/signs_poster_inventory.png create mode 100644 signs/textures/signs_wooden_inventory.png create mode 100644 signs/textures/signs_wooden_left.png create mode 100644 signs/textures/signs_wooden_right.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c6f5712 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*~ +_* + diff --git a/README.md b/README.md new file mode 100644 index 0000000..addcc78 --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +# Display Modpack + +This modpack provides mods with dynamic display. Mods are : + +- **display_lib**: A library for adding display entities to nodes; +- **ontime_clocks**: A mod providing clocks which display the ingame time; +- **signs**: A mod providing signs and direction signs displaying text; + diff --git a/display_lib/API.md b/display_lib/API.md new file mode 100644 index 0000000..7bfaaef --- /dev/null +++ b/display_lib/API.md @@ -0,0 +1,77 @@ +# Display Lib API +This document describes Display Lib API. Display Lib allows to add a dynamic display on a node. Node must be wallmounted and Display Lib limits its rotation to vertical positions. +## Provided methods +### update\_entities +**display\_lib.update\_entities(pos)** + +This method triggers entities update for the display node at pos. Actual entity update is made by **on\_display\_update** callback associated to the entity. + +**pos**: Position of the node +### register\_display\_entity +**display\_lib.register\_display\_entity(entity_name)** + +This is a helper to register entities used for display. + +**entity_name**: Name of the entity to register. +## Provided callback implementations +### on_place +**display\_lib.on\_place(itemstack, placer, pointed\_thing)** + +**On_place** node callback implementation. Display nodes should have this callback (avoid placement of horizontal display node). +### on_construct +**display\_lib.on\_construct(pos)** + +**On_construct** node callback implementation. Display nodes should have this callback (creates, places and updates display entities on node construction). +### on_destruct +**display\_lib.on_destruct(pos)** + +**On_destruct** node callback implementation. Display nodes should have this callback (removes display entities on node destruction). +### on_rotate +**display\_lib.on\_rotate(pos, node, user, mode, new_param2)** + +**On_rotate** node callback implementation. Display nodes should have this callback (restricts rotations and rotates display entities associated with node). +### on_activate +**display\_lib.on_activate(entity, staticdata)** + +**On_activate** entity callback implementation for display entities. No need of this method if display entities have been registered using **register\_display\_entity** (callback is already set). +## Howto register a display node +* Register display entities with **register\_display\_entity** +* Register node with : + - **on\_place**, **on\_construct**, **on\_destruct** and **on\_rotate** callbacks using **display\_lib** callbacks. + - a **display\_entities** field in node definition containing a entity name indexed table. For each entity, two fields : **depth** indicates the entity position (-0.5 to 0.5) and **on_display_update** is a callback in charge of setting up entity texture. + +### Example + + display_lib.register_display_entity("mymod:entity1") + display_lib.register_display_entity("mymod:entity2") + + function my_display_update1(pos, objref) + objref:set_properties({ textures= {"mytexture1.png"}, + visual_size = {x=1, y=1} }) + end + + function my_display_update2(pos, objref) + objref:set_properties({ textures= {"mytexture2.png"}, + visual_size = {x=1, y=1} }) + end + + minetest.register_node("mymod:test_display_node", { + ... + paramtype2 = "wallmounted", + ... + display_entities = { + ["mymod:entity1"] = { depth = -0.3, + on_display_update = my_display_update1}, + ["mymod:entity1"] = { depth = -0.2, + on_display_update = my_display_update2}, + }, + ... + on_place = display_lib.on_place, + on_construct = display_lib.on_construct, + on_destruct = display_lib.on_destruct, + on_rotate = display_lib.on_rotate, + ... + }) + + + diff --git a/display_lib/LICENSE.txt b/display_lib/LICENSE.txt new file mode 100644 index 0000000..bc06764 --- /dev/null +++ b/display_lib/LICENSE.txt @@ -0,0 +1,13 @@ + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + +Copyright (C) 2004 Sam Hocevar + +Everyone is permitted to copy and distribute verbatim or modified +copies of this license document, and changing it is allowed as long +as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. diff --git a/display_lib/README.md b/display_lib/README.md new file mode 100644 index 0000000..7ca97b2 --- /dev/null +++ b/display_lib/README.md @@ -0,0 +1,11 @@ +# Dislpay Lib + +This library's purpose is to ease creation of wallmounted nodes with a display on front side. For example, signs and clocks. Display can be dynamic and/or different for each node instance. + +**Limitations**: This lib uses entities to draw display. This means display has to be vertical. So display nodes are only wallmounted vertically. + +**Dependancies**:default + +**License**: WTFPL + +**API**: See API.md document please. diff --git a/display_lib/depends.txt b/display_lib/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/display_lib/depends.txt @@ -0,0 +1 @@ +default diff --git a/display_lib/init.lua b/display_lib/init.lua new file mode 100644 index 0000000..eaddfd3 --- /dev/null +++ b/display_lib/init.lua @@ -0,0 +1,156 @@ +-- Display lib mod by P.Y. Rollo +-- +-- License: WTFPL + +display_lib = {} + +-- Miscelaneous values depending on wallmounted param2 +local wallmounted_values = { + [0]={dx=0, dz=0, lx=0, lz=0, yaw=0, rotate=0}, -- Should never be used + {dx=1, dz=0, lx=0, lz=0, yaw=0, rotate=1}, -- Should never be used + {dx=1, dz=0, lx=0, lz=-1, yaw=-math.pi/2, rotate=4}, + {dx=-1, dz=0, lx=0, lz=1, yaw=math.pi/2, rotate=5}, + {dx=0, dz=1, lx=1, lz=0, yaw=0, rotate=3}, + {dx=0, dz=-1, lx=-1, lz=0, yaw=math.pi, rotate=2} +} + +--- Gets the display entities attached with a node. Removes extra ones +local function get_entities(pos) + local objrefs = {} + local ndef = minetest.registered_nodes[minetest.get_node(pos).name] + if ndef and ndef.display_entities then + for _, objref in ipairs(minetest.get_objects_inside_radius(pos, 0.5)) do + local entity = objref:get_luaentity() + if entity and ndef.display_entities[entity.name] then + if objrefs[entity.name] then + objref:remove() + else + objrefs[entity.name] = objref + end + end + end + end + return objrefs +end + +local function clip_pos_prop(posprop) + if posprop then + return math.max(-0.5, math.min(0.5, posprop)) + else + return 0 + end +end + +--- (Create and) place display entities according to the node orientation +local function place_entities(pos) + local node = minetest.get_node(pos) + local ndef = minetest.registered_nodes[node.name] + local values = wallmounted_values[node.param2] + local objrefs = get_entities(pos) + + if ndef and ndef.display_entities then + for entity_name, props in pairs(ndef.display_entities) do + local depth = clip_pos_prop(props.depth) + local top = clip_pos_prop(props.top) + local left = clip_pos_prop(props.left) + + if not objrefs[entity_name] then + objrefs[entity_name] = minetest.add_entity(pos, entity_name) + end + + objrefs[entity_name]:setpos({ + x = pos.x - values.dx * depth + values.lx * left, + y = pos.y + top, + z = pos.z - values.dz * depth + values.lz * left}) + + objrefs[entity_name]:setyaw(values.yaw) + end + end + return objrefs +end + +--- Call on_display_update callback of a node for one of its display entities +local function call_node_on_display_update(pos, objref) + local ndef = minetest.registered_nodes[minetest.get_node(pos).name] + local entity = objref:get_luaentity() + if ndef and ndef.display_entities and entity and ndef.display_entities[entity.name] then + ndef.display_entities[entity.name].on_display_update(pos, objref) + end +end + +--- Force entity update +function display_lib.update_entities(pos) + local objrefs = place_entities(pos) + for _, objref in pairs(objrefs) do + call_node_on_display_update(pos, objref) + end +end + +--- On_activate callback for display_lib entities. Calls on_display_update callbacks +--- of corresponding node for each entity. +function display_lib.on_activate(entity, staticdata) + if entity then + call_node_on_display_update(entity.object:getpos(), entity.object) + end +end + +--- On_place callback for display_lib items. Does nothing more than preventing item +--- from being placed on ceiling or ground +function display_lib.on_place(itemstack, placer, pointed_thing) + local above = pointed_thing.above + local under = pointed_thing.under + local dir = {x = under.x - above.x, + y = under.y - above.y, + z = under.z - above.z} + local wdir = minetest.dir_to_wallmounted(dir) + + if wdir == 0 or wdir == 1 then + dir = placer:get_look_dir() + dir.y = 0 + wdir = minetest.dir_to_wallmounted(dir) + end + return minetest.item_place(itemstack, placer, pointed_thing, wdir) +end + +--- On_construct callback for display_lib items. Creates entities and update them. +function display_lib.on_construct(pos) + display_lib.update_entities(pos) +end + +--- On_destruct callback for display_lib items. Removes entities. +function display_lib.on_destruct(pos) + local objrefs = get_entities(pos) + + for _, objref in pairs(objrefs) do + objref:remove() + end +end + + +-- On_rotate (screwdriver) callback for display_lib items. Prevents axis rotation and reorients entities. +function display_lib.on_rotate(pos, node, user, mode, new_param2) + if mode ~= screwdriver.ROTATE_FACE then return false end + + if wallmounted_values[node.param2] then + minetest.swap_node(pos, {name = node.name, param1 = node.param1, param2 = wallmounted_values[node.param2].rotate}) + place_entities(pos) + return true + else + return false + end +end + +--- Creates display entity with some fields and the on_activate callback +function display_lib.register_display_entity(entity_name) + if not minetest.registered_entity then + minetest.register_entity(':'..entity_name, { + collisionbox = { 0, 0, 0, 0, 0, 0 }, + visual = "upright_sprite", + textures = {}, + on_activate = display_lib.on_activate, + }) + end +end + + + diff --git a/modpack.txt b/modpack.txt new file mode 100644 index 0000000..e69de29 diff --git a/ontime_clocks/LICENSE.txt b/ontime_clocks/LICENSE.txt new file mode 100644 index 0000000..bc06764 --- /dev/null +++ b/ontime_clocks/LICENSE.txt @@ -0,0 +1,13 @@ + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + +Copyright (C) 2004 Sam Hocevar + +Everyone is permitted to copy and distribute verbatim or modified +copies of this license document, and changing it is allowed as long +as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. diff --git a/ontime_clocks/README.md b/ontime_clocks/README.md new file mode 100644 index 0000000..b62c01a --- /dev/null +++ b/ontime_clocks/README.md @@ -0,0 +1,47 @@ +# Ontime Clocks + +This mod provides clocks that display real ingame time. + +**Dependancies**: display_lib, default + +**License**: WTFPL + +## Recipes + +**Green and red digital clocks** + + - D - + G M G + - - - + +G = Glass, D = Dye, M = Mese Crystal, - = Empty + +Green dye for green clock, red dye for red clock + +**White clock** + + S P S + - M - + - - - + +P = Paper, S = Steel Ingot, M = Mese Crystal, - = Empty + + +**Frameless clock** + + S D S + - M - + - - - + +D = Dye, S = Steel Ingot, M = Mese Crystal, - = Empty + +Black dye for black clock, White dye for white clock + +**Gold frameless clock** + + G - G + - M - + - - - + +G = Gold Ingot, M = Mese Crystal, - = Empty + diff --git a/ontime_clocks/common.lua b/ontime_clocks/common.lua new file mode 100644 index 0000000..6a9681c --- /dev/null +++ b/ontime_clocks/common.lua @@ -0,0 +1,41 @@ +-- Entity for time display +display_lib.register_display_entity("ontime_clocks:display") + +function ontime_clocks.get_h24() + return math.floor(minetest.get_timeofday()*24)%24 +end + +function ontime_clocks.get_h12() + return math.floor(minetest.get_timeofday()*24)%12 +end + +function ontime_clocks.get_m12() + return math.floor(minetest.get_timeofday()*288)%12 +end + +function ontime_clocks.get_digital_properties(color_off, color_on, hour, minute) + return + { + textures={"ontime_clocks_digital_background.png^[colorize:"..color_off + .."^([combine:21x7" + ..":0,"..(-7*(math.floor(hour/10))).."=ontime_clocks_digital_digit.png" + ..":5,"..(-7*(hour%10)).."=ontime_clocks_digital_digit.png" + ..":9,-70=ontime_clocks_digital_digit.png" + ..":12,"..(-7*(math.floor(minute/2))).."=ontime_clocks_digital_digit.png" + ..":17,"..(-35*(minute%2)).."=ontime_clocks_digital_digit.png" + .."^[colorize:"..color_on..")"}, + visual_size = {x=21/32, y=7/32} + } +end + +function ontime_clocks.get_needles_properties(color, size, hour, minute) + return + { + textures={"[combine:"..size.."x"..size + ..":0,"..(-size*hour).."=ontime_clocks_needle_h"..size..".png" + ..":0,"..(-size*minute).."=ontime_clocks_needle_m"..size..".png" + .."^[colorize:"..color}, + visual_size = {x=size/64, y=size/64} + } +end + diff --git a/ontime_clocks/crafts.lua b/ontime_clocks/crafts.lua new file mode 100644 index 0000000..c7e1ab6 --- /dev/null +++ b/ontime_clocks/crafts.lua @@ -0,0 +1,56 @@ + +minetest.register_craft({ + output = 'ontime_clocks:green_digital', + recipe = { + {'', 'dye:green', ''}, + {'default:glass', 'default:mese_crystal', 'default:glass'}, + {'', '', ''}, + } +}) + +minetest.register_craft({ + output = 'ontime_clocks:red_digital', + recipe = { + {'', 'dye:red', ''}, + {'default:glass', 'default:mese_crystal', 'default:glass'}, + {'', '', ''}, + } +}) + +minetest.register_craft({ + output = 'ontime_clocks:white', + recipe = { + {'default:steel_ingot', 'default:paper', 'default:steel_ingot'}, + {'', 'default:mese_crystal', ''}, + {'', '', ''}, + } +}) + +minetest.register_craft({ + output = 'ontime_clocks:frameless_black', + recipe = { + {'default:steel_ingot', 'dye:black', 'default:steel_ingot'}, + {'', 'default:mese_crystal', ''}, + {'', '', ''}, + } +}) + +minetest.register_craft({ + output = 'ontime_clocks:frameless_gold', + recipe = { + {'default:gold_ingot', '', 'default:gold_ingot'}, + {'', 'default:mese_crystal', ''}, + {'', '', ''}, + } +}) + +minetest.register_craft({ + output = 'ontime_clocks:frameless_white', + recipe = { + {'default:steel_ingot', 'dye:white', 'default:steel_ingot'}, + {'', 'default:mese_crystal', ''}, + {'', '', ''}, + } +}) + + diff --git a/ontime_clocks/depends.txt b/ontime_clocks/depends.txt new file mode 100644 index 0000000..c1feb90 --- /dev/null +++ b/ontime_clocks/depends.txt @@ -0,0 +1,3 @@ +default +display_lib + diff --git a/ontime_clocks/init.lua b/ontime_clocks/init.lua new file mode 100644 index 0000000..5210aef --- /dev/null +++ b/ontime_clocks/init.lua @@ -0,0 +1,14 @@ +-- On time clocks mod by P.Y. Rollo +-- +-- License: WTFPL + +ontime_clocks = {} +ontime_clocks.path = minetest.get_modpath("ontime_clocks") + +dofile(ontime_clocks.path.."/common.lua") +dofile(ontime_clocks.path.."/nodes.lua") +dofile(ontime_clocks.path.."/crafts.lua") + + + + diff --git a/ontime_clocks/nodes.lua b/ontime_clocks/nodes.lua new file mode 100644 index 0000000..4a184e8 --- /dev/null +++ b/ontime_clocks/nodes.lua @@ -0,0 +1,224 @@ +-- Green digital clock +minetest.register_node("ontime_clocks:green_digital", { + description = "Green digital clock", + inventory_image = "ontime_clocks_green_digital_inventory.png", + wield_image = "ontime_clocks_green_digital_inventory.png", + paramtype = "light", + paramtype2 = "wallmounted", + drawtype = "nodebox", + node_box = { + type = "wallmounted", + wall_side = { -0.5, -3/16, -7/16, -13/32, 7/32, 7/16 }, + wall_bottom = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + wall_top = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 } + }, + tiles = {"ontime_clocks_digital.png"}, + groups = {oddly_breakable_by_hand=1}, + display_entities = { + ["ontime_clocks:display"] = { + depth = -13/32 + 0.01, + on_display_update = function(pos, objref) + objref:set_properties( + ontime_clocks.get_digital_properties( + "#040", "#0F0", ontime_clocks.get_h24(), ontime_clocks.get_m12())) + end }, + }, + on_place = display_lib.on_place, + on_construct = display_lib.on_construct, + on_destruct = display_lib.on_destruct, + on_rotate = display_lib.on_rotate, +}) + +minetest.register_abm({ + nodenames = {"ontime_clocks:green_digital"}, + interval = 5, + chance = 1, + action = display_lib.update_entities, +}) + +-- Red digital clock +minetest.register_node("ontime_clocks:red_digital", { + description = "Red digital clock", + inventory_image = "ontime_clocks_red_digital_inventory.png", + wield_image = "ontime_clocks_red_digital_inventory.png", + paramtype = "light", + paramtype2 = "wallmounted", + drawtype = "nodebox", + node_box = { + type = "wallmounted", + wall_side = { -0.5, -3/16, -7/16, -13/32, 7/32, 7/16 }, + wall_bottom = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + wall_top = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 } + }, + tiles = {"ontime_clocks_digital.png"}, + groups = {oddly_breakable_by_hand=1}, + display_entities = { + ["ontime_clocks:display"] = { + depth = -13/32 + 0.01, + on_display_update = function(pos, objref) + objref:set_properties( + ontime_clocks.get_digital_properties( + "#400", "#F00", ontime_clocks.get_h24(), ontime_clocks.get_m12())) + end }, + }, + on_place = display_lib.on_place, + on_construct = display_lib.on_construct, + on_destruct = display_lib.on_destruct, + on_rotate = display_lib.on_rotate, +}) + +minetest.register_abm({ + nodenames = {"ontime_clocks:red_digital"}, + interval = 5, + chance = 1, + action = display_lib.update_entities, +}) + + +minetest.register_node("ontime_clocks:white", { + description = "White clock", + inventory_image = "ontime_clocks_white_inventory.png", + wield_image = "ontime_clocks_white_inventory.png", + paramtype = "light", + paramtype2 = "wallmounted", + drawtype = "nodebox", + node_box = { + type = "wallmounted", + wall_side = { -0.5, -7/16, -7/16, -6/16, 7/16, 7/16}, + wall_bottom = { -7/16, -0.5, -7/16, 7/16, -7/16, 7/16}, + wall_top = { -7/16, 0.5, -7/16, 7/16, 7/16, 7/16}, + }, + tiles = {"ontime_clocks_white.png"}, + groups = {choppy=1,oddly_breakable_by_hand=1}, + display_entities = { + ["ontime_clocks:display"] = { + depth = -6/16+0.01, + on_display_update = function(pos, objref) + objref:set_properties( + ontime_clocks.get_needles_properties( + "#000", 36, ontime_clocks.get_h12(), ontime_clocks.get_m12())) + end }, + }, + on_place = display_lib.on_place, + on_construct = display_lib.on_construct, + on_destruct = display_lib.on_destruct, + on_rotate = display_lib.on_rotate, +}) + +minetest.register_abm({ + nodenames = {"ontime_clocks:white"}, + interval = 5, + chance = 1, + action = display_lib.update_entities, +}) + +minetest.register_node("ontime_clocks:frameless_black", { + description = "Frameless clock", + inventory_image = "ontime_clocks_frameless_inventory.png", + wield_image = "ontime_clocks_frameless_inventory.png", + paramtype = "light", + paramtype2 = "wallmounted", + drawtype = "nodebox", + node_box = { + type = "wallmounted", + wall_side = { -0.5, -7/16, -7/16, -0.45, 7/16, 7/16 }, + wall_bottom = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + wall_top = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 } + }, + tiles = {"ontime_clocks_frameless.png"}, + groups = {choppy=1,oddly_breakable_by_hand=1}, + display_entities = { + ["ontime_clocks:display"] = { + depth = -7/16, + on_display_update = function(pos, objref) + objref:set_properties( + ontime_clocks.get_needles_properties( + "#000", 48, ontime_clocks.get_h12(), ontime_clocks.get_m12())) + end }, + }, + on_place = display_lib.on_place, + on_construct = display_lib.on_construct, + on_destruct = display_lib.on_destruct, + on_rotate = display_lib.on_rotate, +}) + +minetest.register_abm({ + nodenames = {"ontime_clocks:frameless_black"}, + interval = 5, + chance = 1, + action = display_lib.update_entities, +}) + +minetest.register_node("ontime_clocks:frameless_gold", { + description = "Frameless gold clock", + inventory_image = "ontime_clocks_frameless_inventory.png^[colorize:#FF0", + wield_image = "ontime_clocks_frameless_inventory.png^[colorize:#FF0", + paramtype = "light", + paramtype2 = "wallmounted", + drawtype = "nodebox", + node_box = { + type = "wallmounted", + wall_side = { -0.5, -7/16, -7/16, -0.45, 7/16, 7/16 }, + wall_bottom = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + wall_top = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 } + }, + tiles = {"ontime_clocks_frameless.png^[colorize:#FF0"}, + groups = {choppy=1,oddly_breakable_by_hand=1}, + display_entities = { + ["ontime_clocks:display"] = { + depth = -7/16, + on_display_update = function(pos, objref) + objref:set_properties( + ontime_clocks.get_needles_properties( + "#FF0", 48, ontime_clocks.get_h12(), ontime_clocks.get_m12())) + end }, + }, + on_place = display_lib.on_place, + on_construct = display_lib.on_construct, + on_destruct = display_lib.on_destruct, + on_rotate = display_lib.on_rotate, +}) + +minetest.register_abm({ + nodenames = {"ontime_clocks:frameless_gold"}, + interval = 5, + chance = 1, + action = display_lib.update_entities, +}) + +minetest.register_node("ontime_clocks:frameless_white", { + description = "Frameless white clock", + inventory_image = "ontime_clocks_frameless_inventory.png^[colorize:#FFF", + wield_image = "ontime_clocks_frameless_inventory.png^[colorize:#FFF", + paramtype = "light", + paramtype2 = "wallmounted", + drawtype = "nodebox", + node_box = { + type = "wallmounted", + wall_side = { -0.5, -7/16, -7/16, -0.45, 7/16, 7/16 }, + wall_bottom = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + wall_top = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 } + }, + tiles = {"ontime_clocks_frameless.png^[colorize:#FFF"}, + groups = {choppy=1,oddly_breakable_by_hand=1}, + display_entities = { + ["ontime_clocks:display"] = { + depth = -7/16, + on_display_update = function(pos, objref) + objref:set_properties( + ontime_clocks.get_needles_properties( + "#FFF", 48, ontime_clocks.get_h12(), ontime_clocks.get_m12())) + end }, + }, + on_place = display_lib.on_place, + on_construct = display_lib.on_construct, + on_destruct = display_lib.on_destruct, + on_rotate = display_lib.on_rotate, +}) + +minetest.register_abm({ + nodenames = {"ontime_clocks:frameless_white"}, + interval = 5, + chance = 1, + action = display_lib.update_entities, +}) diff --git a/ontime_clocks/textures/ontime_clocks_digital.png b/ontime_clocks/textures/ontime_clocks_digital.png new file mode 100644 index 0000000000000000000000000000000000000000..4b79679832228716db0367806dc21c6d4de726ce GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8!3Q zuY)k7lg8`{prB-lYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&Kt;ZuE{-7) zt#7Yv6a-q~eDQ^4c3V>9Tbq~zCibEsd%O>B*eiO*M~)q+l)*EqcI7I4_uTuI_dr~R nBaG*@-|2q}f5Z#oImi?+Y}vrJd={sgGKlZ#>gTe~DWM4f)KNS7 literal 0 HcmV?d00001 diff --git a/ontime_clocks/textures/ontime_clocks_digital_background.png b/ontime_clocks/textures/ontime_clocks_digital_background.png new file mode 100644 index 0000000000000000000000000000000000000000..6731145e0f3e95b3668b97a9ea2bedb0ecf95d9d GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^qCm{f!3HFsbFzUbmSQK*5Dp-y;YjHK@;M7UB8!3Q zuY)k7lg8`{prB-lYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&Kt)cTE{-7@ z6OZ;A3Na|~96Ip-zop)*3)!}@Q&#fwBsgrFsB%E+)Qxl9JPrqT8BhBgy6>pi)U?Tq m-(3Hxe(&p_H6Jhkl-+!7#$uMc^=UxU7(8A5T-G@yGywp$vO@O& literal 0 HcmV?d00001 diff --git a/ontime_clocks/textures/ontime_clocks_digital_digit.png b/ontime_clocks/textures/ontime_clocks_digital_digit.png new file mode 100644 index 0000000000000000000000000000000000000000..7bbc4a911f26e01d9f94cf5c26c608b7315219bc GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^EI{nb!3HE7mmR$Y5-4`^4B-HR8jh3>AfL0qBeEE% z{yGRVI%&+V018T$xJHx&=ckpFCl;kLl$V$5W#(lUCnpx9>g5-u&wghk1ymH{>Eak- z(VLvm(C|Ni=lOw~K0HSl9&P#K9^84{=Fu9}U~a#1ftMvBdt0^<@S_y5%VZO9Vb) zGwM`y+q3lt^Gu#>PaXxXN7JODGzzUGqd3@%WP^?Tbf>IpU}j)2cKDF@_Gl&09tKZW KKbLh*2~7aRazuy# literal 0 HcmV?d00001 diff --git a/ontime_clocks/textures/ontime_clocks_frameless.png b/ontime_clocks/textures/ontime_clocks_frameless.png new file mode 100644 index 0000000000000000000000000000000000000000..07c00011f662a7aac49579f2c42154f271c99f55 GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8!3Q zuY)k7lg8`{prB-lYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&Kt*|;E{-7) zt#7A0@--;%u*ClV|NP?<*4724+f;VDGrbA8CBl+3^H%WP#SD`sh;TiW5_~aNNMM0_ zw%+GCEo>R=i&9N5-M#1M#C(PE$D)mAR($pBZ#aE{;VZ+P9-aW92fj)FKIz!|R@FC4 eE{$(I{edAwTGuw-#8Mk*GlQqApUXO@geCx9zf#Wt literal 0 HcmV?d00001 diff --git a/ontime_clocks/textures/ontime_clocks_frameless_inventory.png b/ontime_clocks/textures/ontime_clocks_frameless_inventory.png new file mode 100644 index 0000000000000000000000000000000000000000..b91c93c8bc729bc2db2900ff149888c1ae9577ad GIT binary patch literal 426 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8!3Q zuY)k7lg8`{prB-lYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&3=E9wo-U3d z5v^~hZ}d9iAkeno{;ueu&~VPETUqJptN9i79kgw2)nCBB;01R?_WFd}OwA<4h{*0g zX3`duz4Odhvm}adJ7M(sy!qzMH(j<#7Kbc$JI^{H#WPa%kG$xMQY$>BS$NNZx4Hi{sX2NrVi&DwoR6K5UdTOM_P+upx_L81&1j8n~)AfhdS988ri2cuInEXXoZxf)9^bShq- Q1q@dPPgg&ebxsLQ0F%U|ivR!s literal 0 HcmV?d00001 diff --git a/ontime_clocks/textures/ontime_clocks_green_digital_inventory.png b/ontime_clocks/textures/ontime_clocks_green_digital_inventory.png new file mode 100644 index 0000000000000000000000000000000000000000..3318f10a9c5f6e221243217646180655a245c9ae GIT binary patch literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8!3Q zuY)k7lg8`{prB-lYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&Kt(G(T^vIq zTHj8;$a&a+$7SiHgGRk=pG5Kzopr06E8O%K!iX literal 0 HcmV?d00001 diff --git a/ontime_clocks/textures/ontime_clocks_needle_h36.png b/ontime_clocks/textures/ontime_clocks_needle_h36.png new file mode 100644 index 0000000000000000000000000000000000000000..bc1845db89ebdeb25f68ca1a6f2512bd3042c2a4 GIT binary patch literal 1533 zcmeAS@N?(olHy`uVBq!ia0vp^Dhv#a8#vg2tb+~5D}fYCv6E*A2N2Y7q;vrJoCO|{ z#X$AfL734=V|E2lP_o1|q9iy!t)x7$D3zhSyj(9cFS|H7u^?41zbJk7I~yqm2G%N1 z7srr_IdAXo^^apt&=4p5Q$kezT zywp=vH7V#!giiC@&AW}W>kH3m=Qg&4`&X=PWQmo_(?dBbvG?@Zk@ zIhS4@Rcu-1{>%Ly6UWORtO>WieRYmmsLx<$y3dZ~!-Zd0r>;L&&EQ|L(~9xHp39b6 z&FhTL_%q0tF)OAk} zc^K}73jE!#U~Fx+S@Z8Pss2k(41Y5>ST>{|QQUv>!TE353hx+x@!AH48kU01j78iJQa)(6SjZIjTFlwb^@-&H&jCi;a77jQ4X66!JDOj< zkDk9-z~pv8wb&c=ERGAS9M8KmEZ=)R^5Ng&zUhqTxkdP1UuEdMv{qZHHdan5IRz5d zpkT%3-ggdH%eQ7kM{NGxx?5XCz}vYBn<_+{W&d|bGc(#eb7pUL!?)}pnLWPJEr&a& z?pro5ZF}DL$;IIZYJB437(W{xw08bElWG1zD_x-*w+`%_DZ4!SYw6?fx!hN_{r&wk z${Ib+q1J{n&b(>SYb@sPtW%r!ed|tnnY{WJ+07?fK5cGIdtCb@eey*hlQ*0BY5L+@ zET6Vc&3F2F^NmGgO)mS~fON?hk_QTJU+4dLx|Hw1x{qJ;8Qz*Ftgmgo6l&#o{=cA9 zPQ;BfeNG&2znjJH%hL$B|LrsXmRVQ=sEB>lzA&pbk<53^%ELX7gYJ@qGM1pc_OEfz z`l)v9hqqqZ9NVgp?z34sN+s+o7Cb8>Ig@M4MUC(O_zlG}h$X~EIY_sri9&@N8L!aPt6*I?lQ$xj) z*~cqdEYu5c#_mcgeO+-{tzxF=p2F45``p(n?%h``5&Q%qEzwCN7BbT*hhtp@S{Og;{)}Q-u_)tgwALBi-dbeWM)W%k= zj%pMTx4)OS!`56Q!tx$xi^ZQ!e4k`(#nY$9E&Ox#w{T(4#?Oo1L@jvQ^d|kt!Igfm z=lzx`u{d^S8H1b?$9=Q9sYApwnBo0ai3%sP1k$ zlQYY1N}+Y-?5vOPecT!^zqG1TGcgUQTUL{5AV2w07%<^U#{d)FMk8RttD1H2Scm-0 z;5}hc*z@UcMx)K&w=5u#}n0qx9;-8`Gn&pZ|(xU^kujdY1ci?Jo=u zHhlc5&Jh19W}2Jq{D9{lHYo-%{k&zQweU~Qs;Lh9w#j;H*h_B)I%L~AZ-w~Tzg4Hq zf6Fg?;yT+z&Zp_zXIZ2a`}D&kEv};_oFevL+)gdUF^$3d8-PVMgQu&X%Q~loCIEt| BmkIy? literal 0 HcmV?d00001 diff --git a/ontime_clocks/textures/ontime_clocks_needle_h48.png b/ontime_clocks/textures/ontime_clocks_needle_h48.png new file mode 100644 index 0000000000000000000000000000000000000000..c894ac5cce9a95b98053982c8bb231d29a923ede GIT binary patch literal 2517 zcmb7G3pCW*8lRU(USsr-*SM5CDmir%Wn4`d#$ygAeA#Bub8~f zByY|ne<|`T#K?F|&ZP_^L^FzUr@Pi!cdc`~bxtF*YqNe58H_NH)~<5A-E?5`b+*2^Y| z2UVi2JfdB~&P2!hMVN^3g%YFu{lZThhDDyuo;On!JK}9EkGhiX@pEv2$U)UB zdG(iwljL!Cl<|2#PqIuh^QSmL#j zFRRR-zCS91K2&$j^B`k-^m$ytM~5XwN4M$6u4NH2^SNAy>4yXFx&`s8z1bhFu{5n} zoQ4HqPktLD_yP8yI>LWnm_9?V?{0DeC(M_u)tIC#q7oxSax9vFftDV|@ z3Y8=;RBup0$THQi`YQ<_DKf{ROk?-C5&R9{3lLTNv6)O{dMb^sw*t_%52EBD{wCN% z>j`WOc*f$Q3)3+nE0^P_AcOgik5lsMYZcvdE_a>76Nnm!1*)e zBiC^`yG=*ti7<0WE;DCCA?_w)3OO$_dt{w*Xm7_cbp)I88IznxDb#1ws`Hg|(1?hu zi(K${*H*JF_6Mm{eJ+L@$X_DpGw4yDTq0rP0cOHxN`18e|Gp(hVt&7f>tonQC`EWc za!Ye2puNg7rLUyzZ|pR-_A7ne72QYgqh@N*;%?zDxE7`Le}FO;>y^G4#6QIJtEoe! zHc~y_^ug(#al}Rwl41jB&9>I0Vd2??vlL3kj9l$Hb9SY6Y6CQI(Gx@h3sZVZ1J&9m zbGLvLzy$KjCd!1Q&sda;^f3GvkU$qEA_u!|0I4IhrosUL$FZlE18==+-?(tw$!Z*! z2o-+cjgt(`lQ4v)?SdspnMlnM$1nvzb_cS@U%o-QJ9@tSCcrZum^y5f$E-+nDgLJ* z3{qSra6|j2gZ*#1U zLrIvK5b=ntTFm)=a(#Oi*r|QWK-(QNb-nYaYF8PJgp-!TWTx|K%6tQ}36djPsId8l(h24@NXaBe@PL7vFuKbOzF(9H>mMo+kf&fs5A1g@y%GA>SqBV zv?o}H0z05-Wc2{hZgs(+VVcz~)H8#mPR$n&@1K3&vYu|>LQJZ_WB0wAD;_R)!p4C48_NiSPLXf!H7oQhCIx z6?f&Kyx@Wp!+of@zXE8f&s}sDZq8Kelm^Agtl^Jr zNQFOev%8Aee&Z?8%#j&)DrU0iSk|&K;u=tUr@vKKv`}Px2V%PLCus4Y{z5 z_`hj~f^>=WQ1Hv*U{>y2Kn}XFDap~;u-V0c^r8X18S$lb{!{wM)IL16B4EZBVv6B< zw5ad{;wnuv!bDsVr;4x&IYvVDy#?PudS~crM1X>lH|NYLCuUp2TZImq1>$637uWfs-}^AJTJLXI6v4GkcQ5dF?o0 z#vC${0SYIV#dIf$pC~DJ@_M{v^A2!X+8#nqW2mG7EyYj1NGu}wcJM88utt3}q{ z-ZFS-^DH(JRmBt+uYJ{J-z{Okdy02h-B6@bGpL!n)v$IcqL=wNLGy3>moHI~wsL}# z{Y0hKu`T&p`@7Gn)G4Y=w{4fFy$yBf7pv1oUes5zV@)VA@MzM(4|l_Q>o8SwA2*TT3GIJVnXAPh>B_1AbQQ3 z=u+~c#B~lp!4p9ojdK{T>H>kkX3AYx5LBWx-2DuV%w^!@*7!6FWlEAOP4hghJPEPg z_TK4_!T+L}OZ@6?3+EEK&qt;-OR7AEybe8P)!H>kSK6Cl%VUSn~J3nEiqe zRb!Ofv(D0cdc3GDgFIIaJa-{P{e0WN;pNOATBJr#e! OK(p78mewZ zY$vF?wfz+}b?IDEEm9Tco|3c#%WP+-r+WIG^PTtk-tYV8eV*rizYKd@OF5`26a)gv z5v;HdyYXuf2+Wd^-bD{mx)XMTWE6(rD6_i~WqirIXW4KoQq=DIv41xhqs@rlO&*TM zxkR52^N)`6iu41;#l;~ng$76Yc!m2R!y*G1D`u)7kn|z}Ywj3dv|QW}=I*3?qeJmE zgy|BJr-f;t+PgSnF(;Jji1X(uNTn+69u11tK?Q4fd#Rz?XSaQDN5?}RD6>kxvw}&1 zapNP(fkqfN>|Y@ftH*xe3Bx8^x4MiTt>)oJ^X4WJ@1fo@HaCk2p~33SWqZc$QJS#st3t+^8>27MJ&5tRRUDzMDD7oxI+o$W;|CZ;z*?97=Vgl8tq| zM3=ecgf%!kD*xxM{#YKGb#?lbVuri4I+C0yx1=8v>XRGQ>2a1%r;<0MS!{u7HnuU9 zLCrGIxwNFlCq}&6{e9m#@Ic_m+%7y3|Tfn zyt-Gw_ey>MhHevXjlBG&FKZ>XC%5EN3h5ol_|t5&>3HVa!cKj@wR8L!0* zgpBC7(M^XHKC)G*Df~vsUaDCXZ&dn~m3(y%_vhX>Cd-G9J#4)b5rZF%De{@rNGd1P z_E<6RJI%64Z+d0ue^3h_2V`v&-J*>c?4!5VYZjPZg3P=*-6-SKq4rfdiAQ9H~ zk%E*eyq-+l>rc$=Y$%f(eMZ7qsH~`MqSMw<|&5Ia!RssYz-e_?tAmuBa`5} zJLx|g{ zsK*xuTb-gQETled9d80Y(f0p|6AvCwMhZBFEid35`OY8o(cWR1v>yj-ip&!#x`xz5 zD)CCNv4WCsCJHB^vLZdUF=Euxpx40rzQDdNDvN_Yt#m>yccEftk?f*@i|8gV8;A!f zlIq}sE@*a+AjpgN>%yyG`ew-R6`%C#;gjKTRL7Av=lx8YAc?&S{>Vqun+IKqx`^~3 z>^f+}41p&ivy>qvka~$QNSIyCqbOtlGH5Y#1}FOx9mCXR)4tcUm_olp_1%HmpjQG0 z^}G7EVeuX6>R4cO;f$?VtZ}%-Iw?D=+F|Fwh%4oaOZkcbF+6s$v2Po?k>)V}?p5{T z7ft+MJQjkRJ@Z?hnE8C6me|;%(xmhB1?XB|Zo`F|tT*o`(#&R(O&fC0I4w10ioqg5 WDevz)v%v1(2qNHYv2~b>*Z%=*NO_z9 literal 0 HcmV?d00001 diff --git a/ontime_clocks/textures/ontime_clocks_needle_m48.png b/ontime_clocks/textures/ontime_clocks_needle_m48.png new file mode 100644 index 0000000000000000000000000000000000000000..4c4a13c447e917e99b96d7005b49aa9a4c8c6f35 GIT binary patch literal 2772 zcmb7Gc{o&iA3w7+_GKs`Om|ADWE&z}7mbAMm9ZC^u@sXfiotNx6tae~geX^K8B0wQ zGe=2f#*##|IOT?@p(xwnou2o7|9GGG)_vdeJm>TKp5Hmo@ArMq^I3iuoE)sB#FfPX z0FbgdfOip&IsgDS7exsxF6Vuia6m>_+8h!UUU8xUG~u%t`G9+b@cY5bPXd$Mjs154n#*sYXyadMED;gAJ+;CCl&Ecl>tE9*#>WMD5m&Ri6c$*u)=u` zPS^kHeo;$Bo6U;y#YfQa(BUDg*OIJsZot(3l&6;y%u($c!P)7lXrzeL#C_3=@=uvg zhny^&1=<~GYm4>Hhpx8mZDbnSj1OH{@p)e3o4;xnXl%s_Et!6OW73V%W3pW@M|bvo zUa~cQKmM89AJw2N!90Ck|6hasf{dr1W?2V3_=k{}ZjR?!wcn_o_mocXxJBhiY$YEj z#xwgV`CQ3YzzHN9A#LAS5r@M1{W_yY-bS_}sudI0-s>Quostqx3_}*C2(+$D3m`yx z70@yECMhRSSZrdeIdG38rk2Rdjf0tJM3?kX4R9G-#8)+;#+~(zT*3|4iEWSBNq##~flrpgJ}wQUbToGkifVlpTLuA?so4eE*%QE3F&$LgYc zOQLFud@ZDx-QB4;$y@x8R~8QCG=fANP>k@(p=Zn)d~>Smt;vN-r*Scg5cU#nFC^8O z8Wluj4~#GDeN?L_Da z>x?r|EhxOWqpH{TsK3MKOtY`LDe<^LL+)ETQ(nQzA7=2kKrN@yHbf0gBKQ9yi_S;X zAsijIJ<<#!F`QUCeD%-_!>eDIZzsjiRzU|Di!gmrIJ?W1$F#8lJF70v}yB9kH!u0!M(`QOXfz;2>-s_S+!Hsr<9IX2SIJ zDCh4pr*X!JN(QmbloK-GAmtK;txjR{|#WZu#=F>MZ_k)^|vsn zW|&YTwwrX+e}%m+#uO{vzZ$plPVTUsyb>v^-U{F0e*Gjm>y$!gQKn*8^?fm6nd*fP zD1L9eeQSrOPLyRpv3kfx^bqo+FWG~_!{2@29KauF=!(@?`82LKJHuGplnkg$eWv(0 zG})-8gHL7<|6|`lCE88ljMJ5rK0V(++_jRyoZUHBJi5Vz$@$%2RE=~W3o~>W90l)y zc|5_@X@C7zR6`^+R@`V4v*w|0VV%o>exsp=_P{mzqDSedAt#+UW&*Z;CB!bPC1ggu z`%fio<~-J$4Y3WE2TRZlRvqKKz+T`8+1nbANl~PX18-R1Pave>zX2Nq#;Uv@sm!%H z5zXvuO7|j|6&boBj^AiBd+;Ur0X$A$bjkmWN-!*>V_^5D#@^6qwTPX1jP9!e+qcy> zJ|oS9mnVy` zE{~Vb^_UDlA>TNi)_QsIgRDULlHuCRa#3~&rF_$lW~xtlzj(IJGpm-e-a!nN6Y$8= z*SjDJ#lPN<9Ild7BNkAH%V(5q9iK}CpHWqE6)wKgSQW~55s`82HmBUC6!s;}^*qb# z3u@D>>fLFZ@OW(cYkpGW;h+3IVMaMTe6gJ6{ZMf^%c|WAuTs|Z*|<=E2eH0Be5d(@6 ztv4c9b?YgQL6TgVK6qEv$P2M{rSE!3Gj>5;!YMEJG`S_#5iSGUbcm|$4it#^_{c7B z!4~5g-wnV3LdGR~{?cugVH@u}4=vx+b!>5_(n2jNo_S>+H*cqW5Gc4Aom)}GjX#=W z{MeOJQg7>??=(_fw>lEuS!*gD&)|8C{HoT;D>eAV{`}yD=YJi-|LuCksB2*aZgK#z zNjY{72N~%7eR}+h-W*vPt*cpQQp3oiEMAr$1by`=JUxWlix_t{I~%Jza}fWrZo{Q~ zZBDgJvI8w`c9fYaM8s2hxzUvaOTRxhN`-4;^|~7*h0~2X9ly87*yS7)mPR}*HUgxs zt9rf+jvaw_^_>i+R>n?_S<%l_J~`zf1~O{Nn{cxah>rqy=pZ?*B87}&KT({k1it+S ztsn%=(@bMC#+qGP4hhCmJArlg;imix6I26%&yqMk#-p;R%NNgtNv5B=o2mN>(R4dDwqMD`?{o<);)c0QZ*2B zEo8~NWJ_VTkHR9>4?13zc_3-FIlMn;^imFBM~igYt8#! zpF8Wl{n9^W_}yVyciJ2+>tyuli=s28WNC6pseftO8@I_Ve!FINs=Lo*pLo^7p11Dg z#Yr(sUG|cqM@Aj{wz^@l127CgLb#E}|R^jeFljf wVnuGzz@p_iqBNi)U^|(esrI96D_lb;a`Pr1-{a*7PoRK}l>@%k@@UdO05Ev_q5uE@ literal 0 HcmV?d00001 diff --git a/ontime_clocks/textures/ontime_clocks_red_digital_inventory.png b/ontime_clocks/textures/ontime_clocks_red_digital_inventory.png new file mode 100644 index 0000000000000000000000000000000000000000..cfe4fe021d89951dc1da2694a622076547aed059 GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8!3Q zuY)k7lg8`{prB-lYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&Kt($|T^vIq zTHj8)$lId8)Am2ErcCL1O2zwNv-dT9>6!X1D(Wr+ z&jE%y#suNx)%K-ItpY0;7#buVPkD51=NtX|O==9wU+bBzTFE4H!;!(G)6(|!jTOr{ zFC;HkFJH}i-=a7v=sR=ur}KNJ$z|j*E-CfkRN1L=@%_>F7c->qHAP*LTV3WLFZHv@ z=$ovs@Pkz+rrKWAk#})r|I#rhHKqP2TLJ^yhwlvXcXnAE5a^i11oQ)gr>mdKI;Vst E05WiN;Q#;t literal 0 HcmV?d00001 diff --git a/ontime_clocks/textures/ontime_clocks_white.png b/ontime_clocks/textures/ontime_clocks_white.png new file mode 100644 index 0000000000000000000000000000000000000000..577f2d167db9623946911e2dcd707844249277ed GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8!3Q zuY)k7lg8`{prB-lYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&Kt;1WT^vIq zTHj8)D8wMh;hJy#yYk<(|Jn1+kF|72e(yCb4G}sjA=y`DGdG@rq2j322H!Qw%x0>X4_yJwX;OXk;vd$@?2>|qDWaz|M|@5PK6ULuHJiH}oXN&R?)L zv9Y$Np#o#$57=m^h>e9Ev9_>!R~Rme1a}XG^KL50Zf1vhyTe;XM5q!Um97rpGkFMt zpj0a?%VNN9av*_aSub5M2!fmULJly-z!)nesPYm>2}pk}5g~nyWgU?cAd(rfx$<5m zC|y929qxG^*6Z~{j$8rP^*o=?ux%Tg%_f&H3`3ZviSc-xxk;r2Tw^wy!F64`Qoeui_KDOH}48wTHD=ffq9E?UID2jsld=5?1FquqnI-M|`PSI>O zQLELk+wCwM4xuQD7;$2g@B8HYKGDT9x(wYTiX!TEyWev-=hSYuDT<=Z`DwnZbwEV& zr$E + +Everyone is permitted to copy and distribute verbatim or modified +copies of this license document, and changing it is allowed as long +as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. diff --git a/signs/README.md b/signs/README.md new file mode 100644 index 0000000..586dbff --- /dev/null +++ b/signs/README.md @@ -0,0 +1,52 @@ +# Signs + +This mod provides various signs with text display. Text is locked if area is protected. + +**Dependancies**: display_lib, default + +**License**: WTFPL + +## Recipes + +**Blue Street Sign** + + B W S + S S S + - - - + +B = Blue Dye, W = White Dye, S = Steel Ingot + +**Green Street Sign** + + G W S + S S S + - - - + +G = Green Dye, W = White Dye, S = Steel Ingot + +**Poster** + + P P - + P P - + P P - + +P = Paper + +Poster displays only title, much more text can be read by right-clicking on it. + +**Wooden direction sigh** + + W W W + W W - + - - - + +W = Wooden Plank (group) + +**Black direction sign** + + B W S + S S - + - - - + +B = Black Dye, W = White Dye, S = Steel Ingot + diff --git a/signs/common.lua b/signs/common.lua new file mode 100644 index 0000000..0433223 --- /dev/null +++ b/signs/common.lua @@ -0,0 +1,217 @@ +local font = {} +signs.font_height = 10 + +-- Get png width, suposing png width is less than 256 (it is the case for all font textures) +local function get_png_width(filename) + local file=assert(io.open(filename,"rb")) + -- All font png are smaller than 256x256 --> read only last byte + file:seek("set",19) + local w = file:read(1) + file:close() + return w:byte() +end + +-- Computes line width for a given font height and text +function signs.get_line_width(text) + local char + local width = 0 + + for p=1,#text + do + char = text:sub(p,p):byte() + if font[char] then + width = width + font[char].width + end + end + + return width +end + +--- Builds texture part for a text line +-- @param text Text to be rendered +-- @param x Starting x position in texture +-- @param width Width of the texture (extra text is not rendered) +-- @param y Vertical position of the line in texture +-- @return Texture string +function signs.make_line_texture(text, x, width, y) + local char + + local texture = "" + + for p=1,#text + do + char = text:sub(p,p):byte() + if font[char] then + -- Add image only if it is visible (at least partly) + if x + font[char].width >= 0 and x <= width then + texture = texture..string.format(":%d,%d=%s", x, y, font[char].filename) + end + x = x + font[char].width + end + end + return texture +end + +local function split_lines(text, maxlines) + local splits = text:split("\n") + if maxlines then + local lines = {} + for num = 1,maxlines do + lines[num] = splits[num] + end + return lines + else + return splits + end +end + +function signs.on_display_update(pos, objref) + local meta = minetest.get_meta(pos) + local text = meta:get_string("display_text") + + local ndef = minetest.registered_nodes[minetest.get_node(pos).name] + if ndef and ndef.sign_model then + local model = signs.sign_models[ndef.sign_model] + local lines = split_lines(text, model.maxlines) + + local texturew = model.width/model.xscale + local textureh = model.height/model.yscale + + local texture = "" + + local y + if model.valing == "top" then + y = signs.font_height / 2 + else + y = (textureh - signs.font_height * #lines) / 2 + 1 + end + + for _, line in pairs(lines) do + texture = texture..signs.make_line_texture(line, + (texturew - signs.get_line_width(line)) / 2, + texturew, y) + y = y + signs.font_height + end + + local texture = string.format("[combine:%dx%d", texturew, textureh)..texture + if model.color then texture = texture.."^[colorize:"..model.color end + + objref:set_properties({ textures={texture}, visual_size = {x=model.width, y=model.height}}) + end +end + +function signs.set_formspec(pos) + local meta = minetest.get_meta(pos) + local ndef = minetest.registered_nodes[minetest.get_node(pos).name] + if ndef and ndef.sign_model then + local model = signs.sign_models[ndef.sign_model] + local formspec + + if model.maxlines == 1 then + formspec = "size[6,3]".. + "field[0.5,0.7;5.5,1;display_text;Displayed text;${display_text}]".. + "button_exit[2,2;2,1;ok;Write]" + else + local extralabel = "" + if model.maxlines then + extralabel = " (first "..model.maxlines.." lines only)" + end + + formspec = "size[6,4]".. + "textarea[0.5,0.7;5.5,2;display_text;Displayed text"..extralabel..";${display_text}]".. + "button_exit[2,3;2,1;ok;Write]" + end + + meta:set_string("formspec", formspec) + end +end + +function signs.on_receive_fields(pos, formname, fields, player) + if not minetest.is_protected(pos, player:get_player_name()) then + local meta = minetest.get_meta(pos) + if fields and fields.ok then + meta:set_string("display_text", fields.display_text) + meta:set_string("infotext", "\""..fields.display_text.."\"") + display_lib.update_entities(pos) + end + end +end + +-- On place callback for direction signs +-- (chooses which sign according to look direction) +function signs.on_place_direction(itemstack, placer, pointed_thing) + local above = pointed_thing.above + local under = pointed_thing.under + local wdir = minetest.dir_to_wallmounted( + {x = under.x - above.x, + y = under.y - above.y, + z = under.z - above.z}) + + local dir = placer:get_look_dir() + + if wdir == 0 or wdir == 1 then + wdir = minetest.dir_to_wallmounted({x=dir.x, y=0, z=dir.z}) + end + + local name = itemstack:get_name() + + -- Only for direction signs (ending with _right) + if name:sub(-string.len("_right")) == "_right" then + name = name:sub(1, -string.len("_right")) + + local test = {0, dir.z, -dir.z, -dir.x, dir.x} + if test[wdir] > 0 then + itemstack:set_name(name.."left") + end + itemstack = minetest.item_place(itemstack, placer, pointed_thing, wdir) + itemstack:set_name(name.."right") + + return itemstack + else + return minetest.item_place(itemstack, placer, pointed_thing, wdir) + end +end + +-- On_rotate (screwdriver) callback for direction signs +function signs.on_rotate_direction(pos, node, user, mode, new_param2) + if mode == screwdriver.ROTATE_AXIS then + local name + if node.name:sub(-string.len("_right")) == "_right" then + name = node.name:sub(1, -string.len("_right")).."left" + end + if node.name:sub(-string.len("_left")) == "_left" then + name = node.name:sub(1, -string.len("_left")).."right" + end + + if name then + minetest.swap_node(pos, {name = name, param1 = node.param1, param2 = node.param2}) + end + return false + else + return display_lib.on_rotate(pos, node, user, mode, new_param2) + end +end + +-- Populate fonts table +local w, filename +for charnum=32,126 do + filename = string.format("signs_%02x.png", charnum) + w = get_png_width(signs.path.."/textures/"..filename) + font[charnum] = {filename=filename, width=w} +end + +-- Generic callback for show_formspec displayed formspecs +minetest.register_on_player_receive_fields(function(player, formname, fields) + local found, mod, node_name, pos + found, _, mod, node_name, pos = formname:find("([%w_]+):([%w_]+)@(.+)") + + if found then + if mod ~= 'signs' then return end + + local ndef = minetest.registered_nodes[mod..":"..node_name] + + if ndef and ndef.on_receive_fields then + ndef.on_receive_fields(minetest.string_to_pos(pos), formname, fields, player) + end + end +end) diff --git a/signs/crafts.lua b/signs/crafts.lua new file mode 100644 index 0000000..16b873d --- /dev/null +++ b/signs/crafts.lua @@ -0,0 +1,45 @@ +minetest.register_craft({ + output = 'signs:blue_street', + recipe = { + {'dye:blue', 'dye:white', 'default:steel_ingot'}, + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + {'', '', ''}, + } +}) + +minetest.register_craft({ + output = 'signs:green_street', + recipe = { + {'dye:green', 'dye:white', 'default:steel_ingot'}, + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + {'', '', ''}, + } +}) + +minetest.register_craft({ + output = 'signs:wooden_right', + recipe = { + {'group:wood', 'group:wood', 'group:wood'}, + {'group:wood', 'group:wood', ''}, + {'', '', ''}, + } +}) + +minetest.register_craft({ + output = 'signs:black_right', + recipe = { + {'dye:black', 'dye:white', 'default:steel_ingot'}, + {'default:steel_ingot', 'default:steel_ingot', ''}, + {'', '', ''}, + } +}) + +minetest.register_craft({ + output = 'signs:poster', + recipe = { + {'default:paper', 'default:paper', ''}, + {'default:paper', 'default:paper', ''}, + {'default:paper', 'default:paper', ''}, + } +}) + diff --git a/signs/depends.txt b/signs/depends.txt new file mode 100644 index 0000000..c1feb90 --- /dev/null +++ b/signs/depends.txt @@ -0,0 +1,3 @@ +default +display_lib + diff --git a/signs/font.lua b/signs/font.lua new file mode 100644 index 0000000..2da6611 --- /dev/null +++ b/signs/font.lua @@ -0,0 +1,63 @@ + +local font = {} +signs.font_height = 10 + +-- Get png width, suposing png width is less than 256 (it is the case for all font textures) +local function get_png_width(filename) + local file=assert(io.open(filename,"rb")) + -- All font png are smaller than 256x256 --> read only last byte + file:seek("set",19) + local w = file:read(1) + file:close() + return w:byte() +end + +-- Computes line width for a given font height and text +function signs.get_line_width(text) + local char + local width = 0 + + for p=1,#text + do + char = text:sub(p,p):byte() + if font[char] then + width = width + font[char].width + end + end + + return width +end + +--- Builds texture part for a text line +-- @param text Text to be rendered +-- @param x Starting x position in texture +-- @param width Width of the texture (extra text is not rendered) +-- @param y Vertical position of the line in texture +-- @return Texture string +function signs.make_line_texture(text, x, width, y) + local char + + local texture = "" + + for p=1,#text + do + char = text:sub(p,p):byte() + if font[char] then + -- Add image only if it is visible (at least partly) + if x + font[char].width >= 0 and x <= width then + texture = texture..string.format(":%d,%d=%s", x, y, font[char].filename) + end + x = x + font[char].width + end + end + return texture +end + +-- Populate fonts table +local w, filename +for charnum=32,126 do + filename = string.format("signs_%02x.png", charnum) + w = get_png_width(signs.path.."/textures/"..filename) + font[charnum] = {filename=filename, width=w} +end + diff --git a/signs/init.lua b/signs/init.lua new file mode 100644 index 0000000..81d3a5b --- /dev/null +++ b/signs/init.lua @@ -0,0 +1,15 @@ +-- Signs mod by P.Y. Rollo +-- +-- License: WTFPL + +signs = {} +signs.path = minetest.get_modpath("signs") + +dofile(signs.path.."/common.lua") +dofile(signs.path.."/nodes.lua") +dofile(signs.path.."/crafts.lua") + + + + + diff --git a/signs/nodes.lua b/signs/nodes.lua new file mode 100644 index 0000000..77d8925 --- /dev/null +++ b/signs/nodes.lua @@ -0,0 +1,203 @@ +-- Poster specific formspec +local function on_rightclick_poster(pos, node, player) + local formspec + local meta = minetest.get_meta(pos) + if not minetest.is_protected(pos, player:get_player_name()) then + formspec = + "size[6.5,7.5]".. + "field[0.5,0.7;6,1;display_text;Title;"..minetest.formspec_escape(meta:get_string("display_text")).."]".. + "textarea[0.5,1.7;6,6;text;Text;"..minetest.formspec_escape(meta:get_string("text")).."]".. + "button_exit[2,7;2,1;ok;Write]" + minetest.show_formspec(player:get_player_name(), + "signs:poster@"..minetest.pos_to_string(pos), + formspec) + else + formspec = "size[8,9]".. + "size[6.5,7.5]".. + "label[0.5,0;"..minetest.formspec_escape(meta:get_string("display_text")).."]".. + "textarea[0.5,1;6,7;;"..minetest.formspec_escape(meta:get_string("text"))..";]".. + "bgcolor[#111]".. + "button_exit[2,7;2,1;ok;Close]" + minetest.show_formspec(player:get_player_name(), + "", + formspec) + end + +end + +-- Poster specific on_receive_fields callback +local function on_receive_fields_poster(pos, formname, fields, player) + local meta = minetest.get_meta(pos) + if not minetest.is_protected(pos, player:get_player_name()) then + if fields and fields.ok then + meta:set_string("display_text", fields.display_text) + meta:set_string("text", fields.text) + meta:set_string("infotext", "\""..fields.display_text + .."\"\n(right-click to read more text)") + display_lib.update_entities(pos) + end + end +end + +signs.sign_models = { + blue_street={ + depth=1/16, + width=14/16, + height=12/16, + color="#fff", + maxlines = 3, + xscale = 1/144, + yscale = 1/64, + fields = { + description="Blue street sign", + tiles={"signs_blue_street.png"}, + inventory_image="signs_blue_street_inventory.png", + }, + }, + green_street={ + depth=1/32, + width=1, + height=6/16, + color="#fff", + maxlines = 1, + xscale = 1/96, + yscale = 1/64, + fields = { + description="Green street sign", + tiles={"signs_green_street.png"}, + inventory_image="signs_green_street_inventory.png", + }, + }, + wooden_right={ + depth=1/16, + width=14/16, + height=7/16, + color="#000", + maxlines = 2, + xscale = 1/112, + yscale = 1/64, + fields = { + description="Wooden direction sign", + tiles={"signs_wooden_right.png"}, + inventory_image="signs_wooden_inventory.png", + on_place=signs.on_place_direction, + on_rotate=signs.on_rotate_direction, + + }, + }, + wooden_left={ + depth=1/16, + width=14/16, + height=7/16, + color="#000", + maxlines = 2, + xscale = 1/112, + yscale = 1/64, + fields = { + description="Wooden direction sign", + tiles={"signs_wooden_left.png"}, + inventory_image="signs_wooden_inventory.png", + groups={choppy=1,oddly_breakable_by_hand=1,not_in_creative_inventory=1}, + drop="signs:wooden_right", + on_place=signs.on_place_direction, + on_rotate=signs.on_rotate_direction, + }, + }, + black_right={ + depth=1/32, + width=1, + height=0.5, + color="#000", + maxlines = 1, + xscale = 1/96, + yscale = 1/64, + fields = { + description="Black direction sign", + tiles={"signs_black_right.png"}, + inventory_image="signs_black_inventory.png", + on_place=signs.on_place_direction, + on_rotate=signs.on_rotate_direction, + }, + }, + black_left={ + depth=1/32, + width=1, + height=0.5, + color="#000", + maxlines = 1, + xscale = 1/96, + yscale = 1/64, + fields = { + description="Black direction sign", + tiles={"signs_black_left.png"}, + inventory_image="signs_black_inventory.png", + groups={choppy=1,oddly_breakable_by_hand=1,not_in_creative_inventory=1}, + drop="signs:black_right", + on_place=signs.on_place_direction, + on_rotate=signs.on_rotate_direction, + }, + }, + poster={ + depth=1/32, + width=26/32, + height=30/32, + color="#000", + valing="top", + maxlines = 1, + xscale = 1/144, + yscale = 1/64, + fields = { + description="Poster", + tiles={"signs_poster.png"}, + inventory_image="signs_poster_inventory.png", + on_construct=display_lib.on_construct, + on_rightclick=on_rightclick_poster, + on_receive_fields=on_receive_fields_poster, + }, + }, +} + +display_lib.register_display_entity("signs:text") + +for model_name, model in pairs(signs.sign_models) +do + local fields = { + sunlight_propagates = true, + paramtype = "light", + paramtype2 = "wallmounted", + drawtype = "nodebox", + node_box = { + type = "wallmounted", + wall_side = {-0.5, -model.height/2, -model.width/2, + -0.5 + model.depth, model.height/2, model.width/2}, + wall_bottom = {-model.width/2, -0.5, -model.height/2, + model.width/2, -0.5 + model.depth, model.height/2}, + wall_top = {-model.width/2, 0.5, -model.height/2, + model.width/2, 0.5 - model.depth, model.height/2}, + }, + groups = {choppy=1,oddly_breakable_by_hand=1}, + sign_model = model_name, + display_entities = { + ["signs:text"] = { + depth = model.depth-0.499, + on_display_update = signs.on_display_update }, + }, + on_place = display_lib.on_place, + on_construct = function(pos) + signs.set_formspec(pos) + display_lib.on_construct(pos) + end, + on_destruct = display_lib.on_destruct, + on_rotate = display_lib.on_rotate, + on_receive_fields = signs.on_receive_fields, + } + + for key, value in pairs(model.fields) do + fields[key] = value + end + + if not fields.wield_image then fields.wield_image = fields.inventory_image end + + minetest.register_node("signs:"..model_name, fields) +end + diff --git a/signs/textures/signs_20.png b/signs/textures/signs_20.png new file mode 100644 index 0000000000000000000000000000000000000000..43df9d1d944ea9b6a38fa410989297acc855b174 GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b~2qYMGHym0F5=eLSb!1>{TVVKNT0D@?R1)MD z%)rPv?)FK#IZ0z|d6J&`{UFEX2^j%GAip*i_rV(8|Cd#%aY} w6b-rgDVb@NPz?sUM#dqAmR1I)R)%KU21Y;)ivKQ|0yQvry85}Sb4q9e06z*jZ2$lO literal 0 HcmV?d00001 diff --git a/signs/textures/signs_21.png b/signs/textures/signs_21.png new file mode 100644 index 0000000000000000000000000000000000000000..b92710548e77e2c49144f3084b26ffc5ebfe237d GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y=2qYLHV{YC8QY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEL_J*`LpZJ{2P8BcU{R=H zSR!v=!@wYUg@tin%-u6U1*#>k5hW>!C8<`)MX5lF!N|bSRM*f@*T5{q(7?*n$jaDM z+rZGuz#ztH#a$E)x%nxXX_Zh72D(PZA%>P#2BubqX4(cuKn;rjE|~%~FnGH9xvX{TVVKNT0D@?R1)MD z%)rPv4Y~O#nQ4_!4F_E)L2qYK+wpT6yQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEBs^UlLpZJ{|2V#Zk7H)T zj9x`Pj{k;#m>Dc?u%0}BV&`w58r2flh?11Vl2ohYqEsNoU}Ruus%vPdYhV^)XkcY( zWMyosZD43+U=ZW9;x3AY-29Zxv`VN316?EI5JO8V15+zQGi?JSpa#W%mrQ{g7(8A5 KT-G@yGywopK|kUE literal 0 HcmV?d00001 diff --git a/signs/textures/signs_24.png b/signs/textures/signs_24.png new file mode 100644 index 0000000000000000000000000000000000000000..18b37d938cd08c4a3ba0c6c09c38e3eccdb97573 GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ#2qYNxmkP}TQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEq&;06LpZJ{zewaroRIh; z(c(}6>xoy1I}U$fXE1bOy}5s>H7`(^YKdz^NlIc#s#S7PDv)9@GB7mNH8j*UFbgp> zurf8WGB(vVFtjo-h;dqR7ezyEeoAIqB~*ifu90zwp{139sgzopr0M6k+H2?qr literal 0 HcmV?d00001 diff --git a/signs/textures/signs_25.png b/signs/textures/signs_25.png new file mode 100644 index 0000000000000000000000000000000000000000..83737d37d1f5374db48a043ffa63e316b1dd8a06 GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^96-#)2qYL5?orYOQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEq&;06LpZJ{&p7?ytijxe zwgPc!5hnxAe3<{xp25k6-Pvn1vV` zSeY7G8JlVw7+M(^#5k?Ei=rVnKP5A*5~{&K*T^`;(9+7l)XLCI+rS8@LGj-uQ=kS0 MPgg&ebxsLQ0FjD6vH$=8 literal 0 HcmV?d00001 diff --git a/signs/textures/signs_26.png b/signs/textures/signs_26.png new file mode 100644 index 0000000000000000000000000000000000000000..94357c41b80f4a6a91b717200842fe4b8514de66 GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^96-#)2qYL5?orYOQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEq&!_5LpZJ{zeo>YKUBx& z%9hNQ+UD2xpXWcL;tH1Rw~YEtKvk+Gt`Q|Ei6yC4$wjF^iowXh&{WsZP}jgL#L&RX z)X2)%RNKJN%D^DTX~kU>4Y~O#nQ4_!4FzyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEggjjwLpZJ{2P6a}L>&0Q zAj!mFafO{xmpyDVP*%0XHKHUXu_VKd4Z7#dia8d({eY8x0@ z85qPkt+%D~jh&`jIF2&h5v-z8I^1_n=8KbLh*2~7ar C5;>v( literal 0 HcmV?d00001 diff --git a/signs/textures/signs_28.png b/signs/textures/signs_28.png new file mode 100644 index 0000000000000000000000000000000000000000..66fd16ed9d3a11d69d03dcfa4514e9ef69a235e0 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b~2qYMGHym0F5=eLSb!1>{TVVKNT0D@?R1)MD z%)rPvy z4GgUe3}T#C+(prlo1c=IRteQ$plf6tVrXe)U}|M(rfpyZ)S&q9k||IFgQu&X%Q~lo FCIDzHJJ{TVVKNT0D@?R1)MD z%)rPvgnPb!f`!WBf%iy#sLFH zE^~%TRtAGBEDzsz<%t3nsFt`!l%yn;H7NeOWD3;4;OXk;vd$@? F2>>2uJC6VW literal 0 HcmV?d00001 diff --git a/signs/textures/signs_2a.png b/signs/textures/signs_2a.png new file mode 100644 index 0000000000000000000000000000000000000000..27bafea66ff8959630ce3e804ecb2dc68e2bb0c9 GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b~2qYMGHym0F5=eLSb!1>{TVVKNT0D@?R1)MD z%)rPv Cjyk>o literal 0 HcmV?d00001 diff --git a/signs/textures/signs_2b.png b/signs/textures/signs_2b.png new file mode 100644 index 0000000000000000000000000000000000000000..28a8c7f6bf6ced902e47d960433d68fba12dd5f6 GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)L2qYK+wpT6yQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEL_J*`LpZJ{|2Y1k|DlY4 zQKP58dwGTc3l2lU!hjy20@V`Nh?11Vl2ohYqEsNoU}Ruus%vPdYhV^)XkcY(WMyos zZD43+U=ZW9;x3AY-29Zxv`VN316?EI5JO8V15+zQGi?JSpa#W%mrQ{g7(8A5T-G@y GGywoifjkia literal 0 HcmV?d00001 diff --git a/signs/textures/signs_2c.png b/signs/textures/signs_2c.png new file mode 100644 index 0000000000000000000000000000000000000000..16bf1e43cbad10ba792a3ced3d9e6ba9241349bd GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y=2qYLHV{YC8QY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEggjjwLpZJ{R~%?);Bwf} zpvcJJ8^YF@_<;L0P*%0XHKHUXu_VKd4Z7#dia8d({eY8x0@ z85qPkt+%D~jh&`jIF2&h5v-z8I^1_n=8KbLh*2~7Zj C&N~SJ literal 0 HcmV?d00001 diff --git a/signs/textures/signs_2d.png b/signs/textures/signs_2d.png new file mode 100644 index 0000000000000000000000000000000000000000..b555ad6b02276b5e86d47137f497c92329cbf914 GIT binary patch literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1g2qYLnoL0^SQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqE1U+3GLpZJ{|2W9dD8plL zjh`WG3CF=tNp?LzN!1e9h?11Vl2ohYqEsNoU}Ruus%vPdYhV^)XkcY(WMyosZD43+ zU=ZW9;x3AY-29Zxv`VN316?EI5JO8V15+zQGi?JSpa#W%mrQ{g7(8A5T-G@yGywnw CDLR_~ literal 0 HcmV?d00001 diff --git a/signs/textures/signs_2e.png b/signs/textures/signs_2e.png new file mode 100644 index 0000000000000000000000000000000000000000..cdfa677caa3feaf7f36a841fccbfc1051cf3a650 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y=2qYLHV{YC8QY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqE1Uy|FLpZJ{R~%?);Bw$t z!ss`J-I3?a>nT7v)e_f;l9a@fRIB8oR3OD*WMF8jYiOuzU>0I%U}b7#Wo)W#U}$Av z5aYDsE{cZS{FKbJN~i_{T_fWVLrW_IQ!7I=Z382q2E~7uOo190JYD@<);T3K0RRbU BI(z^C literal 0 HcmV?d00001 diff --git a/signs/textures/signs_2f.png b/signs/textures/signs_2f.png new file mode 100644 index 0000000000000000000000000000000000000000..e76fdf4956bfa701864100c5a4bb97e07ff7917f GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1g2qYLnoL0^SQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEBs^UlLpZJ{R~-D%^pH*9 z9m63mg+B*BFf#<0uwV4xm7WAtqgvt`QIe8al4_M)lnSI6j0_A-bqx)54a`Ce4XjL! ztc*>y4GgUe3}T#C+(prlo1c=IRteQ$plf6tVrXe)U}|M(rfpyZ)S&q9k||IFgQu&X J%Q~loCIDHPJ=6dI literal 0 HcmV?d00001 diff --git a/signs/textures/signs_30.png b/signs/textures/signs_30.png new file mode 100644 index 0000000000000000000000000000000000000000..5a57af386dd4b24b0f580d5f4a2f36b75df2bb80 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ#2qYNxmkP}TQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEggspxLpZJ{zeo&lY_jF4 zm-xrPAnn5ZQc!uTHBef$#5JNMC9x#cD!C{XNHG{07@F!D8tNLDg%}!GnHpIcn`#>v zS{WF`IIXygq9HdwB{QuOs=+|l$T-B%(#pWp%Fs;PzzC>8@!us=paup{S3j3^P6{TVVKNT0D@?R1)MD z%)rPvzm0Xkxq!^403{7X=Pw)WoV{tUUftDnm{r-UW| DUjRIb literal 0 HcmV?d00001 diff --git a/signs/textures/signs_32.png b/signs/textures/signs_32.png new file mode 100644 index 0000000000000000000000000000000000000000..9a869a84b2b28def3a0192299ff3dad739fc24f2 GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ#2qYNxmkP}TQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEq&;06LpZJ{zeo&7tYB(M zmw0Ay!(fBKpTr-`43=BiB;`FdV}Z(4OI#yLQW8s2t&)pUffR$0fuX6cp`osUS%{&5 zm8p@Hv8lF!p_PF_jMIv{C>nC}Q!>*kp&ATyjf_JKEv*bptqjey4UB*q6#rc^1!`dM MboFyt=akR{0MbN09RL6T literal 0 HcmV?d00001 diff --git a/signs/textures/signs_33.png b/signs/textures/signs_33.png new file mode 100644 index 0000000000000000000000000000000000000000..0bbaf5958080db303bbe752411a3bf518d8aaf6e GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ#2qYNxmkP}TQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEq&!_5LpZJ{zeo&7tT4Y~O#nQ4_!4F_E)L2qYK+wpT6yQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEq&;06LpZJ{|2X!c=b^-5 zqc#&ZHHFubhwazyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEq&;06LpZJ{CnRoQbdqaR z=h5WR;<4qam-xrPAX~yx`D~BHe4sMb64!{5l*E!$tK_0oAjM#0U}&mqXsByo7Gh{% zWol$)Y^rTwXk}m!AF10$dY#ebJfff^V* MUHx3vIVCg!0E81eu>b%7 literal 0 HcmV?d00001 diff --git a/signs/textures/signs_36.png b/signs/textures/signs_36.png new file mode 100644 index 0000000000000000000000000000000000000000..6553bed9aa20c6fff8c26ef82fd30b9175442a3b GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ#2qYNxmkP}TQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEBs^UlLpZJ{zeo&7+>rQy zagxG~!ynoo@-s-6Fu%NPnfV{6MzzE>q9i4;B-JXpC>2OC7#SFv>KYpA8kmI`8d#Yc zSs9yZ8yH#{7{oZOxQn78H$NpatrDuiK-b7P#L&{pz|_jnOxwT+s6p}HB~zdV22WQ% Jmvv4FO#nzVKjHuY literal 0 HcmV?d00001 diff --git a/signs/textures/signs_37.png b/signs/textures/signs_37.png new file mode 100644 index 0000000000000000000000000000000000000000..53b95417952214a9b6f47dea7595752909794f3e GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ#2qYNxmkP}TQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqE#5`RbLpZJ{CnQ!dwWK!` z@Jakj{K3rNu!r4nN|cEiP=#uVYeY#(Vo9o1a#1RfVlXl=G}SdU)HN^*F*L9;HL@}` z)iyA+GBAj7T5%UeLvDUbW?CgwgMqG*afqR%m4T_1p_#UU5m1BTze}b-4Gf;HelF{r G5}E+@`a5#~ literal 0 HcmV?d00001 diff --git a/signs/textures/signs_38.png b/signs/textures/signs_38.png new file mode 100644 index 0000000000000000000000000000000000000000..0933814d14b32fb60b5c48043978a7883a3d6b50 GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ#2qYNxmkP}TQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEL_A#_LpZJ{zeo&VbmHJ# z^xxnQBZEQ@OJKjw;S8X>YKdz^NlIc#s#S7PDv)9@GB7mNH8j*UFbgp>urf8WGB(vV zFtjo-h;dqR7ezyEeoAIqB~*ifu90zwp{139sgzopr E0DtT{@c;k- literal 0 HcmV?d00001 diff --git a/signs/textures/signs_39.png b/signs/textures/signs_39.png new file mode 100644 index 0000000000000000000000000000000000000000..94dae8884f6a72f7a05d20259090b6da9a0e2e87 GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ#2qYNxmkP}TQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqE#64XcLpZJ{zeo&VJS^6x z?y#x-A^%}{1~nB{PTre!Gk{7|OI#yLQW8s2t&)pUffR$0fuX6cp`osUS%{&5m8p@H zv8lF!p_PF_jMIv{C>nC}Q!>*kp&ATyjf_JKEv*bptqjey4UB*q6#rc^1!`dMboFyt I=akR{0A7?l5dZ)H literal 0 HcmV?d00001 diff --git a/signs/textures/signs_3a.png b/signs/textures/signs_3a.png new file mode 100644 index 0000000000000000000000000000000000000000..09b4793a453e5bd5db809969b62863c0ee6ad32f GIT binary patch literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y=2qYLHV{YC8QY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqE1U+3GLpZJ{R~-1z;K;}^ zF@wQ!3hTioS0*0?N~)H)MwFx^mZVxG7o`Fz1|tJQQ(Z$tT?4ZaLjx;QBP(N5Z39Cq z1A`c+6?aiI literal 0 HcmV?d00001 diff --git a/signs/textures/signs_3b.png b/signs/textures/signs_3b.png new file mode 100644 index 0000000000000000000000000000000000000000..8f9076b212831790858bbd87242fd7bae139aeac GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y=2qYLHV{YC8QY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEL_A#_LpZJ{R~-1z;K<04 z_=TyBg~1|(l`%yBs6J3$wZt`|BqgyV)hf9t6-Y4{85o-C8XD>vn1vV`SeY7G8JlVw z7+M(^#5k?Ei=rVnKP5A*5~{&K*T^`;(9+7l)XLCI+rS8@LGj-uQ=kS0Pgg&ebxsLQ E0G7KttN;K2 literal 0 HcmV?d00001 diff --git a/signs/textures/signs_3c.png b/signs/textures/signs_3c.png new file mode 100644 index 0000000000000000000000000000000000000000..a5313c9dda51ed15654c712cff94659c37d5a2f6 GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1g2qYLnoL0^SQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEBt2amLpZJ{|2X)e`60_; z9yV?TyMqjm{xUH5gs@)}UVbKd4Z7#dia z8d({eY8x0@85qPkt+%D~jh&`jIF2&h5v-z8I^1_n=8 KKbLh*2~7aaBtDk_ literal 0 HcmV?d00001 diff --git a/signs/textures/signs_3d.png b/signs/textures/signs_3d.png new file mode 100644 index 0000000000000000000000000000000000000000..153c2728c82a45c979025a41ecb8af842613a6f1 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ#2qYNxmkP}TQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqE1Uy|FLpZJ{|2WLhq!Yl? z#^7th{&MSgXGx%(YKdz^NlIc#s#S7PDv)9@GB7mNH8j*UFbgp>urf8WGB(vVFtjo- zh;dqR7ezyEeoAIqB~*ifu90zwp{139sgzopr0I;Dt A4*&oF literal 0 HcmV?d00001 diff --git a/signs/textures/signs_3e.png b/signs/textures/signs_3e.png new file mode 100644 index 0000000000000000000000000000000000000000..ced7868e07da9b8ce45ab0cce242975b58fdc00d GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1g2qYLnoL0^SQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEBt2amLpZJ{|2X)e`CwBb z+hIlhf^RM;J_8YE2yDpDzyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqE#64XcLpZJ{zeo&7tT?)FK#IZ0z|d6J&`{UFEX2^j%GAip z*i_rV(8|Cd#%aY}6b-rgDVb@NPz?sUM#dqAmR1I)R)%KU21Y;)ivKQ|0yQvry85}S Ib4q9e0KC9F%K!iX literal 0 HcmV?d00001 diff --git a/signs/textures/signs_40.png b/signs/textures/signs_40.png new file mode 100644 index 0000000000000000000000000000000000000000..65dc19fb32e01e599b2f7ad757454c97e19ab59a GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^+(6952qYN1x@YPEDVB6cUq=SUwgrYSro{vKOeH~n z!3>OyQ~s_4@shmVT^JZv^(q?yd7K3vk;OpT1B~5HX4?T7>Ygr+Asp9}D?T(N)-fGk z#>%skTOvu^z(w6)iA}zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqE#64XcLpZJ{TbwJHlV~Ji zWE8>lu)gg-gQXhl&bIe28-PkwOI#yLQW8s2t&)pUffR$0fuX6cp`osUS%{&5m8p@H zv8lF!p_PF_jMIv{C>nC}Q!>*kp&ATyjf_JKEv*bptqjey4UB*q6#rc^1!`dMboFyt I=akR{0OXWCcK`qY literal 0 HcmV?d00001 diff --git a/signs/textures/signs_42.png b/signs/textures/signs_42.png new file mode 100644 index 0000000000000000000000000000000000000000..7432e5f555999a6965e27533e793790e635de1bd GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)L2qYK+wpT6yQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEL_A#_LpZJ{CnOs%IdO0< z`fvD$nL(g{nX^}O-Vva@YKdz^NlIc#s#S7PDv)9@GB7mNH8j*UFbgp>urf8WGB(vV zFtjo-h;dqR7ezyEeoAIqB~*ifu90zwp{139sgzopr E06yY6NdN!< literal 0 HcmV?d00001 diff --git a/signs/textures/signs_43.png b/signs/textures/signs_43.png new file mode 100644 index 0000000000000000000000000000000000000000..5a2e16565aa13997779c1d2693c946692f784985 GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^96-#)2qYL5?orYOQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEq&!_5LpZJ{TbwbNd~n)9 zIgZ@MHHUfrOa5bKFbH5>f7s(p7EqOHiEBhjN@7W>RdP`(kYX@0Ff`RQG}JXP3o$gX zGBvU?Hq|yTv@$S=aawT~MMG|WN@iLmRD*%8k#UHjrImrHm7$rofe}!H;=fC#Kn)C@ Lu6{1-oD!M<5UM{L literal 0 HcmV?d00001 diff --git a/signs/textures/signs_44.png b/signs/textures/signs_44.png new file mode 100644 index 0000000000000000000000000000000000000000..f2c4d0732575246b62c5ff541a01bebd6e87e498 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)L2qYK+wpT6yQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqE#5`RbLpZJ{KS&NpHfVA( zWwUFm=lRbdSlXRH0hp8c~vxSdwa$T$Bo=7>o=IO?3?obq&ly3=OPIjjW7K zwG9ld3=CqNR@_C=kei>9nN|taV4!Pc9Aao`WngM$Xr^so1k|AT?~*A{1B0ilpUXO@ GgeCy3&pMz0 literal 0 HcmV?d00001 diff --git a/signs/textures/signs_45.png b/signs/textures/signs_45.png new file mode 100644 index 0000000000000000000000000000000000000000..de77e413fbd79c1b476dc88c2914644667d13007 GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ#2qYNxmkP}TQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEL_A#_LpZJ{CnRoQbmHJ# z^xxnQBZE*5v!R~V(_o;yYKdz^NlIc#s#S7PDv)9@GB7mNH8j*UFbgp>urf8WGB(vV zFtjo-h;dqR7ezyEeoAIqB~*ifu90zwp{139sgzopr E04I$)Gynhq literal 0 HcmV?d00001 diff --git a/signs/textures/signs_46.png b/signs/textures/signs_46.png new file mode 100644 index 0000000000000000000000000000000000000000..a19af77fe780b9b98dc5686247f3307d934e15e9 GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ#2qYNxmkP}TQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEL_J*`LpZJ{CnRoQbdodR zY^s;|$G{-`hPiO(hZD^}1*#>k5hW>!C8<`)MX5lF!N|bSRM*f@*T5{q(7?*n$jaDM z+rZGuz#ztH#a$E)x%nxXX_Zh72D(PZA%>P#2BubqX4(cuKn;rjE|~%~FnGH9xvXzyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEq&;06LpZJ{TbwbNd~n*q zc?TyP6gpvb>cjkp_6+)SSm!(aF;W96Q!R0gC`m~yNwrEYN(E93Mh1qax`u|j24*3K z23Dpr2<28LD!1~E=6?xJYO%}>cptAuJW&^0m+F|@QYFtsu?(>5>yYEb-l$rPx8 N!PC{xWt~$(697a>K|ufj literal 0 HcmV?d00001 diff --git a/signs/textures/signs_48.png b/signs/textures/signs_48.png new file mode 100644 index 0000000000000000000000000000000000000000..e49cee4c30c67142d6061d023c2932f4ef7fae31 GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)L2qYK+wpT6yQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEL_A#_LpZJ{8zeC}s|mh0YKdz^NlIc#s#S7PDv)9@GB7mNH8j*UFbgp>urf8WGB(vV zFtjo-h;dqR7ezyEeoAIqB~*ifu90zwp{139sgzopr E05;`1JOBUy literal 0 HcmV?d00001 diff --git a/signs/textures/signs_49.png b/signs/textures/signs_49.png new file mode 100644 index 0000000000000000000000000000000000000000..534500b86473f67c7d06fcd828f939e90e4ef2c3 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y=2qYLHV{YC8QY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqE1Uy|FLpZJ{2P8PO@=M4u zFz`=dIw&VDHWw(TTH+c}l9E`GYL#4+3Zxi}3=BmdKI;Vst0M5-f A)Bpeg literal 0 HcmV?d00001 diff --git a/signs/textures/signs_4a.png b/signs/textures/signs_4a.png new file mode 100644 index 0000000000000000000000000000000000000000..5575e6dba1c86d2caec0096ebe3bd1204338188d GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ#2qYNxmkP}TQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEL_A#_LpZJ{R~%|+(BiS> zsh9Z2z!22K!T4c8$P=KvYKdz^NlIc#s#S7PDv)9@GB7mNH8j*UFbgp>urf8WGB(vV zFtjo-h;dqR7ezyEeoAIqB~*ifu90zwp{139sgzopr E0H$g?OaK4? literal 0 HcmV?d00001 diff --git a/signs/textures/signs_4b.png b/signs/textures/signs_4b.png new file mode 100644 index 0000000000000000000000000000000000000000..0afb35dc4185932b6ca25fa06d293966317b4e20 GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^96-#)2qYL5?orYOQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEq&!_5LpZJ{8>9uKKS-az zo>a<~%;w$ppXWcLU>37xf_L~6peof8*NBpo#FA92s%>CsWnd8FwBjy`hTQy=%(P0V1_NCq;}AnjD+5z2Lo;myBcKMwf0s;w8W=oX L{an^LB{Ts51lm0L literal 0 HcmV?d00001 diff --git a/signs/textures/signs_4c.png b/signs/textures/signs_4c.png new file mode 100644 index 0000000000000000000000000000000000000000..99af40d980399a7d4ecbf49192bfd4c4ccdb87e1 GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ#2qYNxmkP}TQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEggjjwLpZJ{Z%A}#)8VO? z_{YE?nZvxWK1pB>P*%0XHKHUXu_VKd4Z7#dia8d({eY8x0@ z85qPkt+%D~jh&`jIF2&h5v-z8I^1_n=8KbLh*2~7a9 C#yO_| literal 0 HcmV?d00001 diff --git a/signs/textures/signs_4d.png b/signs/textures/signs_4d.png new file mode 100644 index 0000000000000000000000000000000000000000..14648ed30901a4dbbcb4ec85dbd8260840e70d14 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2xkYHHq`AGmsv7|ftIx;Y}EiimBEgr~cDhcun zW?*ET@^>AGm*nm4!oaYqSJ?>2<1FxqEC$jZVC;4>+YZQ(^>lFz;kcf>p*UdzqcR^m zn=U(>Dm$C8!LNFT4hH8&wyjRJqNjigRZCnWN>UO_QmvAUQh^kMk%6J9uA!l>fmw*5 zft9I|m9eR|fuWUwL5$OiyC@oR^HVa@Dxn$-bd8Kd3@xn;Osx#fv<-}a8WjIsG6ia2 N@O1TaS?83{1OU7`JEs5u literal 0 HcmV?d00001 diff --git a/signs/textures/signs_4e.png b/signs/textures/signs_4e.png new file mode 100644 index 0000000000000000000000000000000000000000..57abfbb10bd062d269b7ec2cd47c9dc1df73f35d GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^96-#)2qYL5?orYOQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqE#64XcLpZJ{Z%CQI;^eDf z!s6uJ_MhiJqi_Lp_`g@2=YUF7OI#yLQW8s2t&)pUffR$0fuX6cp`osUS%{&5m8p@H zv8lF!p_PF_jMIv{C>nC}Q!>*kp&ATyjf_JKEv*bptqjey4UB*q6#rc^1!`dMboFyt I=akR{0AgS~WdHyG literal 0 HcmV?d00001 diff --git a/signs/textures/signs_4f.png b/signs/textures/signs_4f.png new file mode 100644 index 0000000000000000000000000000000000000000..06e0c8de054eeedabfc9afd4e4f8f58bac53d87c GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^96-#)2qYL5?orYOQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqE#64XcLpZJ{TbwhPc~FQ; z-B>35$N3NP4EhGF(*+mb7X>O&Epd$~Nl7e8wMs5Z1yT$~28O1(hK9NZW+8?KR;ET) z#-`c^hE@g!F-|M)qG-s?PsvQHglaI*H8Kt{w6roXwK6o*HZTHeQ2ckv6sUp0)78&q Iol`;+08HRK9smFU literal 0 HcmV?d00001 diff --git a/signs/textures/signs_50.png b/signs/textures/signs_50.png new file mode 100644 index 0000000000000000000000000000000000000000..fba27a0a7c3bd7a82fbbe1b09e4953eac3f590dd GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)L2qYK+wpT6yQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEL_J*`LpZJ{CnOs%Ih(Or z8~i!`fuBKW0dr)7*0#w&1*#>k5hW>!C8<`)MX5lF!N|bSRM*f@*T5{q(7?*n$jaDM z+rZGuz#ztH#a$E)x%nxXX_Zh72D(PZA%>P#2BubqX4(cuKn;rjE|~%~FnGH9xvXzyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEBs^UlLpZJ{TbwhPc~FSQ zv~kU0o_fiD%nW*Mtc~a8m=b_$R7+eVN>UO_QmvAUQh^kMk%6J9uA!l>fmw*5ft9I| zm9eR|fuWUwL5$OiyC@oR^HVa@Dxn$-bd8Kd3@xn;Osx#fv<-}a8WjIsG6ia2@O1Ta JS?83{1ORSjJRSf5 literal 0 HcmV?d00001 diff --git a/signs/textures/signs_52.png b/signs/textures/signs_52.png new file mode 100644 index 0000000000000000000000000000000000000000..12fe421a5835c1f7c298c5e55f57030d3b134f45 GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)L2qYK+wpT6yQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEggjjwLpZJ{CnOs%IZOQQ ze<;r&xP;mC4Y~O#nQ4_!4F_E)L2qYK+wpT6yQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEq&;06LpZJ{XCxaWO#qS= zM*>(4Y~O#nQ4_!4F_E)L2qYK+wpT6yQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqE1U+3GLpZJ{CnQ<4GyOOG z!_45M!M^Zx@fl5^q-u$4L`h0wNvc(HQ7VvPFfuSS)ipHKH82Y?G_W!?vNAT+HZZg@ zFo_E)L2qYK+wpT6yQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEggjjwLpZJ{8zecjzyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqE#64XcLpZJ{Z%EmYGJ~h> zc;g4#!}V?d8H}f}EkCC)urf8W zGB(vVFtjo-h;dqR7ezyEeoAIqB~*ifu90zwp{139sgzopr0P3+nfB*mh literal 0 HcmV?d00001 diff --git a/signs/textures/signs_57.png b/signs/textures/signs_57.png new file mode 100644 index 0000000000000000000000000000000000000000..419191c7d59bbe69a1ab5d4d3ff2e5e8290acf02 GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^+(6952qYN1x@YPEDVB6cUq=SUwgrYSro{vKOeH~n z!3>OyQ~s_4@shmVT^JZv^(q?yd7K3vk;OpT1B~5HX4?T7Ql2i3Asp9}4Z;!{7I<bP0l+XkKH9b9J literal 0 HcmV?d00001 diff --git a/signs/textures/signs_58.png b/signs/textures/signs_58.png new file mode 100644 index 0000000000000000000000000000000000000000..1175a0e48fd905ff7d35b19566a08adbdf13d2c7 GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^96-#)2qYL5?orYOQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEBt2amLpZJ{Z%EmYGUH5v z42QaL!;Sxv|Ckx{4OpkYvpZo0RHRzs8c~vxSdwa$T$Bo=7>o=IO?3?obq&ly3=OPI zjjW7KwG9ld3=CqNR@_C=kei>9nN|taV4!Pc9Aao`WngM$Xr^so1k|AT?~*A{1B0il KpUXO@geCxo!9Fqo literal 0 HcmV?d00001 diff --git a/signs/textures/signs_59.png b/signs/textures/signs_59.png new file mode 100644 index 0000000000000000000000000000000000000000..9a5239796cb5326fe92d1b60a2e772e520741a20 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRQ2qYN%>O6&k6id3JuOkCv+XBNE)8c`Arjj7P zUWq#3umNsFt`!l%yn;H7NeOWD3;4;OXk; Jvd$@?2>`43Jpcdz literal 0 HcmV?d00001 diff --git a/signs/textures/signs_5a.png b/signs/textures/signs_5a.png new file mode 100644 index 0000000000000000000000000000000000000000..64c1c4f07a8cb2b46d22d2cb5e45ba8d6b6dcce6 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)L2qYK+wpT6yQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEWISCQLpZJ{CnWti@}cLU zjI;b<8#Ze;wYGYm{|uHh*aUaB6@fIVmbgZgq$HN4S|t~y0x1R~14C0?LqlByvk*fA zD^nvYV^eJdLn{M=7^f9?Q8eV{r(~v8LNyrZ8X1QeT3Q*HS{a&Y8yEpKDE_--3e>>h M>FVdQ&MBb@0IDQEbpQYW literal 0 HcmV?d00001 diff --git a/signs/textures/signs_5b.png b/signs/textures/signs_5b.png new file mode 100644 index 0000000000000000000000000000000000000000..c36040364afcaf06ef1d2ad5269ddd03baaf2120 GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b~2qYMGHym0F5=eLSb!1>{TVVKNT0D@?R1)MD z%)rPvzyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEBs^UlLpZJ{uSi&taD%bM zyx{|@z`ukaj0`SY*f09|SN{d7Q7v(eC`m~yNwrEYN(E93Mh1qax`u|j24*3K23Dp< zR>r2<28LD!1~E=6?xJYO%}>cptAuJW&^0m+F|@QYFtsu?(>5>yYEb-l$rPx8!PC{x JWt~$(69BKYKCb`( literal 0 HcmV?d00001 diff --git a/signs/textures/signs_5d.png b/signs/textures/signs_5d.png new file mode 100644 index 0000000000000000000000000000000000000000..2309ee8ac8fe9d67c497d6e44006091d01b5dd33 GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b~2qYMGHym0F5=eLSb!1>{TVVKNT0D@?R1)MD z%)rPvzyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEggjjwLpZJ{&p3GC-~`4N zdjSCkD;0Lf-fz`s%>Cs zWnd8FwBjy`hTQy=%(P0V1_NCq;}AnjD+5z2Lo;myBcKMwf0s;w8W=oX{an^LB{Ts5 D4i`FP literal 0 HcmV?d00001 diff --git a/signs/textures/signs_5f.png b/signs/textures/signs_5f.png new file mode 100644 index 0000000000000000000000000000000000000000..e7a4d90b140d6873b9387585f5746300affcdbfc GIT binary patch literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)L2qYK+wpT6yQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEcs*SlLpZJ{|2W>jHx6jjo5~?Mx5hW>!C8<`)MX5lF!N|bSRM*f@*T5{q(7?*n$jaDM+rZGuz#ztH y#a$E)x%nxXX_Zh72D(PZA%>P#2BubqX4(cuKn;rjE|~%~FnGH9xvXzyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqE_&i-4LpZJ{M;!RTAj`xM zbcLhwrDdfkP)4=HHKHUXu_VKd4Z7#dia8d({eY8x0@85qPk yt+%D~jh&`jIF2&h5v-z8I^1_n=8KbLh*2~7Y`GC5EH literal 0 HcmV?d00001 diff --git a/signs/textures/signs_61.png b/signs/textures/signs_61.png new file mode 100644 index 0000000000000000000000000000000000000000..874433dfdbe9fa95dd4d8ba45e9daca7178fc521 GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)L2qYK+wpT6yQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEBt2amLpZJ{|2Y1ke__93 z@4{Y3UJiA}%Kr=w4s3z<48l5rid0KnBT7;dOH!?pi&B9UgOP!usji`+u7O#Ip@EgD zk(IHjwt=CQfkBMZin}Npa`RI%(<-4F40Mf*Lkumg3{0&I&9n`SfEpD4T`~n~VDNPH Kb6Mw<&;$VQraqMb literal 0 HcmV?d00001 diff --git a/signs/textures/signs_62.png b/signs/textures/signs_62.png new file mode 100644 index 0000000000000000000000000000000000000000..f29b709ae52e3528b054ba9ad1772117fe8b8a9f GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ#2qYNxmkP}TQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqE#5`RbLpZJ{Z%Evb_#iQ$ z(Mhh&o~NEcn1xxgsOHlWpbFIz*NBpo#FA92 zs%>CsWnd8FwBjy`hTQy=%(P0V1_NCq;}AnjD+5z2Lo;myBcKMwf0s;w8W=oX{an^L HB{Ts5GOs)A literal 0 HcmV?d00001 diff --git a/signs/textures/signs_63.png b/signs/textures/signs_63.png new file mode 100644 index 0000000000000000000000000000000000000000..6d46292f05a91e63bf475da8048ceea79e3ab11b GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1g2qYLnoL0^SQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEBs^UlLpZJ{|2X)ed113- z^FbyK(*_*{c?OFwtQ)l=Gdh53R7+eVN>UO_QmvAUQh^kMk%6J9uA!l>fmw*5ft9I| zm9eR|fuWUwL5$OiyC@oR^HVa@Dxn$-bd8Kd3@xn;Osx#fv<-}a8WjIsG6ia2@O1Ta JS?83{1OP!LJ)Qsn literal 0 HcmV?d00001 diff --git a/signs/textures/signs_64.png b/signs/textures/signs_64.png new file mode 100644 index 0000000000000000000000000000000000000000..30e449732a09a25052dfcb2bfe0ba62775e670f8 GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ#2qYNxmkP}TQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqE#64XcLpZJ{R~-7#var>W zl`C4}pTQqS1``(6$VJPKMFW+nmbgZgq$HN4S|t~y0x1R~14C0?LqlByvk*fAD^nvY zV^eJdLn{M=7^f9?Q8eV{r(~v8LNyrZ8X1QeT3Q*HS{a&Y8yEpKDE_--3e>>h>FVdQ I&MBb@0NejP6aWAK literal 0 HcmV?d00001 diff --git a/signs/textures/signs_65.png b/signs/textures/signs_65.png new file mode 100644 index 0000000000000000000000000000000000000000..8644032ee19ceb959ec6b52d1e910972e394f40c GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ#2qYNxmkP}TQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEBt2amLpZJ{|2X`iePO#} zYh&v{Hji%%mGunfHLMd=Z3978s+PD$l%yn;H7NeOWD3;4;OXk; Jvd$@?2>{rhK6wBD literal 0 HcmV?d00001 diff --git a/signs/textures/signs_66.png b/signs/textures/signs_66.png new file mode 100644 index 0000000000000000000000000000000000000000..5d4f4b9cd6a44db579402d8a7adb678c10995c3f GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1g2qYLnoL0^SQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEL_A#_LpZJ{zew1SFo7XS z;?Kbk%nY(D%nv`@{dWK;uUg_7QIe8al4_M)lnSI6j0_A-bqx)54a`Ce4XjL!tc*>y z4GgUe3}T#C+(prlo1c=IRteQ$plf6tVrXe)U}|M(rfpyZ)S&q9k||IFgQu&X%Q~lo FCIH(tJ?H=c literal 0 HcmV?d00001 diff --git a/signs/textures/signs_67.png b/signs/textures/signs_67.png new file mode 100644 index 0000000000000000000000000000000000000000..990e8e3f8b610320dc8e9b08e1ff74e40423bc2e GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ#2qYNxmkP}TQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqE#64XcLpZJ{|2X`iJ&~)K zOJtjYP2vki2J<nC}Q!>*kp&ATyjf_JKEv*bptqjey4UB*q6#rc^1!`dMboFyt I=akR{0FpI4VE_OC literal 0 HcmV?d00001 diff --git a/signs/textures/signs_68.png b/signs/textures/signs_68.png new file mode 100644 index 0000000000000000000000000000000000000000..6b936aa5c242bbf8d14f2f1b64d0a4f27f1eb6bd GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ#2qYNxmkP}TQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEL_A#_LpZJ{Z%Evb_#iQ$ z@vuElJ%ex!v*G3a7Jfi^)e_f;l9a@fRIB8oR3OD*WMF8jYiOuzU>0I%U}b7#Wo)W# zU}$Av5aYDsE{cZS{FKbJN~i_{T_fWVLrW_IQ!7I=Z382q2E~7uOo190JYD@<);T3K F0RaDKJL>=d literal 0 HcmV?d00001 diff --git a/signs/textures/signs_69.png b/signs/textures/signs_69.png new file mode 100644 index 0000000000000000000000000000000000000000..3251e2e8052b3b7928705885ea1e6c252579c324 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y=2qYLHV{YC8QY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEggspxLpZJ{2P9M+SkS;C zZ(zf~AQQsen0fr;GN80-iEBhjN@7W>RdP`(kYX@0Ff`RQG}JXP3o$gXGBvU?Hq|yT zv@$S=aawT~MMG|WN@iLmRD*%8k#UHjrImrHm7$rofe}!H;=fC#Kn)C@u6{1-oD!M< DpzyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqE1Uy|FLpZJ{2P9M+SkS;E z%pf_1$+2(o{H;Ja)e_f;l9a@fRIB8oR3OD*WMF8jYiOuzU>0I%U}b7#Wo)W#U}$Av z5aYDsE{cZS{FKbJN~i_{T_fWVLrW_IQ!7I=Z382q2E~7uOo190JYD@<);T3K0RZ~X BI$i(( literal 0 HcmV?d00001 diff --git a/signs/textures/signs_6b.png b/signs/textures/signs_6b.png new file mode 100644 index 0000000000000000000000000000000000000000..788c3df632148b23219105d1f66cd5cf14dd1188 GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)L2qYK+wpT6yQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEq&!_5LpZJ{Zveu8FGVB1VQY~?fC`m~yNwrEYN(E93Mh1qax`u|j24*3K23Dp< zR>r2<28LD!1~E=6?xJYO%}>cptAuJW&^0m+F|@QYFtsu?(>5>yYEb-l$rPx8!PC{x JWt~$(697LDJox|s literal 0 HcmV?d00001 diff --git a/signs/textures/signs_6c.png b/signs/textures/signs_6c.png new file mode 100644 index 0000000000000000000000000000000000000000..534500b86473f67c7d06fcd828f939e90e4ef2c3 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y=2qYLHV{YC8QY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqE1Uy|FLpZJ{2P8PO@=M4u zFz`=dIw&VDHWw(TTH+c}l9E`GYL#4+3Zxi}3=BmdKI;Vst0M5-f A)Bpeg literal 0 HcmV?d00001 diff --git a/signs/textures/signs_6d.png b/signs/textures/signs_6d.png new file mode 100644 index 0000000000000000000000000000000000000000..fca6d31c9480963099981cb345247ca179e5bb63 GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRQ2qYN%>O6&k6id3JuOkCv+XBNE)8c`Arjj7P zU}an4`gPcFC*RG?bo8c~vxSdwa$T$Bo=7>o=IO?3?obq&ly3=OPIjjW7K zwG9ld3=CqNR@_C=kei>9nN|taV4!Pc9Aao`WngM$Xr^so1k|AT?~*A{1B0ilpUXO@ GgeCwv89dwo literal 0 HcmV?d00001 diff --git a/signs/textures/signs_6e.png b/signs/textures/signs_6e.png new file mode 100644 index 0000000000000000000000000000000000000000..10930a1a6e2b4d9b34fc5ec840550ec0c096a0dc GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ#2qYNxmkP}TQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEggspxLpZJ{|2X`i{b0Kz zD_>&`gOLr($C)ZT{6J~d64!{5l*E!$tK_0oAjM#0U}&mqXsByo7Gh{%Wol$)Y^rTw zXk}m!AF10$dY#ebJfff^V*UHx3vIVCg! E0I9P(Q~&?~ literal 0 HcmV?d00001 diff --git a/signs/textures/signs_6f.png b/signs/textures/signs_6f.png new file mode 100644 index 0000000000000000000000000000000000000000..f4aef647de4e4675b63da01004f22825d4dea21e GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ#2qYNxmkP}TQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEL_J*`LpZJ{|2X`iePO#J zD_3>H9(x807S@@{g5T1C3RFv6BT7;dOH!?pi&B9UgOP!usji`+u7O#Ip@EgDk(IHj zwt=CQfkBMZin}Npa`RI%(<-4F40Mf*Lkumg3{0&I&9n`SfEpD4T`~n~VDNPHb6Mw< G&;$Timpoel literal 0 HcmV?d00001 diff --git a/signs/textures/signs_70.png b/signs/textures/signs_70.png new file mode 100644 index 0000000000000000000000000000000000000000..dac5f79c45052098fc67d17b3f8a5a545abc0d43 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ#2qYNxmkP}TQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqE#5`RbLpZJ{|2X`i{b0Kz zD_5mNjzkWF-Vx?Vp;uggfhtr>Tq8bP0 Hl+XkKvw}SB literal 0 HcmV?d00001 diff --git a/signs/textures/signs_71.png b/signs/textures/signs_71.png new file mode 100644 index 0000000000000000000000000000000000000000..cc319726e649b8b57834b625fa36a397c1d6f9e0 GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ#2qYNxmkP}TQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqE#64XcLpZJ{|2X`iJ&~)K zOJtjYO=1NTgZUTMOolb-sz4>GC9V-ADTyViR>?)FK#IZ0z|d6J&`{UFEX2^j%GAip z*i_rV(8|Cd#%aY}6b-rgDVb@NPz?sUM#dqAmR1I)R)%KU21Y;)ivKQ|0yQvry85}S Ib4q9e0FIeFUH||9 literal 0 HcmV?d00001 diff --git a/signs/textures/signs_72.png b/signs/textures/signs_72.png new file mode 100644 index 0000000000000000000000000000000000000000..d8dbcee1083342a65961bff1aea3e130d7a93d4c GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1g2qYLnoL0^SQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEL_J*`LpZJ{|2X)e`CzkS z(?KS##u^4=7goh!p`ccv0@V`Nh?11Vl2ohYqEsNoU}Ruus%vPdYhV^)XkcY(WMyos zZD43+U=ZW9;x3AY-29Zxv`VN316?EI5JO8V15+zQGi?JSpa#W%mrQ{g7(8A5T-G@y GGywoUJ3Ji# literal 0 HcmV?d00001 diff --git a/signs/textures/signs_73.png b/signs/textures/signs_73.png new file mode 100644 index 0000000000000000000000000000000000000000..60911df8c56ce369f3fa09c498e17dc419a862cd GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ#2qYNxmkP}TQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqE#5`RbLpZJ{|2X`iePO#J zYsdTsPX&1fXB)PINi{Befhtr>Tq8bP0 Hl+XkK;Fdi_ literal 0 HcmV?d00001 diff --git a/signs/textures/signs_74.png b/signs/textures/signs_74.png new file mode 100644 index 0000000000000000000000000000000000000000..079e2f1c007814c121de798d41709d6a56d85c6b GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b~2qYMGHym0F5=eLSb!1>{TVVKNT0D@?R1)MD z%)rPvAi*F(Ai<#F z5GRkk1W-cs3iCqM4LiR9m8h1uMwFx^mZVxG7o`Fz1|tJQQ(Z$tT?4ZaLjx;QBP(N5 zZ39Cq1A`c+6?aiIzyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEggspxLpZJ{|2X`i-I0}V zIYVVVgOLcUCGU?!f1tE#iEBhjN@7W>RdP`(kYX@0Ff`RQG}JXP3o$gXGBvU?Hq|yT zv@$S=aawT~MMG|WN@iLmRD*%8k#UHjrImrHm7$rofe}!H;=fC#Kn)C@u6{1-oD!M< DQvW)v literal 0 HcmV?d00001 diff --git a/signs/textures/signs_76.png b/signs/textures/signs_76.png new file mode 100644 index 0000000000000000000000000000000000000000..5101584114e88104e877a23802f07e8baf365a50 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ#2qYNxmkP}TQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEBs^UlLpZJ{|2X`i-I0~& zy1^HNJB*+HF)&!muoc$1-T4Gmqgvt`QIe8al4_M)lnSI6j0_A-bqx)54a`Ce4XjL! ztc*>y4GgUe3}T#C+(prlo1c=IRteQ$plf6tVrXe)U}|M(rfpyZ)S&q9k||IFgQu&X J%Q~loCII?yKQ90P literal 0 HcmV?d00001 diff --git a/signs/textures/signs_77.png b/signs/textures/signs_77.png new file mode 100644 index 0000000000000000000000000000000000000000..d2bdb98be434cab5e7729183a30a150a35643c5d GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^96-#)2qYL5?orYOQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEL_A#_LpZJ{|2Y3)zN0XY zdb8pLeg-QmHpAcLo`yhq)e_f;l9a@fRIB8oR3OD*WMF8jYiOuzU>0I%U}b7#Wo)W# zU}$Av5aYDsE{cZS{FKbJN~i_{T_fWVLrW_IQ!7I=Z382q2E~7uOo190JYD@<);T3K F0RU{WI?w_E)L2qYK+wpT6yQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEBs^UlLpZJ{|2Y1k|6s?$ z-iI;*(u|4|_!%5C*fNj*n$Zqaqgvt`QIe8al4_M)lnSI6j0_A-bqx)54a`Ce4XjL! ztc*>y4GgUe3}T#C+(prlo1c=IRteQ$plf6tVrXe)U}|M(rfpyZ)S&q9k||IFgQu&X J%Q~loCIAwRKPCVG literal 0 HcmV?d00001 diff --git a/signs/textures/signs_79.png b/signs/textures/signs_79.png new file mode 100644 index 0000000000000000000000000000000000000000..15a76a7056c5db198bf37e0ccffb96666ee9d59f GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ#2qYNxmkP}TQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEL_J*`LpZJ{|2X`i-I0|m zTH+kTLm38>JFJf7v1d*I6{wcDMwFx^mZVxG7o`Fz1|tJQQ(Z$tT?4ZaLjx;QBP(N5 zZ39Cq1A`c+6?aiIzyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEq&!_5LpZJ{|2X`iy|MKn z=V8e4Y~O#nQ4_!4FzyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEggspxLpZJ{TO2fC=Fwg7 zg{MuJ!CHj%qo?9DPoT7FiEBhjN@7W>RdP`(kYX@0Ff`RQG}JXP3o$gXGBvU?Hq|yT zv@$S=aawT~MMG|WN@iLmRD*%8k#UHjrImrHm7$rofe}!H;=fC#Kn)C@u6{1-oD!M< DtSLEh literal 0 HcmV?d00001 diff --git a/signs/textures/signs_7c.png b/signs/textures/signs_7c.png new file mode 100644 index 0000000000000000000000000000000000000000..db5bdb36204e2e2c1b8e3cff129c2bbaf49f323e GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^OhC-V2qYM`&D-<@NU@|l`Z_W&wkvn1vV`SeY7G8JlVw7+M(^#5k?E wi=rVnKP5A*5~{&K*T^`;(9+7l)XLCI+rS8@LGj-uQ=kS0Pgg&ebxsLQ0Hatp=>Px# literal 0 HcmV?d00001 diff --git a/signs/textures/signs_7d.png b/signs/textures/signs_7d.png new file mode 100644 index 0000000000000000000000000000000000000000..52a64afe2b70a5c35d28a7df6e604054672c11b3 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1g2qYLnoL0^SQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEggspxLpZJ{Z%CNI*rvYV z3lAGNgBc5JqUh@h6M)jHC9V-ADTyViR>?)FK#IZ0z|d6J&`{UFEX2^j%GAip*i_rV z(8|Cd#%aY}6b-rgDVb@NPz?sUM#dqAmR1I)R)%KU21Y;)ivKQ|0yQvry85}Sb4q9e E0QdDe3;+NC literal 0 HcmV?d00001 diff --git a/signs/textures/signs_7e.png b/signs/textures/signs_7e.png new file mode 100644 index 0000000000000000000000000000000000000000..8a9a8655ebec82a780867b7a6421aa6c7d0bb614 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ#2qYNxmkP}TQY`6?zK#rxZ3_%vOp6EdnM#8E zf*BYYr~F+9;w5>zyD%`U>Qy!Z@;D1TB8!2v2N=7Z%(eqEggspxLpZJ{|2WLh6f99A z@$Y~FL+Bcgg8|-uo&u#+OI#yLQW8s2t&)pUffR$0fuX6cp`osUS%{&5m8p@Hv8lF! zp_PF_jMIv{C>nC}Q!>*kp&ATyjf_JKEv*bptqjey4UB*q6#rc^1!`dMboFyt=akR{ E05iQjt^fc4 literal 0 HcmV?d00001 diff --git a/signs/textures/signs_black_inventory.png b/signs/textures/signs_black_inventory.png new file mode 100644 index 0000000000000000000000000000000000000000..4b10ee397f0b3a9152e61dbcf7496bdba6ad177c GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8!3Q zuY)k7lg8`{prB-lYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&Kt*kyE{-7) zt#7Y7aW=N;oPk?m$?HPm^^N&RyH#z z7sO8?NfDv}F9Ipyj~GRlsoDZdt?1R~}U&Kt(N{E{-7) zt#7Xy@*Pm%Xia>x&|-f1~}U&Kt=VQE{-7) zt#7Y7@--N6xCFjhXc7PZ*uj0$$yb)_(z@*85%F1S)l8gbokp9szR)H(SA%4eCxzJCqo%onZWZnk&x!;Tkz! wf7Tkdi8ftRkFSu`o-oyhohzV$=>((oZoOsIy|a{3fKFlXboFyt=akR{0FKjES^xk5 literal 0 HcmV?d00001 diff --git a/signs/textures/signs_blue_street.png b/signs/textures/signs_blue_street.png new file mode 100644 index 0000000000000000000000000000000000000000..540a3904deadd6a452b0b47c2d28e3cbf45d6663 GIT binary patch literal 436 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8!3Q zuY)k7lg8`{prB-lYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&3=E8ho-U3d z5v^~pD`p>dkT~|S{+Ps8;e|>{8&9*Z=(rX0oXNPbHB2sq?HecC)YcOnvxJOStdT4h z{L3(NZ&!zqp>&eb)QQrPJ~Anf;>6=V{;_!Xpp*5xuJXC7Gaj;i&}X>*xBqb=^MRy~ zO;aQ%pX{ABVOQRVJso%7NjChnkz*@Sb~#b^|5(=6i%cGuB@_=GoO`vt?ea@qr z{aG3pXq<~;*!O7XE>p)@7+No=Fw9__QKj5Eh;K}DPb7PEM7GufMEzDnz8|_bHGcbF= ZUGh3DsP9vXC@_Q>JYD@<);T3K0RX?2u}S~{ literal 0 HcmV?d00001 diff --git a/signs/textures/signs_blue_street_inventory.png b/signs/textures/signs_blue_street_inventory.png new file mode 100644 index 0000000000000000000000000000000000000000..a702669d5262356df298b79adc6fb7d13948b435 GIT binary patch literal 472 zcmV;}0Vn>6P)9eFrZiB21~fN!<+q zfLUKK=Ktz45S`d(LAWjAlCrFzEGx*e*3>jt(xs-kl4Y%j^MNJxzOykpAp#r@uh?#% zwcIvIA_x(T_E`T78S}}q?jb~g-R=pVCs3AWEdZ|TAkSm$_b-U!BQBTs;R%!_lrn{F z&$XHZKv|yQc>=aQhm@((Qzk%k0%N{5<1zIfqZ61y2EYIq00UqE41faAwjGirg6lfk zja=73l0<0R?t1{vLsV6bJdd?P^ns+RYH%JZJtYrh*)4(<#T#sUt~HWXRgJ~s0RXUC zMMEAK&4h7$gp?^Zn@24GZQFtKZ~*u!Wdd5~}U&Kt=tYE{-7) zt#7X=@-;gMxIH|+Y zrskP5CoB}xV;C4&1RjVqa3A>e+hC8{z1!DSqvG>>e9tdlqjBcUyYuIC_qnfmD>MIq z^}hVH`;3e%90L1WzAs5*keGc>bRwUi0RP13p9$wSGBa@~G%#2`=U~}U&Kt)qLT^vIq zTHjt#xLtgu>7hyn&sGT&&gT+GmU+5<<>CAv^Pn~< zZPH9ZOUo^K4Gc^i3?d3&M8z6@|2|n@ZCo3tcQJNz>YFOQ+0#dZ#WD$6bP0l+XkK;1gtj literal 0 HcmV?d00001 diff --git a/signs/textures/signs_poster.png b/signs/textures/signs_poster.png new file mode 100644 index 0000000000000000000000000000000000000000..92a314476ff81ea202956ca92b3e1229bedd0fb0 GIT binary patch literal 1600 zcmV-G2EX}_lB8KTLX8j zEFgiZ0YVT&bJUc2RF-AIy&)n1M1UxG8)Jbt$6G~3D2srgs4A^iT7&g;0RmA)BXDy zFTed1ww$3yIiht>)_Nb4SMxLa8-#{9B_Rh#ydND?S&3v*s|TgIBN0fi;$?k*7s;_d z-i;mm6YJ?c`}W9sx<{xU_ec!H_U&PQdu$K5JH-qYMSlI|?{R+n$19^Xa|NK9P{~j^ zV(LK7%a#4nP_;?ifhc5^q@-LCjBvt(vK^HRGSzBX-}UJ3k+?_YiDi9v7rDrlM=}o| z$S3>|_|zB0qanZi{I_`X_7Ag!qJMZNI$c!g`5i32Ml+C$xn`7e1}1$^k`plsBq*oz zx!*e3U)zDIArd_b=|Yr;w^k{o;NEcOCOwH@>utA`(o+-J^={Pl_Tr^AXI+OFWhWC- zXwH`(*Q(~`)H_EIYU;bz6j_rZv^nva7f93w}2!Xsj|1(5NYWodzqK5Y_=slli zHlrG(9FY%r2O<$cYZX%i$?}uFW*8PhDEqc^zLa^$gDa(Z_^zdd3mct(OefBh+}tX=pEC*y`j1$8Ga3%YTfb>Zu^HZA zG?&3(=)OQ?8jw*LcWT&CAgP219JQhnsEE+Kb)xvxgHlT0OK7#;kgdCWL@)3&}v2g z^XsQ5%X#`gk!v>`kqq)(eV|V#JZjEo2i2QKlt|_GBLOkjc{@4+Ykn-q|Lumy_DK0o zR5_QTlb+z+-ME?NqsNl$*%Pv|=PD#~jXoo*vL4!Qkx~{cD y8$tR?N6d(>@zc^zW0PpM;Ys02#-LlW#(x2*qDcUWE$RmV0000UPwHd(*|DGL@>Sg?Q< z3-}8le?VZ#f(`6p0RlFN9TADLK|!FvW+Gt-D3O)$kisICUzoAyKJYjmj}%WoPE{7? zbl=-|?lsG_)Vh66_c^EPtFOMQEAGz6c@@ip50CCR2B9bbM^tfl%nS_yL2!$R21EpR zP?g070yspAsAw9vgD4_SQ`ZPE{?xPmB3(A1Z6l#9(4Zhf+qSqnqtO;21k4=`$!2p$ zRMO@uxJa@_hzMp7iW1SmkwXK<<1u8#B|M=&7y#9w>e*BYPu)BMeZ@%y%kB^SH```x{fJa|Z5)rbmjz4Z>ieeKs=yY?>M z`1;q_+q;hg=gvJt+eSp-^y$;M8A#$wQH}-%$Z{ISX6`+M1r8oOL{*v3A26N$kMrlx za&c#y!$*faI(*Fb_Bk%?>~Qel14g5Q!=obv;l|BdeChcsG<8i?H=I3t1~(^!fSXZl zU6i#3w9VYjA|VvGS%OP)NFb$QMkaX$?v9Ak<)DaU*4x6%gfH&tF1L0TOzbAzowk{I zQ%${X=3X67JTYQ%cXLfW8_YNL{KU6yGavkRcYQqZA+H}!O7oV>5A=|-T}TwOw5BKuR5gbwf_n=5L6TIpc4&PjC~mf z2q8sp;kEakckp(Eb$4QH2^v6B`bl21QHZK1_fMo2;MJ4;6Y0d7v|~k->S}iKeKp;j zhHW$RE`~t^F}A(9q+UZ&Q5+{`bdn4wqPcg{OwS|jyQW=p6%MTpvZnxw;1_3XSfv+Q|}x2JwF&8L`~TTVIc1**&9jvMZVnX$Db z#lwEUozeKxfTc|}Wqj%~t5;Lc)-t}XrkJIMGz%d?1LhIW&&$_|e!y`oCQCz+#0E*_ zw<|6pk{O-SRYedDz4QV@HOweL%AIm+gAjED6cvi1$a@K~ZI{TF4$=@nB#nCnvlRD@ zXI9fLG%I}qtO^k+3|;XUZS4S19Z%MZQB%)P%y)HUwO%aNOb6pN{lKCcO5e*c(E1bx zU9i<1>no@(6{3Vx`abOlPEl^JC!ruut%glCrC8%tdN-ro+NN#h1J9dkMhKez^aR0I zy5f~IoVn-9w_Mpo1dB0y6H!U5jxiBZbH{{8BI^n+oOVy&_@Z>vnV8G9>Y_{5 gB_!5{;N!SH0(v!4)!&7-+yDRo07*qoM6N<$g6V+rdH?_b literal 0 HcmV?d00001 diff --git a/signs/textures/signs_wooden_inventory.png b/signs/textures/signs_wooden_inventory.png new file mode 100644 index 0000000000000000000000000000000000000000..e93ebe264bc7f0630c5de9c1e6218c672a88c709 GIT binary patch literal 1289 zcmV+k1@`)hP)q~(g_id-&lLx3|FpwVcw1KR5gH(v+rsFSYq zo$hl^wFn{bE|+|#(H{U0fCs?;13>?4^Xo4@4MGZ9>kvw?*)#}xj4`;j!~2$WFhEHS z1e(U8m8A2YNJsRcM}(dpLFX(W{+XSi7Xje`33YvU?stEEE&dD8b{)U@@)t-H!z|(Y z@{+FiSlh6-zen!_)lJE|sTdD3l$J3Bv^fozx}fNHho_g@|G zw;wJLLZOX$a|3UlAkrH8K(#J#O~)u5^JwvyG)j4S_>x#f%(rID^9d@7NX?LT-QqVb zr-v`e)0koG2;x4VZ5>Tx@k(*_>V(Z^L$z9w zPjY7YHbuGSq9}0zhT}0l)+BifCZR*{{r5*?qXZL0L<$amI0UJQB7^T0AAk6a&p+8_ zJehKPTiyql*s$1JkO1@f45>U4M_Cl4!vsknSWjzP4!?WOkI#>2*A}f6JF^8JJblXH z!4Vg)UL%9x>HE(xC~nFPMhlk9l8?5BY)36wKDiGFZO!W+570qlBxre;37w~|N|Gcd z$`p~3!~?@*G$0xz$llX+o@P^Ft>b!m$>nu{Yc0#w6+a!H()9vccbuMG@T-qz479r6 z1-=KR2UK>2?_-?zBpVLVgxC zNrxjQ(~QOnHg$z-Ym|=Yq$H9(y;2yH6DJY6u8FllM3VEvW14lvVt1D;8&fO`F3SyH zeOK_s{{oUU!*+r3bcFAE-uwA8%-I!*QD_aVm)OlMqhU%nh-p{1gw}C+al>kL!`}X5 zM(GwWj$bgHK4N=5WoI_Qk8^ZnD2i*2kB<4an$Y~mC+rQNx-EI}%{NFKPu_cm)IEKD z!+Hgs3gm+UqpdCCG^1bFBw0$+2NsWa*cS^-l2SXzho5{5UVzq2@&!bis=Q@)vd@j0 z^5W0WQSvQC82X-cXU_I?3lSVf8RmPtR8@;G2}OCuG)_=Pk}sw->x$)1C*;!+gKUJB zF~|*V+aa|=X@z$kwp{b-^n}r9#vlK3KxZA$-v^j1<Cbp*?)oy9p!3;_dQQ` zci8>eBV1bphT`Iy&8A|KPw-6x%He{gwKbj|*E!BF3-U=uU2j;Oo$;r?pL20_%V;#g zzYP#6#c%)cHA*SEeu*OBeLzPMU3)~esYsHTyCE9zwx#bq&N;M-?)ph6l#*E6q67#8 z0T3b(dXI?{n${xZzelln_?ABa9sm!3cMbRl(Geq4I_||U00000NkvXXu0mjfdG1J~ literal 0 HcmV?d00001 diff --git a/signs/textures/signs_wooden_left.png b/signs/textures/signs_wooden_left.png new file mode 100644 index 0000000000000000000000000000000000000000..a3b6600b4bf37d8402242a857c4c950cbe687010 GIT binary patch literal 2559 zcmV|wqP)~rq9nd!{DS)D7ZY*`2_WRDP2 zEL)!Q3JBf@@feJe7#bu-3}9q~RgH?wy4l^+?QS&@3{Js(Nh{)4{C|95{_fXbYRQG1 z6R~OV-cw3NYGq9;{ierRPgS87L8Q|54N?SA#R64?QVYQc5T$7%>zXMwq_%O6HRE? z?FO_8UJ$C7s|qP$jDl5)7B<6xic+LfYo&>iv@Udg4}cg07^+m%g0X;rZyI9TP-~@B z5DbE$6k*u(h$^LIoO9R^8w|=aPgrx6yjEoySKhyWKt(VZO0B3G+O`D@IcF5G&Vhlv z7QC^nB~$Xsx@J%X3*LLWt_2@Bj}z;fD7lhL!5-ed#Ti56BU&p~lzEyk&T_Ncl1oNW zj4{{YniF6sr83PE=kpmA0Hvr9L&G>Fj8#NIt75ICmWnaZb}c>zY86V#_!zFTf}_?# z$r3V#2iCset5+E_zcGp098(*g)CMkEzVP24=%k0eEZe6eDV29x<`*`F9E^OhnCajf-%DX zyne&(W zUgNxqNGneU1E{4bZ z9piH1{{F}(pFC%sGY`l2gf^lA#yP4e-YQh7{Pq{0vF!undZtQ4u9dcbM0>lVje)eR zkPXW+vb(t<7e!IlwNOgs>C-#*w@)~{dq?aBa7rL>_u>h-z_S;7`dv#dLdxILyNyycwkuAAv73-`}&7qn1KW zE7pd{X0xNZmVf-WZy0X3#D3tDmtXSy#gFN?dwg`HYFVc<+rDLYyC+c5lzIF817H8) zznG^B(HdTT^G6OJ9`IFo`gqSrAKlS5k@0-s>#zREquU)eIB=HOc6iCcIUPXZUthgq zpYHjqU;Zi93o<`&IYV*EuIt!7dPLI?$YrJ-dKOWhefpG-%`;-#Gv~}t{_JN^4S3If z_Y8t(Jf67Qf6PZOKPSyA&N`g4hzi!2jCT$dA@m*p{=Q|hLTp=}ytrfY_%ZvZA9E7L zH!Ut&cF%5!+a1&Cj4{v+TbkI@Hi23l>I2q$YA#Ig4!rvMTh`OUd^j;3M@mYRC6VR{ zU$WBnffxfpls6AY{^>tH@YjF&DaZ4fT7}Q>h8P1P ziuIOhyz)AddG_on(|qA{c)%IMF!a=t$m>ciE437AE!12vMp@>WyslUv2G2ZBlzE{p z=?5gwte25>opDa6D)?odX`6^MkmrT%roAFmuw2d;ZXP|Rro`oZVtcb=(|6=5)Ka+4 zqk_pq-(#I6tr-E@z9R>ZQKi(3!Q!LA2Zzs@@iNkNJwA3l)(5=JxTvTq^EhFWq2Kge z4i9wwhOX;5Kb)9CWEgs^{NJEfF6WW1Z3rO{oF|pcG8MFBth0m|DYc-bu%wj`BGx!^ zDR_RUP-`XUg!h5XcA(UXl*;bWEqPf9(G&Yytaaoy<733G0>JL(1|KZexU21I#s-fK z*Ohy*NttDt>4yGF&ExSzHw-vyh(2PiqvlGQ=j(NoD_Vt=D!yr0<_Sg7oGFs& znvPlu)3{P|##u|#Hmu8n5wJdj7M!!xVkkLdts~7V-h1qJHvpBAGa!gu&$HM?q!!XV zfq`ylan2F@hz}mM;Jjx^3u-N!p`+jQ6s;sFSm*KHW2}HRlv*$rLJVLG)*Gq{{|m29 Vo_&JS-Jk#f002ovPDHLkV1h$`;MM>D literal 0 HcmV?d00001 diff --git a/signs/textures/signs_wooden_right.png b/signs/textures/signs_wooden_right.png new file mode 100644 index 0000000000000000000000000000000000000000..8d62376523ae789840e317a8abfcbf4c02187d7a GIT binary patch literal 2562 zcmV+d3jOtoP)*+| zzyn}_cnWwIu<^0FC9F1(a6ql@>dwll%F52+<~`@0d;Tegjd2p5AR<2P72n$OkAL&E z<&;TjAvO)(dvY$+Qka*Se%0gDQ>;>QrPe~*H`H9IW++f zSaoaEDGv_^VrU6L5d_yLp=p@TkGK$#T!?+Zt3wb_MFjGaSeAuaEBoz+X`D#&O!Mgx zO=#F|*I23eN~Kh}q_8ZA7^smgvs$mQYUEldrO?F4GEa1U4?q;JTv@Mrsu?*aoO5W14T3R^11guuOEISN%-!8RRx5&#OTkQN+ZGT~N*JKd zfk2uwUX(c}a+;av1ZJS%y{GG1@PX5LV4fFpDx{pz!-w}c5gH${QqXFQ!+PB)xe6Os+3$1fwpV$F;Ge+F9{#RC01~h zlF2FIorhY;xnKyjEI2QeV&t;$@Zo@S0j$zCk&+TvWf><*DR>9dFrg?u1i)~?GmRsq zR{E|ZG!dxyG)Pl)zCZFfo!ND3oYzZQR%zRoAAWd4S_*Acu68$=GuEpf0nVpK{^jT2@SneW zhls<+`2SQX;_%)RyoYL>9}lD{v*~wy{`4pGq364o-_f|h?ez_}+dVD>`nY0wTqwiB z>zCiL?HjJvTUP5Gr}K=I!pFBCIUSCijz|9N3&)e&E6@ricpq4D!u`pM{XdVxh^X@C zU+pL=9PjQ>b<|qv`i3A4Q%ao15k%PR_Y@UePzuW9aOS&LKl0+mb3`3hGT;986}ziz z+BR|?7QX!AIjuLoI~pJF?pT(Yrs?sjM%TB57=LIEkJUp`BT`|oQ zHWwCGdHKsz2DNPsIZ#qKPqMvY`hBNb= zxcm5?_jd= zO?$Paje%vFAqmrTX1m*wvSAqWoXNTH&btjH-CPq#{=(= z13&-efl?qXGhRcaZ!ZlsXJdD@q2$V!fA}@=%?H}(@E(?;%)N7(_izOSHI!v>T^E3z2eEup0eBGL*#I{shx3k-GV}3~A7B5#W^=>8{l_=tIROaAv>VQ>F=ABH7F` zj}$5?C*Hn4u-&g2$AQzEH~jm5z2)792R55Mg~~LIs5s>B|N1NQPKixJHN!bat`&z- zis3^bFNyPTrfnO9OZS&~xzLgl-UU!V9L_28yx;@`!2l7vID;65ASx)Ita!cKUd#qz z8b)FT!N?_3t8qRaY1=^S9cdaVxzaR&YDTSw_mOH9K?zQ%xUXtQ1;E>O$}v1M8^CXS|Cb9aA4G$1%k zg=xuvvfb}#x}H)l_SEz(wHl#m2(e+c-LlzVv0C?3xroi_;m9(LY_=Pm6IT6-deJo@ z#z3uxdSy6Ye4Uzj`t%9I_{hWI9w)+j-Ba>HnrBL$DLGS0rlgFBF^wZ>o>3qM&v+il z<3yR3PfDJcAJ5G5h;x-<6+ew5Z4+?8#59d`>;7WR=i>w2dW};d`iQEdq{1?em+dAMtW=hz;G2eN954(^ ziChz1(@}C}IM0-naH=$I!#qt$1@#du