mirror of
https://github.com/pandorabox-io/banners.git
synced 2025-11-09 08:55:22 +01:00
Compare commits
38 Commits
master
...
readExisti
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
80aff0dc7d | ||
|
|
088f94b76a | ||
|
|
85ac3b0921 | ||
|
|
fe72fc27a3 | ||
|
|
e9cbd37983 | ||
|
|
767a49a432 | ||
|
|
143e549ff9 | ||
|
|
4178bd1501 | ||
|
|
578bd700d1 | ||
|
|
88d628d73f | ||
|
|
e3c216eba7 | ||
|
|
1c5b11609b | ||
|
|
2fea87dbde | ||
|
|
3d5805c8a9 | ||
|
|
d86c93bcc5 | ||
|
|
9b5962aba4 | ||
|
|
38bf923967 | ||
|
|
f2147ce1b0 | ||
|
|
b99d10cba5 | ||
|
|
dc9867f359 | ||
|
|
7e3a84eaac | ||
|
|
3d22f9b76b | ||
|
|
78be1611c3 | ||
|
|
b1ff0eb558 | ||
|
|
b1d63fd7b1 | ||
|
|
5cf1946064 | ||
|
|
2175d77186 | ||
|
|
9c688d416b | ||
|
|
c8a480135e | ||
|
|
deb750af99 | ||
|
|
aa514d114a | ||
|
|
c8af7c71e5 | ||
|
|
7ff3dd0311 | ||
|
|
ae679a14d4 | ||
|
|
8d6b2f264f | ||
|
|
3b3ea242f7 | ||
|
|
51ec2a8695 | ||
|
|
c8012c7266 |
@@ -8,5 +8,7 @@ read_globals = {
|
|||||||
"dump",
|
"dump",
|
||||||
"factions",
|
"factions",
|
||||||
"inventory_plus",
|
"inventory_plus",
|
||||||
|
["table"] = { fields = { "insert_all" } },
|
||||||
"unified_inventory",
|
"unified_inventory",
|
||||||
|
"vector",
|
||||||
}
|
}
|
||||||
|
|||||||
53
chatcommands.lua
Normal file
53
chatcommands.lua
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
-- Due to some engine troubles there are sometimes stray
|
||||||
|
-- banner entities and more rarely there are banner nodes without entities.
|
||||||
|
-- Calling this command fixes both situations.
|
||||||
|
core.register_chatcommand("banners_fix", {
|
||||||
|
description = "recreates the banner-visuals in your area",
|
||||||
|
func = function(name)
|
||||||
|
local player = core.get_player_by_name(name)
|
||||||
|
if not player then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local pos = player:get_pos()
|
||||||
|
local t1 = core.get_us_time()
|
||||||
|
|
||||||
|
local radius = 10
|
||||||
|
local entity_count = 0
|
||||||
|
local objects = core.get_objects_inside_radius(pos, radius)
|
||||||
|
for _, v in ipairs(objects) do
|
||||||
|
local e = v:get_luaentity()
|
||||||
|
if e and e.name == "banners:banner_ent" then
|
||||||
|
entity_count = entity_count + 1
|
||||||
|
v:remove()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local pos1 = vector.subtract(pos, radius)
|
||||||
|
local pos2 = vector.add(pos, radius)
|
||||||
|
local nodes = {
|
||||||
|
"banners:wooden_banner",
|
||||||
|
"banners:steel_banner",
|
||||||
|
}
|
||||||
|
if core.get_modpath("factions") then
|
||||||
|
table.insert_all(nodes, {
|
||||||
|
"banners:power_banner",
|
||||||
|
"banners:death_banner",
|
||||||
|
|
||||||
|
})
|
||||||
|
end
|
||||||
|
local pos_list = core.find_nodes_in_area(pos1, pos2, nodes)
|
||||||
|
|
||||||
|
for _, node_pos in ipairs(pos_list) do
|
||||||
|
core.add_entity(node_pos, "banners:banner_ent")
|
||||||
|
end
|
||||||
|
|
||||||
|
local t2 = core.get_us_time()
|
||||||
|
local diff = t2 - t1
|
||||||
|
local millis = diff / 1000
|
||||||
|
|
||||||
|
return true, "Removed " .. entity_count .. " banner entities and restored "
|
||||||
|
.. #pos_list .. " banners in " .. millis .. " ms"
|
||||||
|
end
|
||||||
|
})
|
||||||
|
|
||||||
160
init.lua
160
init.lua
@@ -2,7 +2,7 @@ local MP = core.get_modpath("banners") .. "/"
|
|||||||
dofile(MP .. "smartfs.lua")
|
dofile(MP .. "smartfs.lua")
|
||||||
|
|
||||||
banners = {
|
banners = {
|
||||||
version = 20241128.1533
|
version = 20241129.1232
|
||||||
}
|
}
|
||||||
|
|
||||||
banners.masks = {
|
banners.masks = {
|
||||||
@@ -47,24 +47,43 @@ banners.colors = {
|
|||||||
"brown", "darkbrown"
|
"brown", "darkbrown"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
local valid_masks = {}
|
||||||
|
local valid_colors = {}
|
||||||
|
do
|
||||||
|
local i, s
|
||||||
|
i = #banners.masks
|
||||||
|
repeat
|
||||||
|
s = banners.masks[i]
|
||||||
|
valid_masks[s .. ".png"] = true
|
||||||
|
i = i - 1
|
||||||
|
until i == 0
|
||||||
|
|
||||||
|
i = #banners.colors
|
||||||
|
repeat
|
||||||
|
s = banners.colors[i]
|
||||||
|
valid_colors["bg_" .. s .. ".png"] = true
|
||||||
|
i = i - 1
|
||||||
|
until i == 0
|
||||||
|
end
|
||||||
|
|
||||||
banners.base_transform = {
|
banners.base_transform = {
|
||||||
texture = "bg_white.png",
|
texture = "bg_white.png",
|
||||||
mask = "mask_background.png"
|
mask = "mask_background.png"
|
||||||
}
|
}
|
||||||
|
|
||||||
banners.creation_form_func = function(state)
|
function banners.creation_form_func(state)
|
||||||
-- helper functions
|
-- helper functions
|
||||||
state.update_player_inv = function(self, transform_string)
|
function state:update_player_inv(transform_string)
|
||||||
local player = core.get_player_by_name(self.player)
|
local player = core.get_player_by_name(self.player)
|
||||||
local newbanner = player:get_wielded_item()
|
local newbanner = player:get_wielded_item()
|
||||||
newbanner:get_meta():set_string("", transform_string)
|
newbanner:get_meta():set_string("", transform_string)
|
||||||
player:set_wielded_item(newbanner)
|
player:set_wielded_item(newbanner)
|
||||||
end
|
end
|
||||||
state.update_preview = function(self, transform_string)
|
function state:update_preview(transform_string)
|
||||||
self:get("banner_preview"):setImage(transform_string)
|
self:get("banner_preview"):setImage(transform_string)
|
||||||
self:get("color_indicator"):setImage(self.current_color)
|
self:get("color_indicator"):setImage(self.current_color)
|
||||||
end
|
end
|
||||||
state.update_preview_inv = function(self)
|
function state:update_preview_inv()
|
||||||
local transform_string = self.banner:get_transform_string()
|
local transform_string = self.banner:get_transform_string()
|
||||||
self:update_preview(transform_string)
|
self:update_preview(transform_string)
|
||||||
self:update_player_inv(transform_string)
|
self:update_player_inv(transform_string)
|
||||||
@@ -78,6 +97,7 @@ banners.creation_form_func = function(state)
|
|||||||
state.banner:push_transform(banners.base_transform)
|
state.banner:push_transform(banners.base_transform)
|
||||||
histories[state.player] = state.banner
|
histories[state.player] = state.banner
|
||||||
end
|
end
|
||||||
|
state.banner:read_item(state.player)
|
||||||
state.current_color = state.banner.color
|
state.current_color = state.banner.color
|
||||||
state:size(20, 10)
|
state:size(20, 10)
|
||||||
state:image(3, 0.4, 4, 2, "banner_preview", nil)
|
state:image(3, 0.4, 4, 2, "banner_preview", nil)
|
||||||
@@ -144,34 +164,36 @@ end
|
|||||||
banners.creation_form = smartfs.create("banners:banner_creation",
|
banners.creation_form = smartfs.create("banners:banner_creation",
|
||||||
banners.creation_form_func)
|
banners.creation_form_func)
|
||||||
|
|
||||||
|
function banners.transform_string_to_table(transform_string)
|
||||||
-- banner definition
|
local mask, parts, texture
|
||||||
banners.Banner = {}
|
local transforms = {}
|
||||||
|
for part in transform_string:gmatch("%(([^%)]+)%)") do
|
||||||
function banners.Banner:new(banner)
|
parts = part:split("^[")
|
||||||
banner = banner or { color = "bg_black.png", transforms = {} }
|
if 3 == #parts then
|
||||||
setmetatable(banner, self)
|
texture = parts[1]
|
||||||
self.__index = self
|
mask = parts[2]:sub(6)
|
||||||
return banner
|
if valid_masks[mask] and valid_colors[texture] then
|
||||||
end
|
table.insert(transforms, {
|
||||||
function banners.Banner.push_transform(self, transform)
|
texture = texture,
|
||||||
table.insert(self.transforms, transform)
|
mask = mask
|
||||||
if #self.transforms > banners.max_undo_levels then
|
})
|
||||||
table.remove(self.transforms, 1)
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
return transforms
|
||||||
end
|
end
|
||||||
function banners.Banner.pop_transform(self)
|
|
||||||
table.remove(self.transforms)
|
function banners.transform_table_to_string(transforms)
|
||||||
end
|
local i = #transforms
|
||||||
function banners.Banner.get_transform_string(self)
|
if 0 == i then return "" end
|
||||||
|
|
||||||
local final = {}
|
local final = {}
|
||||||
local used = {}
|
local used = {}
|
||||||
local transform
|
local transform
|
||||||
-- work backwards to keep resulting data small
|
-- work backwards to keep resulting data small
|
||||||
local i = #self.transforms
|
|
||||||
repeat
|
repeat
|
||||||
transform = self.transforms[i]
|
transform = transforms[i]
|
||||||
-- same mask can be trimmed out only using most recent
|
-- duplicate mask can be trimmed out only use most recent
|
||||||
if not used[transform.mask] then
|
if not used[transform.mask] then
|
||||||
used[transform.mask] = true
|
used[transform.mask] = true
|
||||||
table.insert(final, 1, "(" .. transform.texture
|
table.insert(final, 1, "(" .. transform.texture
|
||||||
@@ -183,13 +205,54 @@ function banners.Banner.get_transform_string(self)
|
|||||||
end
|
end
|
||||||
i = i - 1
|
i = i - 1
|
||||||
until i == 0
|
until i == 0
|
||||||
local ret = table.concat(final, "^")
|
return table.concat(final, "^")
|
||||||
return ret
|
end
|
||||||
|
|
||||||
|
-- banner definition
|
||||||
|
banners.Banner = {}
|
||||||
|
|
||||||
|
function banners.Banner:new(banner)
|
||||||
|
banner = banner or { color = "bg_black.png", transforms = {} }
|
||||||
|
setmetatable(banner, self)
|
||||||
|
self.__index = self
|
||||||
|
return banner
|
||||||
|
end
|
||||||
|
|
||||||
|
function banners.Banner:push_transform(transform)
|
||||||
|
table.insert(self.transforms, transform)
|
||||||
|
if #self.transforms > banners.max_undo_levels then
|
||||||
|
table.remove(self.transforms, 1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function banners.Banner:pop_transform()
|
||||||
|
table.remove(self.transforms)
|
||||||
|
end
|
||||||
|
|
||||||
|
function banners.Banner:get_transform_string()
|
||||||
|
return banners.transform_table_to_string(self.transforms)
|
||||||
|
end
|
||||||
|
|
||||||
|
function banners.Banner:read_item(player_name)
|
||||||
|
local player = core.get_player_by_name(player_name)
|
||||||
|
local item = player:get_wielded_item()
|
||||||
|
if "banners:" ~= item:get_name():sub(1, 8) then return end
|
||||||
|
|
||||||
|
local transforms = banners.transform_string_to_table(
|
||||||
|
item:get_meta():get_string(""))
|
||||||
|
local total = #transforms
|
||||||
|
if 0 == total then return end
|
||||||
|
|
||||||
|
local i = 1
|
||||||
|
repeat
|
||||||
|
self:push_transform(transforms[i])
|
||||||
|
i = i + 1
|
||||||
|
until i > total
|
||||||
end
|
end
|
||||||
|
|
||||||
-- helper function for determining the flag's direction
|
-- helper function for determining the flag's direction
|
||||||
-- (pos, pointed_thing)
|
-- (pos, pointed_thing)
|
||||||
banners.determine_flag_direction = function(_, pointed_thing)
|
function banners.determine_flag_direction(_, pointed_thing)
|
||||||
local above = pointed_thing.above
|
local above = pointed_thing.above
|
||||||
local under = pointed_thing.under
|
local under = pointed_thing.under
|
||||||
local dir = {
|
local dir = {
|
||||||
@@ -201,13 +264,13 @@ banners.determine_flag_direction = function(_, pointed_thing)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- (itemstack, player, pointed_thing)
|
-- (itemstack, player, pointed_thing)
|
||||||
banners.banner_on_use = function(_, player)
|
function banners.banner_on_use(_, player)
|
||||||
if player.is_player then
|
if player.is_player then
|
||||||
banners.creation_form:show(player:get_player_name())
|
banners.creation_form:show(player:get_player_name())
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
banners.banner_on_dig = function(pos, node, player)
|
function banners.banner_on_dig(pos, node, player)
|
||||||
if not player or core.is_protected(pos, player:get_player_name()) then
|
if not player or core.is_protected(pos, player:get_player_name()) then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
@@ -223,7 +286,7 @@ banners.banner_on_dig = function(pos, node, player)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- (pos, node, player)
|
-- (pos, node, player)
|
||||||
banners.banner_on_destruct = function(pos)
|
function banners.banner_on_destruct(pos)
|
||||||
local objects = core.get_objects_inside_radius(pos, 0.5)
|
local objects = core.get_objects_inside_radius(pos, 0.5)
|
||||||
for _, v in ipairs(objects) do
|
for _, v in ipairs(objects) do
|
||||||
local e = v:get_luaentity()
|
local e = v:get_luaentity()
|
||||||
@@ -234,21 +297,27 @@ banners.banner_on_destruct = function(pos)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- (pos, player, itemstack, pointed_thing)
|
-- (pos, player, itemstack, pointed_thing)
|
||||||
banners.banner_after_place = function(pos, _, itemstack, pointed_thing)
|
function banners.banner_after_place(pos, _, itemstack, pointed_thing)
|
||||||
core.get_node(pos).param2 = banners.determine_flag_direction(pos, pointed_thing)
|
core.get_node(pos).param2 = banners.determine_flag_direction(pos, pointed_thing)
|
||||||
core.get_meta(pos):set_string("banner", itemstack:get_meta():get_string(""))
|
local meta = core.get_meta(pos)
|
||||||
|
meta:set_string("banner", itemstack:get_meta():get_string(""))
|
||||||
|
meta:set_float("version", banners.version)
|
||||||
core.add_entity(pos, "banners:banner_ent")
|
core.add_entity(pos, "banners:banner_ent")
|
||||||
end
|
end
|
||||||
|
|
||||||
-- banner entity
|
-- banner entity
|
||||||
local set_banner_texture = function(obj, texture)
|
|
||||||
obj:set_properties({ textures = { "banner_uv_text.png^" .. texture } })
|
|
||||||
end
|
|
||||||
|
|
||||||
|
function banners:banner_on_activate()
|
||||||
banners.banner_on_activate = function(self)
|
|
||||||
local pos = self.object:get_pos()
|
local pos = self.object:get_pos()
|
||||||
local banner = core.get_meta(pos):get_string("banner")
|
local meta = core.get_meta(pos)
|
||||||
|
local banner = meta:get_string("banner")
|
||||||
|
-- cleanup meta of old banners
|
||||||
|
if meta:get_float("version") < 20241122 then
|
||||||
|
meta:set_float("version", banners.version)
|
||||||
|
banner = banners.transform_table_to_string(
|
||||||
|
banners.transform_string_to_table(banner))
|
||||||
|
meta:set_string("banner", banner)
|
||||||
|
end
|
||||||
local banner_face = core.get_node(pos).param2
|
local banner_face = core.get_node(pos).param2
|
||||||
local yaw = 0.
|
local yaw = 0.
|
||||||
if banner_face == 2 then
|
if banner_face == 2 then
|
||||||
@@ -261,9 +330,9 @@ banners.banner_on_activate = function(self)
|
|||||||
yaw = 4.71238898038469 -- 3 * pi / 2
|
yaw = 4.71238898038469 -- 3 * pi / 2
|
||||||
end
|
end
|
||||||
self.object:set_yaw(yaw)
|
self.object:set_yaw(yaw)
|
||||||
if banner then
|
self.object:set_properties({
|
||||||
set_banner_texture(self.object, banner)
|
textures = { "banner_uv_text.png^" .. banner }
|
||||||
end
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
core.register_entity("banners:banner_ent", {
|
core.register_entity("banners:banner_ent", {
|
||||||
@@ -276,10 +345,6 @@ core.register_entity("banners:banner_ent", {
|
|||||||
on_activate = banners.banner_on_activate,
|
on_activate = banners.banner_on_activate,
|
||||||
})
|
})
|
||||||
|
|
||||||
core.register_on_leaveplayer(function(player)
|
|
||||||
histories[player:get_player_name()] = nil
|
|
||||||
end)
|
|
||||||
|
|
||||||
if core.get_modpath("factions") then
|
if core.get_modpath("factions") then
|
||||||
dofile(MP .. "factions.lua")
|
dofile(MP .. "factions.lua")
|
||||||
end
|
end
|
||||||
@@ -287,4 +352,5 @@ end
|
|||||||
dofile(MP .. "items.lua")
|
dofile(MP .. "items.lua")
|
||||||
dofile(MP .. "nodes.lua")
|
dofile(MP .. "nodes.lua")
|
||||||
dofile(MP .. "crafts.lua")
|
dofile(MP .. "crafts.lua")
|
||||||
|
dofile(MP .. "chatcommands.lua")
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user