2022-09-19 22:18:49 +00:00
local wea_c = worldeditadditions_core
local EventEmitter = worldeditadditions_core.EventEmitter
local anchor
2023-07-17 23:35:07 +00:00
local function make_id ( )
return tostring ( wea_c.get_ms_time ( ) ) .. " _ " .. tostring ( math.floor ( math.random ( ) * 1000000 ) )
end
local last_reset = make_id ( )
2022-09-19 22:18:49 +00:00
local WEAPositionMarker = {
initial_properties = {
visual = " cube " ,
visual_size = { x = 1.15 , y = 1.1 } ,
collisionbox = { - 0.55 , - 0.55 , - 0.55 , 0.55 , 0.55 , 0.55 } ,
physical = false ,
collide_with_objects = false ,
2023-07-31 23:27:07 +00:00
hp_max = 1 ,
2022-09-19 22:18:49 +00:00
textures = {
2023-06-27 19:16:04 +00:00
" worldeditadditions_core_bg.png " ,
" worldeditadditions_core_bg.png " ,
" worldeditadditions_core_bg.png " ,
" worldeditadditions_core_bg.png " ,
" worldeditadditions_core_bg.png " ,
" worldeditadditions_core_bg.png " ,
2022-09-19 22:18:49 +00:00
}
} ,
on_activate = function ( self , staticdata )
2023-07-17 23:35:07 +00:00
local data = minetest.parse_json ( staticdata )
2023-07-31 23:14:43 +00:00
print ( " DEBUG:pos_marker ON_ACTIVATE data " , data )
2023-07-17 23:35:07 +00:00
if type ( data ) ~= " table " or data.id ~= last_reset then
-- print("DEBUG:marker_wall/remove staticdata", staticdata, "last_reset", last_reset)
self.object : remove ( )
-- else
-- print("DEBUG:marker_wall/ok staticdata", staticdata, "type", type(staticdata), "last_reset", last_reset, "type", type(last_reset))
return
end
self.__id = data.id
self.player_name = data.player_name
self.display_number = data.display_number
anchor : emit ( " update_entity " , {
entity = self.object ,
id = self.__id ,
player_name = self.player_name ,
i = self.display_number
} )
anchor.set_number ( self.object , self.display_number )
2022-09-19 22:18:49 +00:00
end ,
on_punch = function ( self , _ )
2023-07-31 23:16:36 +00:00
print ( " DEBUG:pos_marker on_punch " )
2022-09-19 22:18:49 +00:00
anchor.delete ( self )
end ,
on_blast = function ( self , damage )
return false , false , { } -- Do not damage or knockback the player
2023-07-17 23:35:07 +00:00
end ,
get_staticdata = function ( self )
return minetest.write_json ( {
id = self.__id ,
display_number = self.display_number ,
player_name = self.player_name
} )
2022-09-19 22:18:49 +00:00
end
}
minetest.register_entity ( " :worldeditadditions:position " , WEAPositionMarker )
local function create ( player_name , pos , display_number )
2023-07-17 23:35:07 +00:00
local entity = minetest.add_entity ( pos , " worldeditadditions:position " , minetest.write_json ( {
id = last_reset ,
display_number = display_number ,
player_name = player_name
} ) )
2022-09-19 22:18:49 +00:00
2023-07-17 23:35:07 +00:00
-- entity:get_luaentity().player_name = player_name
-- entity:get_luaentity().display_number = display_number
2022-09-19 22:18:49 +00:00
2023-07-17 23:35:07 +00:00
-- anchor.set_number(entity, display_number)
2022-09-19 22:18:49 +00:00
anchor : emit ( " create " , {
player_name = player_name ,
pos = pos ,
display_number = display_number ,
} )
return entity
end
local function delete ( entity )
2023-07-17 23:35:07 +00:00
if not entity or not entity.get_luaentity or not entity : get_luaentity ( ) then return end -- Ensure the entity is still valid
2022-09-20 01:17:11 +00:00
2022-09-19 22:18:49 +00:00
local player_name = entity : get_luaentity ( ) . player_name
local display_number = entity : get_luaentity ( ) . display_number
2023-07-17 23:35:07 +00:00
last_reset = make_id ( )
2022-09-19 22:18:49 +00:00
entity : remove ( )
anchor : emit ( " delete " , {
player_name = player_name ,
display_number = display_number
} )
end
2022-09-20 02:21:55 +00:00
local number_colours = {
" #FF0000 " ,
2022-09-20 15:59:49 +00:00
" #ff6800 " ,
" #FFD700 " ,
" #CCFF00 " ,
2022-09-20 02:21:55 +00:00
" #00FF00 " ,
2022-09-20 15:59:49 +00:00
" #00FFAA " ,
2022-09-20 02:21:55 +00:00
" #00FFFF " ,
" #0088FF " ,
2022-09-20 15:59:49 +00:00
" #5058FF " ,
2022-09-20 02:21:55 +00:00
" #8800ff " ,
" #FF00ff " ,
" #FF0088 "
}
2022-09-19 22:18:49 +00:00
local function set_number ( entity , display_number )
if type ( display_number ) ~= " number " then return false , " Error: The 'display_number' property must be of type number, but received value of unexpected type ' " .. type ( display_number ) .. " '. " end
2022-09-20 02:21:55 +00:00
local texture_name = " "
2022-09-20 01:17:11 +00:00
if display_number < 100 then
local number_right = display_number % 10
local number_left = ( display_number - number_right ) / 10
2023-06-27 19:16:04 +00:00
texture_name = texture_name .. " worldeditadditions_core_l " .. number_left .. " .png "
texture_name = texture_name .. " ^worldeditadditions_core_r " .. number_right .. " .png "
2022-09-25 00:57:41 +00:00
-- print("DEBUG:set_number number_left", number_left, "number_right", number_right)
2022-09-20 02:21:55 +00:00
2022-09-20 15:59:49 +00:00
local colour_id = ( ( display_number - 1 ) % 12 ) + 1 -- Lua starts from 1, not 0 :-/
2022-09-20 02:21:55 +00:00
texture_name = " ( " .. texture_name .. " )^[colorize: " .. number_colours [ colour_id ] .. " :255 "
end
if # texture_name > 0 then
2023-06-27 19:16:04 +00:00
texture_name = " worldeditadditions_core_bg.png^( " .. texture_name .. " ) "
2022-09-20 02:21:55 +00:00
else
2023-06-27 19:16:04 +00:00
texture_name = " worldeditadditions_core_bg.png "
2022-09-20 01:17:11 +00:00
end
2022-09-25 00:57:41 +00:00
-- print("DEBUG:set_number texture_name", texture_name)
2022-09-20 01:17:11 +00:00
entity : set_properties ( {
textures = {
texture_name , texture_name , texture_name ,
texture_name , texture_name , texture_name ,
}
} )
2022-09-19 22:18:49 +00:00
end
anchor = EventEmitter.new ( {
create = create ,
delete = delete ,
set_number = set_number
} )
2023-07-31 23:14:43 +00:00
anchor.debug = true
2022-09-20 15:59:49 +00:00
return anchor