From f4b8853bff74fa379349ee75da39b7ea7d9ab5f2 Mon Sep 17 00:00:00 2001 From: Evert Prants Date: Thu, 2 Aug 2018 18:26:16 +0300 Subject: [PATCH] Matter transmitter and dialler --- elepower_wireless/craftitems.lua | 3 +- elepower_wireless/machines/dialler.lua | 200 ++++++++++++++++++ elepower_wireless/machines/init.lua | 2 + .../machines/matter_receiver.lua | 40 +++- .../machines/matter_transmitter.lua | 162 ++++++++++++++ .../textures/elewireless_dialler.png | Bin 0 -> 1947 bytes .../textures/elewireless_dialler_inactive.png | Bin 0 -> 1742 bytes .../textures/elewireless_receiver_top.png | Bin 617 -> 0 bytes .../elewireless_receiver_top_animated.png | Bin 1481 -> 1374 bytes .../elewireless_receiver_top_inactive.png | Bin 6026 -> 0 bytes .../textures/elewireless_teleport_top.png | Bin 0 -> 529 bytes .../elewireless_transmitter_top_animated.png | Bin 0 -> 8574 bytes 12 files changed, 404 insertions(+), 3 deletions(-) create mode 100644 elepower_wireless/machines/dialler.lua create mode 100644 elepower_wireless/machines/matter_transmitter.lua create mode 100644 elepower_wireless/textures/elewireless_dialler.png create mode 100644 elepower_wireless/textures/elewireless_dialler_inactive.png delete mode 100644 elepower_wireless/textures/elewireless_receiver_top.png delete mode 100644 elepower_wireless/textures/elewireless_receiver_top_inactive.png create mode 100644 elepower_wireless/textures/elewireless_teleport_top.png create mode 100644 elepower_wireless/textures/elewireless_transmitter_top_animated.png diff --git a/elepower_wireless/craftitems.lua b/elepower_wireless/craftitems.lua index 7f52e98..daa4ee3 100644 --- a/elepower_wireless/craftitems.lua +++ b/elepower_wireless/craftitems.lua @@ -35,6 +35,7 @@ ele.register_tool("elepower_wireless:wireless_porter", { -- Teleport player player:set_pos(top) + -- TODO: Sound nmeta:set_int("storage", nstorage - nusage) -- Add wear @@ -61,7 +62,7 @@ ele.register_tool("elepower_wireless:wireless_porter", { local strpos = minetest.pos_to_string(pos) local curpos = minetest.string_to_pos(meta:get_string("receiver")) - if (curpos and curpos ~= "") and curpos == strpos then + if (curpos and curpos ~= "") and curpos == pos then minetest.chat_send_player(player, "Wireless Porter is already bound to this location!") return itemstack end diff --git a/elepower_wireless/machines/dialler.lua b/elepower_wireless/machines/dialler.lua new file mode 100644 index 0000000..02acb64 --- /dev/null +++ b/elepower_wireless/machines/dialler.lua @@ -0,0 +1,200 @@ + +local function escape_comma(str) + return str:gsub(",","\\,") +end + +local function get_formspec(power, player, transmitters, receivers) + local list_tr = {} + local tr_selct = nil + local list_re = {} + local re_selct = nil + + if transmitters then + for _,trn in pairs(transmitters) do + local indx = #list_tr + 1 + if trn.select then + tr_selct = indx + end + list_tr[indx] = trn.name .. " " .. escape_comma(trn.pos) + end + end + + if receivers then + for _,rec in pairs(receivers) do + local indx = #list_re + 1 + if rec.select then + re_selct = indx + end + list_re[indx] = rec.name .. " " .. escape_comma(rec.pos) + end + end + + local tr_spc = "" + if tr_selct then tr_spc = ";" .. tr_selct end + + local re_spc = "" + if re_selct then re_spc = ";" .. re_selct end + + return "size[8,10.5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + ele.formspec.power_meter(power).. + "textlist[1,0;6.8,2.5;transmitter;" .. table.concat(list_tr, ",") .. tr_spc .. "]".. + "textlist[1,3;6.8,2.5;receiver;" .. table.concat(list_re, ",") .. re_spc .. "]".. + "label[0,5.75;Owned by " .. player .. "]".. + "list[current_player;main;0,6.25;8,1;]".. + "list[current_player;main;0,7.5;8,3;8]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0, 6.25) +end + +local function get_is_active_node(meta, pos) + local storage = ele.helpers.get_node_property(meta, pos, "storage") + local usage = ele.helpers.get_node_property(meta, pos, "usage") + return storage >= usage +end + +local function get_transmitters_in_range(pos, player, selected, range) + local transmitters = {} + for spos, data in pairs(elewi.loaded_transmitters) do + local npos = minetest.string_to_pos(spos) + local node = minetest.get_node_or_nil(npos) + if node and ele.helpers.get_item_group(node.name, "matter_transmitter") then + if data.player == player and vector.distance(pos, npos) <= range then + local meta = minetest.get_meta(npos) + if get_is_active_node(meta, npos) then + transmitters[#transmitters + 1] = { + name = data.name, + player = player, + pos = spos, + select = npos == selected, + } + end + end + end + end + return transmitters +end + +local function get_player_receivers(player) + local receivers = {} + for spos, data in pairs(elewi.loaded_receivers) do + local npos = minetest.string_to_pos(spos) + local node = minetest.get_node_or_nil(npos) + if node and ele.helpers.get_item_group(node.name, "matter_receiver") then + if data.player == player then + local meta = minetest.get_meta(npos) + local target = minetest.string_to_pos(meta:get_string("target")) + if get_is_active_node(meta, npos) then + receivers[#receivers + 1] = { + name = data.name, + player = player, + pos = spos, + select = target == npos, + } + end + end + end + end + return receivers +end + +local function dialler_timer(pos) + local meta = minetest.get_meta(pos) + local player = meta:get_string("player") + + local capacity = ele.helpers.get_node_property(meta, pos, "capacity") + local storage = ele.helpers.get_node_property(meta, pos, "storage") + local usage = ele.helpers.get_node_property(meta, pos, "usage") + + local transmitter = minetest.string_to_pos(meta:get_string("transmitter")) + local pow_percent = math.floor((storage / capacity) * 100) + + if storage >= usage then + ele.helpers.swap_node(pos, "elepower_wireless:dialler_active") + else + ele.helpers.swap_node(pos, "elepower_wireless:dialler") + end + + local transmitters = get_transmitters_in_range(pos, player, transmitter, 16) + local receivers = {} + if transmitter then + receivers = get_player_receivers(player) + end + + meta:set_string("formspec", get_formspec(pow_percent, player, transmitters, receivers)) + meta:set_string("infotext", "Dialler\n" .. ele.capacity_text(capacity, storage)) + + return false +end + +ele.register_machine("elepower_wireless:dialler", { + description = "Dialler", + tiles = { + "elewireless_device_side.png", "elewireless_device_side.png", "elewireless_device_side.png", + "elewireless_device_side.png", "elewireless_device_side.png", "elewireless_dialler_inactive.png" + }, + ele_active_node = true, + ele_active_nodedef = { + tiles = { + "elewireless_device_side.png", "elewireless_device_side.png", "elewireless_device_side.png", + "elewireless_device_side.png", "elewireless_device_side.png", "elewireless_dialler.png" + }, + }, + groups = {cracky = 1, ele_user = 1, dialler = 1}, + ele_capacity = 8000, + ele_usage = 120, + ele_inrush = 240, + on_timer = dialler_timer, + after_place_node = function (pos, placer, itemstack, pointed_thing) + local meta = minetest.get_meta(pos) + if not placer or placer:get_player_name() == "" then return false end + + meta:set_string("player", placer:get_player_name()) + end, + on_receive_fields = function (pos, formname, fields, sender) + if sender and sender ~= "" and minetest.is_protected(pos, sender:get_player_name()) then + return + end + + if not fields["transmitter"] and not fields["receiver"] then + return + end + + local meta = minetest.get_meta(pos) + local trans = minetest.string_to_pos(meta:get_string("transmitter")) + + local player = sender:get_player_name() + local transmitters = get_transmitters_in_range(pos, player, trans, 16) + local receivers = {} + if trans then + receivers = get_player_receivers(player) + end + + if fields["transmitter"] then + if fields.transmitter:match("DCL:") then + local pinx = tonumber(fields.transmitter:sub(5)) + if pinx and transmitters[pinx] then + meta:set_string("transmitter", transmitters[pinx].pos) + minetest.get_node_timer(pos):start(0.2) + return + end + end + end + + if fields["receiver"] and #receivers > 0 then + if fields.receiver:match("DCL:") then + local pinx = tonumber(fields.receiver:sub(5)) + if pinx and receivers[pinx] then + local meta = minetest.get_meta(trans) + + meta:set_string("target", receivers[pinx].pos) + + minetest.get_node_timer(trans):start(0.2) + minetest.get_node_timer(pos):start(0.2) + end + end + end + end, +}) diff --git a/elepower_wireless/machines/init.lua b/elepower_wireless/machines/init.lua index 195708d..b59b4fb 100644 --- a/elepower_wireless/machines/init.lua +++ b/elepower_wireless/machines/init.lua @@ -2,3 +2,5 @@ local mp = elewi.modpath .. "/machines/" dofile(mp .. "matter_receiver.lua") +dofile(mp .. "matter_transmitter.lua") +dofile(mp .. "dialler.lua") diff --git a/elepower_wireless/machines/matter_receiver.lua b/elepower_wireless/machines/matter_receiver.lua index cb012b6..3d02687 100644 --- a/elepower_wireless/machines/matter_receiver.lua +++ b/elepower_wireless/machines/matter_receiver.lua @@ -1,4 +1,6 @@ +elewi.loaded_receivers = {} + local function get_formspec(power, name, player) return "size[8,8.5]".. default.gui_bg.. @@ -41,10 +43,29 @@ local function matter_receiver_timer(pos) return false end +local function save_receiver(pos) + local strname = minetest.pos_to_string(pos) + + if elewi.loaded_receivers[strname] then return end + + local meta = minetest.get_meta(pos) + local name = meta:get_string("name") + local player = meta:get_string("player") + + if name == "" then + name = "Matter Receiver" + end + + elewi.loaded_receivers[strname] = { + name = name, + player = player, + } +end + ele.register_machine("elepower_wireless:matter_receiver", { description = "Matter Receiver", tiles = { - "elewireless_receiver_top_inactive.png", "elewireless_device_side.png^elepower_power_port.png", "elewireless_device_side.png", + "elewireless_teleport_top.png", "elewireless_device_side.png^elepower_power_port.png", "elewireless_device_side.png", "elewireless_device_side.png", "elewireless_device_side.png", "elewireless_device_side.png" }, ele_active_node = true, @@ -66,6 +87,7 @@ ele.register_machine("elepower_wireless:matter_receiver", { groups = {cracky = 1, ele_user = 1, matter_receiver = 1}, ele_capacity = 8000, ele_usage = 120, + ele_inrush = 240, ele_no_automatic_ports = true, on_timer = matter_receiver_timer, after_place_node = function (pos, placer, itemstack, pointed_thing) @@ -73,6 +95,7 @@ ele.register_machine("elepower_wireless:matter_receiver", { if not placer or placer:get_player_name() == "" then return false end meta:set_string("player", placer:get_player_name()) + save_receiver(pos) end, on_receive_fields = function (pos, formname, fields, sender) if sender and sender ~= "" and minetest.is_protected(pos, sender:get_player_name()) then @@ -84,5 +107,18 @@ ele.register_machine("elepower_wireless:matter_receiver", { if fields["name"] and fields["key_enter"] == "true" then meta:set_string("name", fields["name"]) end - end + end, + after_destruct = function (pos) + local strname = minetest.pos_to_string(pos) + if not elewi.loaded_receivers[strname] then return end + elewi.loaded_receivers[strname] = nil + end, +}) + +minetest.register_lbm({ + label = "Load Receiver into memory", + name = "elepower_wireless:matter_receiver", + nodenames = {"group:matter_receiver"}, + run_at_every_load = true, + action = save_receiver, }) diff --git a/elepower_wireless/machines/matter_transmitter.lua b/elepower_wireless/machines/matter_transmitter.lua new file mode 100644 index 0000000..ef79ded --- /dev/null +++ b/elepower_wireless/machines/matter_transmitter.lua @@ -0,0 +1,162 @@ + +elewi.loaded_transmitters = {} + +local function get_formspec(power, name, player) + return "size[8,8.5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + ele.formspec.power_meter(power).. + "field[1.5,0.5;5,1;name;Transmitter Name;".. name .."]".. + "field_close_on_enter[name;false]".. + "label[0,3.75;Owned by " .. player .. "]".. + "list[current_player;main;0,4.25;8,1;]".. + "list[current_player;main;0,5.5;8,3;8]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0, 4.25) +end + +local function matter_transmitter_timer(pos) + local meta = minetest.get_meta(pos) + local name = meta:get_string("name") + local player = meta:get_string("player") + local target = meta:get_string("target") + + if name == "" then + name = "Matter Transmitter" + end + + local capacity = ele.helpers.get_node_property(meta, pos, "capacity") + local storage = ele.helpers.get_node_property(meta, pos, "storage") + local usage = ele.helpers.get_node_property(meta, pos, "usage") + + local pow_percent = math.floor((storage / capacity) * 100) + + if storage >= usage then + ele.helpers.swap_node(pos, "elepower_wireless:matter_transmitter_active") + else + ele.helpers.swap_node(pos, "elepower_wireless:matter_transmitter") + end + + local extra = "" + if target ~= "" then + extra = "\nDialled to " .. target + end + + meta:set_string("formspec", get_formspec(pow_percent, name, player, target)) + meta:set_string("infotext", "Matter Transmitter\n" .. ele.capacity_text(capacity, storage) .. extra) + + return false +end + +local function save_transmitter(pos) + local strname = minetest.pos_to_string(pos) + + if elewi.loaded_transmitters[strname] then return end + + local meta = minetest.get_meta(pos) + local name = meta:get_string("name") + local player = meta:get_string("player") + + if name == "" then + name = "Matter Transmitter" + end + + elewi.loaded_transmitters[strname] = { + name = name, + player = player, + } +end + +ele.register_machine("elepower_wireless:matter_transmitter", { + description = "Matter Transmitter", + tiles = { + "elewireless_teleport_top.png", "elewireless_device_side.png^elepower_power_port.png", "elewireless_device_side.png", + "elewireless_device_side.png", "elewireless_device_side.png", "elewireless_device_side.png" + }, + ele_active_node = true, + ele_active_nodedef = { + tiles = { + { + name = "elewireless_transmitter_top_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + speed = 5, + }, + }, + "elewireless_device_side.png^elepower_power_port.png", "elewireless_device_side.png", + "elewireless_device_side.png", "elewireless_device_side.png", "elewireless_device_side.png" + }, + }, + groups = {cracky = 1, ele_user = 1, matter_transmitter = 1}, + ele_capacity = 8000, + ele_usage = 120, + ele_inrush = 240, + ele_no_automatic_ports = true, + on_timer = matter_transmitter_timer, + after_place_node = function (pos, placer, itemstack, pointed_thing) + local meta = minetest.get_meta(pos) + if not placer or placer:get_player_name() == "" then return false end + + meta:set_string("player", placer:get_player_name()) + save_transmitter(pos) + end, + on_receive_fields = function (pos, formname, fields, sender) + if sender and sender ~= "" and minetest.is_protected(pos, sender:get_player_name()) then + return + end + + -- Set Name + local meta = minetest.get_meta(pos) + if fields["name"] and fields["key_enter"] == "true" then + meta:set_string("name", fields["name"]) + end + end, + after_destruct = function (pos) + local strname = minetest.pos_to_string(pos) + if not elewi.loaded_transmitters[strname] then return end + elewi.loaded_transmitters[strname] = nil + end, +}) + +minetest.register_lbm({ + label = "Load Transmitter into memory", + name = "elepower_wireless:matter_transmitter", + nodenames = {"group:matter_transmitter"}, + run_at_every_load = true, + action = save_transmitter, +}) + +minetest.register_abm({ + nodenames = {"group:matter_transmitter"}, + interval = 1.0, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local objs = minetest.get_objects_inside_radius(pos, 1) + for k, player in pairs(objs) do + if player:get_player_name() ~= nil then + local meta = minetest.get_meta(pos) + local tpos = minetest.string_to_pos(meta:get_string("target")) + + if tpos then + local storage = ele.helpers.get_node_property(meta, pos, "storage") + local usage = ele.helpers.get_node_property(meta, pos, "usage") + + if storage >= usage then + local top = vector.add(tpos, {x = 0, y = 1, z = 0}) + local topnode = minetest.get_node_or_nil(top) + + if not topnode or topnode.name == "air" then + player:set_pos(top) + meta:set_int("storage", storage - usage) + -- TODO: Sound + break + end + end + end + end + end + end +}) diff --git a/elepower_wireless/textures/elewireless_dialler.png b/elepower_wireless/textures/elewireless_dialler.png new file mode 100644 index 0000000000000000000000000000000000000000..09d8b926090316ea64f36c38ab8ef0f8a7af5e02 GIT binary patch literal 1947 zcmV;M2W0q(P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1YumIEgY{O1%o0uqSjIIQpG204C;t*6}{&zmfb z-CzMyp^}7E`|HoH{=mZ&tg_;Ri_U30HrmJugP_-w=9{#g@BKrc!HZm76AY0-Z`RM? zw!A^kSkGHtww?sJ+!V#OC-Un=+KM=A1IOYvWM~=CTd_)8k>PFGuHShbOS>5S{Rm~R z?|Xi_0bey<)_8W}$XmQEYwumeIIy-Jeyam$FC51{$y?Fmw>nE1n7A1-8gDxg8o)Qf zB=qaeJS2j#H4bk)3n|!Qr9H;+`1R-KC*ldX4CV{KmAJ4m}g*!H~Q9Z{;Lk za&@P4@^-WA+-3PiPGvac_8iv6xAz))Z|ii)Ivm;UL!G0{5!U75t+~sgd3;5O;q1{O zT0lw^#8E|%Wwb((7&LaWR4GxXHv2*a5G^9VaHXIS9Ry{BE&r*h-z@5VBovVjm#=_}N2USAV2(&>!ZI*IeLGdA zgHL-tgI5CvWx6@wfJx_}0rY2~ui!G1XoH1L7 zM+Oj-0G*BH3|dHpD?qX}#(^AU0c>NBr@54cml%Z*M2K<9cyJR<0$J7y;>X*77)oNq ziii_0L82sQ+{iHJyc-oYdE>1Y@4WZHN1s$M!3GH~_z*%2DRMNZxDt_%F~k^Cg3$!c z3A+;(q?9?EY_nvSeGWP1R9F>LY?0!MFQLSeDpymH$JJF|Lya{xY6zufn>5#a3oW+P z5o+CZ+oikid+1U1bg{N+eQW=KHQKE4WNIw*7i*Aue^k&YCo(t#V{8e8`@sMi#XLCE zfvn}h+~7<{Mpg&|qzrN@4aUHrZN$>);_iz%Q7D@K3vUWU@c+S_8r1!Qxp&^aW38rn z(V5B6NWeqz&IP=ZK#|1JJy-1vpm2uhbp0bP{*9@PT z{1mj0i2fBaH6jE(A*m47IhEivQc=8l`B0L z&WDFLJ#+DOaenE03Q(VKlKy2Xp@vb5Rc%dyQAyJ&eabHE%_>WZRn=;#PTM_txv6uO%V zF!YF_GI6P&^P|?+a6d(^4P zoLWfr9cj#~oOtA64u`!Ux9T(VdMmUu<^o+DTr$@o^i>kS;7Gm2oq7p8t`BBdK2*B5yIB!G;`z&?`N8x38haE_Y3h0VzMcQ= zNG5%E_p1BS{#5dIqsC|C^VzKE!(IOFji3Jns9&sfSMBRHs=on?+5LaX6th79000JJ zOGiWi004mir%?v{g8%>k32;bRa{vG?BLDy{BLR4&KXw2B00(qQO+^Rd2m%Z)BHCOc z&j0`b8FWQhbVF}#ZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b0kla(K~y-)b(67< z(?Af0zu8?oAtzm#F3;jS35lNS9)VY&K}aA9By=x8L48mlUI2xHhjA4NNbJNjL$US} zM~5YAz22RF{`vnI*=#mmRTb_IfQUT$eZHSoRV9fC>-Bne5JGq~@N(a_Eg{BO4)Ucr zgUhVvVD3(uE&?o4d5l;54Z|)l7(Ne|Pw+JC4UARaF5H-hF`(>AH>>V<{s61QAp<|2*|HtD2klpCRV# z*g#VUw)+!{#iGy`k+Fo)mi>MYRn1l-_VW46vhel+B#=_V-5G{qZljrH4Tgc{y5{!7 zSHLra7-^nl4Pwk?%ruykt?L>>VEg9?rjQc!2UuQ>mc}CZ6q7X=Tla7{@a*R&`o1TG zfSIAHnAtxuN3o|SOP4LW+wBUyGB7F8_dRA-x^zmK&W9w%OmQmf++KH|*;iapRob>K hEarp7e zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1Yww&W%Z{AU$e0uqSFaxj>4vV$x?1qRxtyXTRN zxz}JJq(UV@tMi|~tNIHMlXl9A4=y^V@z`i1Ck%qVp48u@ZGVpsJqHiDS`!SBL2s_l z;D-E!oT1M{o`;9XM24g*S55a!QZ!# zhkhONJq-9)?PZN;Cyuk+rofY!{ht&?LI+P>9PWnkjdkkNSChR^`M z2_~Vx-poxR7~3Hkp#WQ~w8uEkxc>P05pp%556T~ut`U8a-P~6r?dI9J<@q7cWw}_)sYze0CDeLeyGzz#%WiCHZl#Z)ceH5rRSwPLUvy}}ZY`n( zlte}z6(re#mMId0#!8k7C8~7xK2run%O`vE%$W^k1z`Xgk#ncpwnmk`iKc*LHW}$) zAmxRHy4%>@WeRXyC@5qH!5Cr5|7z-2lxl4SMWn-u6>xE@G@xkA5h+bj10z&NP^AZW zw*6_m8Zan5%mEur`e+tF{~`2BF4KuNP!#l60h2Go073)=0x)F2fOe=Da-==8@;guRay8F;~)ePVw^G_+(eT=mbHTX@iribk{Gcf z;>1gkD9IVuD$F_W+KHOH@z#rX-uvLAPb!#Tg9I0R2qA_PIU1a}5>bya#28b8(*(;2 zs}mGbI`}Y$J>+nQKf)1@lv!nyZI?skTaW)z?s?s%fz{XnkwH!5R(LxHHuh{bCJL@23fB$B8t~z!+Ns;l43IMlm=G04a@}LX9ynXis9Pw77dQC(5`#!@I`d)TtAaE`4~Y}9(k|Q4(;=XIDyHO2p`6@B$M*xaUJr-?b?%3~8BjOPo{%dE!Xvzg<(2gghYemaQg zRF7NPbS=$6ovWvVG$m8T^&W<94ADjiEqqAEK5{&^WvBN%u&X$6n6|U|&$CA;UP&}q+v7+j3>_!- zCuAX9k}gB9cpZMB8Jp+#9Nwr|VNt7&Z^<)qm!h28AxY8f$I&?Wl-^C_m);8R#OkNB zGItvH<5I=_$ezVc!f$Z=4(C|su-b2_eSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00B-(L_t(I%XO1m zZo)7SMbC^KKrDbi_JCS-|7)n)Rpg5=h=pd{5643iXe7&z%;Wm#TF&Ql9fpBgD*z($ zcD>y9+04iy!s&Ec{ZQ4niQD}+j%Z3Lezc&qf^FAjv05v+2Lc=p2SfySC#4h#B0?#J zngDqa(4jCtQF{z0dmfZ*k>1N zod-M~56lczZ3Q~@oO3{Y=`4V>d736vHLjtv49u(@24OZF+WCIJk7N;YTb;YqUNGZKC=n!|i-HLcC+sqpD%)&S>dE5h0ry k<2Z(j^~2)d7untT2XLDLjEB``v;Y7A07*qoM6N<$f(zz8_5c6? literal 0 HcmV?d00001 diff --git a/elepower_wireless/textures/elewireless_receiver_top.png b/elepower_wireless/textures/elewireless_receiver_top.png deleted file mode 100644 index 0271d04b572861bd7aec795a3c677ca5912b05e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 617 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 S>2x9h0000Db6Qu&vYM5zS{k^bWeFZB%cx9 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 Idvx-@0O|q@a{vGU diff --git a/elepower_wireless/textures/elewireless_teleport_top.png b/elepower_wireless/textures/elewireless_teleport_top.png new file mode 100644 index 0000000000000000000000000000000000000000..69e1d1f1347064b81612fed6288cb35c1780f0c9 GIT binary patch literal 529 zcmV+s0`C2ZP)YZ{QIFlAZ3e}3F< zH>DH+mBs~77RD5YVB;DA1aM6QkHug@nC&?0F+WBc{m)j*6A1*#oEVpIZe|)-j(CH TGR0Vw00000NkvXXu0mjf=Jw)< literal 0 HcmV?d00001 diff --git a/elepower_wireless/textures/elewireless_transmitter_top_animated.png b/elepower_wireless/textures/elewireless_transmitter_top_animated.png new file mode 100644 index 0000000000000000000000000000000000000000..d0070e0a21d1e6a7416267caab4945007535c3c6 GIT binary patch literal 8574 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 literal 0 HcmV?d00001