more one
							
								
								
									
										64
									
								
								API.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,64 @@ | ||||||
|  | # `generic_flags` API | ||||||
|  | 
 | ||||||
|  | Programmers can use the following Lua functions to add custom flags, | ||||||
|  | get a list of all flags, and set and get the flag of flag pole nodes. | ||||||
|  | 
 | ||||||
|  | ## Functions | ||||||
|  | 
 | ||||||
|  | ### `generic_flags.add_flag(name)` | ||||||
|  | 
 | ||||||
|  | Add a new flag to the game. `name` is the flag identifier. | ||||||
|  | There *must* exist a texture with the name `flag_<name>.png`. | ||||||
|  | The texture *should* have an aspect ratio of 1.3. | ||||||
|  | The recommended size is 78×60, but other sizes are OK | ||||||
|  | as long the aspect ratio is respected. | ||||||
|  | 
 | ||||||
|  | The flag name *must not* already exist. This will be checked. | ||||||
|  | 
 | ||||||
|  | On success, the flag will be appended to the list of flags at the end. | ||||||
|  | 
 | ||||||
|  | If a flag with the given name already exists, no flag will be | ||||||
|  | added. | ||||||
|  | 
 | ||||||
|  | Returns `true` on success and `false` on failure. | ||||||
|  | 
 | ||||||
|  | ### `generic_flags.get_flags()` | ||||||
|  | 
 | ||||||
|  | Returns a list of all available flag identifiers. The flags | ||||||
|  | are sorted by selection order. | ||||||
|  | 
 | ||||||
|  | ### `generic_flags.set_flag_at(pos, flag_name)` | ||||||
|  | 
 | ||||||
|  | Sets the flag at an upper mast node at position `pos` to the flag `flag_name`. | ||||||
|  | The node at `pos` *must* be `generic_flags:upper_mast`. | ||||||
|  | Returns `true` on success and `false` otherwise. | ||||||
|  | 
 | ||||||
|  | ### `generic_flags.get_flag_at(pos)` | ||||||
|  | 
 | ||||||
|  | Returns the currently used flag at the upper mast node at position `pos`. | ||||||
|  | The node at `pos` *must* be `generic_flags:upper_mast`. | ||||||
|  | Returns a string on success and `nil` otherwise. | ||||||
|  | 
 | ||||||
|  | ### `generic_flags.get_wind(pos)` | ||||||
|  | 
 | ||||||
|  | Returns the current wind strength at pos. The wind strength determines how | ||||||
|  | fast a flag at pos would be waving at the time this function was called. | ||||||
|  | 
 | ||||||
|  | This function will be called from time to time by the mod to update | ||||||
|  | the flag waving speed of flags. It is called for every flag once about | ||||||
|  | every 115 seconds (plusminus 10 seconds). | ||||||
|  | 
 | ||||||
|  | This function is predefined in this mod by pseudorandomly changing the wind | ||||||
|  | strength over time using a Perlin noise. By default, the wind strength is | ||||||
|  | only controlled by the current time; the position is ignored. | ||||||
|  | 
 | ||||||
|  | This function can be overwritten by mods to define your own wind algorithm. | ||||||
|  | You can do whatever in this function, you only need to return a number in | ||||||
|  | the end. The number should be roughly in the range between 0 and 50. | ||||||
|  | 
 | ||||||
|  | This is how the wind strength affects the flag waving speed: | ||||||
|  | 
 | ||||||
|  | * wind < 10: slow | ||||||
|  | * 10 < wind < 20: medium | ||||||
|  | * 20 < wind < 40: fast | ||||||
|  | * wind > 40: very fast | ||||||
							
								
								
									
										79
									
								
								LICENSE.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,79 @@ | ||||||
|  | # Licensing and credits for Generic Inoffensive Flags Mod | ||||||
|  | 
 | ||||||
|  | Source Code License | ||||||
|  | ---------------------------------------------------------- | ||||||
|  | 
 | ||||||
|  | GNU Lesser General Public License v3 (LGPL-3.0) | ||||||
|  | 
 | ||||||
|  | Copyright (c) 2022, AwesomeDragon97 and the creators of the original mod: Leslie E. Krause <leslie@searstower.org> and Wuzzy <Wuzzy@disroot.org> | ||||||
|  | 
 | ||||||
|  | This program is free software; you can redistribute it and/or modify it under the terms of | ||||||
|  | the GNU Lesser General Public License as published by the Free Software Foundation; either | ||||||
|  | version 3 of the License, or (at your option) any later version. | ||||||
|  | 
 | ||||||
|  | This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; | ||||||
|  | without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||||||
|  | See the GNU Lesser General Public License for more details. | ||||||
|  | 
 | ||||||
|  | http://www.gnu.org/licenses/lgpl-3.0.html | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Multimedia License (textures, sounds, and models) | ||||||
|  | ---------------------------------------------------------- | ||||||
|  | 
 | ||||||
|  | Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) | ||||||
|  | 
 | ||||||
|  |    /models/flags_mast_lower.obj | ||||||
|  |    by AwesomeDragon97 | ||||||
|  | 
 | ||||||
|  |    /models/flags_mast_upper.obj | ||||||
|  |    by AwesomeDragon97 | ||||||
|  | 
 | ||||||
|  |    /models/flags_wavingflag.b3d | ||||||
|  |    by sorcerykid | ||||||
|  | 
 | ||||||
|  |    /textures/flags_baremetal.png | ||||||
|  |    by sorcerykid | ||||||
|  | 
 | ||||||
|  |    /sounds/flags_flagwave1.ogg | ||||||
|  |    by Chelly01 | ||||||
|  |    obtained from https://freesound.org/people/Chelly01/sounds/541088/ | ||||||
|  |    modified by sorcerykid | ||||||
|  | 
 | ||||||
|  |    /sounds/flags_flagwave2.ogg | ||||||
|  |    by Chelly01 | ||||||
|  |    obtained from https://freesound.org/people/Chelly01/sounds/541088/ | ||||||
|  |    modified by sorcerykid | ||||||
|  | 
 | ||||||
|  |    /sounds/flags_flagwave3.ogg | ||||||
|  |    by Chelly01 | ||||||
|  |    obtained from https://freesound.org/people/Chelly01/sounds/541088/ | ||||||
|  |    modified by sorcerykid | ||||||
|  | 
 | ||||||
|  |    progress | ||||||
|  |    by Edgy1 | ||||||
|  | 
 | ||||||
|  | You are free to: | ||||||
|  | Share — copy and redistribute the material in any medium or format. | ||||||
|  | Adapt — remix, transform, and build upon the material for any purpose, even commercially. | ||||||
|  | The licensor cannot revoke these freedoms as long as you follow the license terms. | ||||||
|  | 
 | ||||||
|  | Under the following terms: | ||||||
|  | 
 | ||||||
|  | Attribution — You must give appropriate credit, provide a link to the license, and | ||||||
|  | indicate if changes were made. You may do so in any reasonable manner, but not in any way | ||||||
|  | that suggests the licensor endorses you or your use. | ||||||
|  | 
 | ||||||
|  | No additional restrictions — You may not apply legal terms or technological measures that | ||||||
|  | legally restrict others from doing anything the license permits. | ||||||
|  | 
 | ||||||
|  | Notices: | ||||||
|  | 
 | ||||||
|  | You do not have to comply with the license for elements of the material in the public | ||||||
|  | domain or where your use is permitted by an applicable exception or limitation. | ||||||
|  | No warranties are given. The license may not give you all of the permissions necessary | ||||||
|  | for your intended use. For example, other rights such as publicity, privacy, or moral | ||||||
|  | rights may limit how you use the material. | ||||||
|  | 
 | ||||||
|  | For more details: | ||||||
|  | http://creativecommons.org/licenses/by-sa/3.0/ | ||||||
							
								
								
									
										3
									
								
								README.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,3 @@ | ||||||
|  | ~~Made by AwesomeDragon97, Anonymous~~ | ||||||
|  | 
 | ||||||
|  | Credit: Wuzzy for making the original mod. | ||||||
							
								
								
									
										626
									
								
								init.lua
									
										
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,626 @@ | ||||||
|  | -------------------------------------------------------- | ||||||
|  | -- Minetest :: Generic Flags Mod (flags) | ||||||
|  | -- | ||||||
|  | -- See README.txt for licensing and other information. | ||||||
|  | -- Made by AwesomeDragon97, Anonymous with code from Wuzzy. | ||||||
|  | -------------------------------------------------------- | ||||||
|  | 
 | ||||||
|  | flags = {} | ||||||
|  | 
 | ||||||
|  | local wind_noise = PerlinNoise( 204, 1, 0, 500 ) | ||||||
|  | -- Check whether the new `get_2d` Perlin function is available, | ||||||
|  | -- otherwise use `get2d`. Needed to suppress deprecation | ||||||
|  | -- warning in newer Minetest versions. | ||||||
|  | local old_get2d = true | ||||||
|  | if wind_noise.get_2d then | ||||||
|  | 	old_get2d = false | ||||||
|  | end | ||||||
|  | local active_flags = { } | ||||||
|  | 
 | ||||||
|  | local pi = math.pi | ||||||
|  | local rad_180 = pi | ||||||
|  | local rad_90 = pi / 2 | ||||||
|  | 
 | ||||||
|  | -- This flag is used as the default or fallback in case of error/missing data | ||||||
|  | local DEFAULT_FLAG = minetest.settings:get('default_flag') or 'white' | ||||||
|  | 
 | ||||||
|  | local flag_list = {} | ||||||
|  | if minetest.settings:get_bool('name_flags', true) == true then | ||||||
|  | flag_list = { -- generic flags | ||||||
|  | 	"white", | ||||||
|  | --	"red", | ||||||
|  | --	"green", | ||||||
|  | --	"brown", | ||||||
|  | --	"blue", | ||||||
|  | 	"black", | ||||||
|  | --	"orange", | ||||||
|  | --	"yellow", | ||||||
|  | --	"purple", | ||||||
|  | --	"pink", | ||||||
|  | --	"gray", | ||||||
|  | --	"cyan", | ||||||
|  | --	"magenta", | ||||||
|  | 	"dark_green", | ||||||
|  | 	"dark_gray", | ||||||
|  | 	"pirate", | ||||||
|  | 	"anarcho", | ||||||
|  | 	"makhno", | ||||||
|  | 	"anonymous", | ||||||
|  | 	"guyfox", | ||||||
|  |   "jollyroger", | ||||||
|  |   "anarchy" } | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | local next_flag, prev_flag | ||||||
|  | local update_next_prev_flag_lists = function() | ||||||
|  | 	next_flag = {} | ||||||
|  | 	prev_flag = {} | ||||||
|  | 	for f=1, #flag_list do | ||||||
|  | 		local name1 = flag_list[f] | ||||||
|  | 		local name0, name2 | ||||||
|  | 		if f < #flag_list then | ||||||
|  | 			name2 = flag_list[f+1] | ||||||
|  | 		else | ||||||
|  | 			name2 = flag_list[1] | ||||||
|  | 		end | ||||||
|  | 		if f == 1 then | ||||||
|  | 			name0 = flag_list[#flag_list] | ||||||
|  | 		else | ||||||
|  | 			name0 = flag_list[f-1] | ||||||
|  | 		end | ||||||
|  | 		next_flag[name1] = name2 | ||||||
|  | 		prev_flag[name1] = name0 | ||||||
|  | 	end | ||||||
|  | end | ||||||
|  | update_next_prev_flag_lists() | ||||||
|  | 
 | ||||||
|  | local flag_exists = function(flag_name) | ||||||
|  | 	return next_flag[ flag_name] ~= nil | ||||||
|  | end | ||||||
|  | local get_next_flag = function(current_flag_name) | ||||||
|  | 	if not current_flag_name or not flag_exists( current_flag_name ) then | ||||||
|  | 		return DEFAULT_FLAG | ||||||
|  | 	else | ||||||
|  | 		return next_flag[current_flag_name] | ||||||
|  | 	end | ||||||
|  | end | ||||||
|  | local get_prev_flag = function(current_flag_name) | ||||||
|  | 	if not current_flag_name or not flag_exists( current_flag_name ) then | ||||||
|  | 		return DEFAULT_FLAG | ||||||
|  | 	else | ||||||
|  | 		return prev_flag[current_flag_name] | ||||||
|  | 	end | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | -- Delete entity if there is no flag mast node | ||||||
|  | local delete_if_orphan = function( self ) | ||||||
|  | 	local pos = self.object:get_pos( ) | ||||||
|  | 	local node = minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}) | ||||||
|  | 	if node.name ~= "pirate_flag:upper_mast" and node.name ~= "ignore" then | ||||||
|  | 		minetest.log("action", "[flags] Orphan flag entity removed at "..minetest.pos_to_string(pos, 1)) | ||||||
|  | 		self.object:remove( ) | ||||||
|  | 		return true | ||||||
|  | 	end | ||||||
|  | 	return false | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | minetest.register_entity( "pirate_flag:wavingflag", { | ||||||
|  | 	initial_properties = { | ||||||
|  | 		physical = false, | ||||||
|  | 		visual = "mesh", | ||||||
|  | 		visual_size = { x = 8.5, y = 8.5 }, | ||||||
|  | 		collisionbox = { 0, 0, 0, 0, 0, 0 }, | ||||||
|  | 		backface_culling = false, | ||||||
|  | 		pointable = false, | ||||||
|  | 		mesh = "flags_wavingflag.b3d", | ||||||
|  | 		textures = { "flag_" .. DEFAULT_FLAG .. ".png" }, | ||||||
|  | 		use_texture_alpha = false, | ||||||
|  | 	}, | ||||||
|  | 
 | ||||||
|  | 	on_activate = function ( self, staticdata, dtime ) | ||||||
|  | 		if delete_if_orphan( self) then | ||||||
|  | 			return | ||||||
|  | 		end | ||||||
|  | 		-- Init stuff | ||||||
|  | 		self:reset_animation( true ) | ||||||
|  | 		self.object:set_armor_groups( { immortal = 1 } ) | ||||||
|  | 
 | ||||||
|  | 		if staticdata ~= "" then | ||||||
|  | 			local data = minetest.deserialize( staticdata ) | ||||||
|  | 			if data.flag_name then | ||||||
|  | 				self.flag_name = data.flag_name | ||||||
|  | 			else | ||||||
|  | 				self.flag_name = DEFAULT_FLAG | ||||||
|  | 			end | ||||||
|  | 			self.node_idx = data.node_idx | ||||||
|  | 
 | ||||||
|  | 			if not self.flag_name or not self.node_idx then | ||||||
|  | 				self.object:remove( ) | ||||||
|  | 				return | ||||||
|  | 			end | ||||||
|  | 
 | ||||||
|  | 			self:reset_texture( self.flag_name ) | ||||||
|  | 
 | ||||||
|  | 			active_flags[ self.node_idx ] = self.object | ||||||
|  | 		else | ||||||
|  | 			self.flag_name = DEFAULT_FLAG | ||||||
|  | 		end | ||||||
|  | 
 | ||||||
|  | 		-- Delete entity if there is already one for this pos | ||||||
|  | 		local objs = minetest.get_objects_inside_radius( self.object:get_pos(), 0.5 ) | ||||||
|  | 		for o=1, #objs do | ||||||
|  | 			local obj = objs[o] | ||||||
|  | 			local lua = obj:get_luaentity( ) | ||||||
|  | 			if lua and self ~= lua and lua.name == "pirate_flag:wavingflag" then | ||||||
|  | 				if lua.node_idx == self.node_idx then | ||||||
|  | 					self.object:remove( ) | ||||||
|  | 					return | ||||||
|  | 				end | ||||||
|  | 			end | ||||||
|  | 		end | ||||||
|  | 	end, | ||||||
|  | 
 | ||||||
|  | 	on_deactivate = function ( self ) | ||||||
|  | 		if self.sound_id then | ||||||
|  | 			minetest.sound_stop( self.sound_id ) | ||||||
|  | 		end | ||||||
|  | 	end, | ||||||
|  | 
 | ||||||
|  | 	on_step = function ( self, dtime ) | ||||||
|  | 		self.anim_timer = self.anim_timer - dtime | ||||||
|  | 
 | ||||||
|  | 		if self.anim_timer <= 0 then | ||||||
|  | 			if delete_if_orphan( self) then | ||||||
|  | 				return | ||||||
|  | 			end | ||||||
|  | 			self:reset_animation( ) | ||||||
|  | 		end | ||||||
|  | 	end, | ||||||
|  | 
 | ||||||
|  | 	reset_animation = function ( self, initial ) | ||||||
|  | 		local pos = self.object:get_pos( ) | ||||||
|  | 		local cur_wind = flags.get_wind( pos ) | ||||||
|  | 		minetest.log("verbose", "[flags] Current wind at "..minetest.pos_to_string(pos, 1)..": " .. cur_wind) | ||||||
|  | 		local anim_speed | ||||||
|  | 		local wave_sound | ||||||
|  | 
 | ||||||
|  | 		if cur_wind < 10 then | ||||||
|  | 			anim_speed = 10	-- 2 cycle | ||||||
|  | 			wave_sound = "flags_flagwave1" | ||||||
|  | 		elseif cur_wind < 20 then | ||||||
|  | 			anim_speed = 20  -- 4 cycles | ||||||
|  | 			wave_sound = "flags_flagwave1" | ||||||
|  | 		elseif cur_wind < 40 then | ||||||
|  | 			anim_speed = 40  -- 8 cycles | ||||||
|  | 			wave_sound = "flags_flagwave2" | ||||||
|  | 		else | ||||||
|  | 			anim_speed = 80  -- 16 cycles | ||||||
|  | 			wave_sound = "flags_flagwave3" | ||||||
|  | 		end | ||||||
|  | 		-- slightly anim_speed change to desyncronize flag waving | ||||||
|  | 		anim_speed = anim_speed + math.random(0, 200) * 0.01 | ||||||
|  | 
 | ||||||
|  | 		if self.object then | ||||||
|  | 			if initial or (not self.object.set_animation_frame_speed) then | ||||||
|  | 				self.object:set_animation( { x = 1, y = 575 }, anim_speed, 0, true ) | ||||||
|  | 			else | ||||||
|  | 				self.object:set_animation_frame_speed(anim_speed) | ||||||
|  | 			end | ||||||
|  | 		end | ||||||
|  | 		if not self.sound_id then | ||||||
|  | 			self.sound_id = minetest.sound_play( wave_sound, { object = self.object, gain = 1.0, loop = true } ) | ||||||
|  | 		end | ||||||
|  | 
 | ||||||
|  | 		self.anim_timer = 115 + math.random(-10, 10) -- time to reset animation | ||||||
|  | 	end, | ||||||
|  | 
 | ||||||
|  | 	reset_texture = function ( self, flag_name, nextprev ) | ||||||
|  | 		if nextprev == 1 then | ||||||
|  | 			self.flag_name = get_next_flag(self.flag_name) | ||||||
|  | 		elseif nextprev == -1 then | ||||||
|  | 			self.flag_name = get_prev_flag(self.flag_name) | ||||||
|  | 		else | ||||||
|  | 			self.flag_name = flag_name | ||||||
|  | 		end | ||||||
|  | 
 | ||||||
|  | 		local texture = string.format( "flag_%s.png", self.flag_name ) | ||||||
|  | 		self.object:set_properties( { textures = { texture } } ) | ||||||
|  | 		return self.flag_name | ||||||
|  | 	end, | ||||||
|  | 
 | ||||||
|  | 	get_staticdata = function ( self ) | ||||||
|  | 		return minetest.serialize( { | ||||||
|  | 			node_idx = self.node_idx, | ||||||
|  | 			flag_name = self.flag_name, | ||||||
|  | 		} ) | ||||||
|  | 	end, | ||||||
|  | } ) | ||||||
|  | 
 | ||||||
|  | local metal_sounds | ||||||
|  | if minetest.get_modpath("default") ~= nil then | ||||||
|  | 	if default.node_sound_metal_defaults then | ||||||
|  | 		metal_sounds = default.node_sound_metal_defaults() | ||||||
|  | 	end | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | minetest.register_node("pirate_flag:lower_mast", { | ||||||
|  |         description = ("Flag Pole"), | ||||||
|  |         drawtype = "mesh", | ||||||
|  |         paramtype = "light", | ||||||
|  |         mesh = "flags_mast_lower.obj", | ||||||
|  |         paramtype2 = "facedir", | ||||||
|  |         tiles = { "flags_baremetal.png", "flags_baremetal.png" }, | ||||||
|  |         wield_image = "flags_pole_bottom_inv.png", | ||||||
|  |         inventory_image = "flags_pole_bottom_inv.png", | ||||||
|  |         groups = { cracky = 2 }, | ||||||
|  |         sounds = metal_sounds, | ||||||
|  | 	is_ground_content = false, | ||||||
|  | 
 | ||||||
|  |         selection_box = { | ||||||
|  |                 type = "fixed", | ||||||
|  |                 fixed = { { -2/16, -1/2, -2/16, 2/16, 1/2, 2/16 } }, | ||||||
|  |         }, | ||||||
|  |         collision_box = { | ||||||
|  |                 type = "fixed", | ||||||
|  |                 fixed = { { -2/16, -1/2, -2/16, 2/16, 1/2, 2/16 } }, | ||||||
|  |         }, | ||||||
|  | 
 | ||||||
|  | 	on_rotate = function(pos, node, user, mode, new_param2) | ||||||
|  | 		if mode == screwdriver.ROTATE_AXIS then | ||||||
|  | 			return false | ||||||
|  | 		end | ||||||
|  | 	end, | ||||||
|  | } ) | ||||||
|  | 
 | ||||||
|  | local function get_flag_pos( pos, param2 ) | ||||||
|  | 	local facedir_to_pos = { | ||||||
|  | 		[0] = { x = 0, y = 0.5, z = -0.125 }, | ||||||
|  | 		[1] = { x = -0.125, y = 0.5, z = 0 }, | ||||||
|  | 		[2] = { x = 0, y = 0.5, z = 0.125 }, | ||||||
|  | 		[3] = { x = 0.125, y = 0.5, z = 0 }, | ||||||
|  | 	} | ||||||
|  | 	return vector.add( pos, vector.multiply( facedir_to_pos[ param2 ], 1 ) ) | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | local function rotate_flag_by_param2( flag, param2 ) | ||||||
|  | 	local facedir_to_yaw = { | ||||||
|  | 		[0] = rad_90, | ||||||
|  | 		[1] = 0, | ||||||
|  | 		[2] = -rad_90, | ||||||
|  | 		[3] = rad_180, | ||||||
|  | 	} | ||||||
|  | 	local baseyaw = facedir_to_yaw[ param2 ] | ||||||
|  | 	if not baseyaw then | ||||||
|  | 		minetest.log("warning", "[flags] Unsupported flag pole node param2: "..tostring(param2)) | ||||||
|  | 		return | ||||||
|  | 	end | ||||||
|  | 	flag:set_yaw( baseyaw - rad_180 ) | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | local function spawn_flag( pos ) | ||||||
|  | 	local node_idx = minetest.hash_node_position( pos ) | ||||||
|  | 	local param2 = minetest.get_node( pos ).param2 | ||||||
|  | 
 | ||||||
|  | 	local flag_pos = get_flag_pos( pos, param2 ) | ||||||
|  | 	local obj = minetest.add_entity( flag_pos, "pirate_flag:wavingflag" ) | ||||||
|  | 	if not obj or not obj:get_luaentity( ) then | ||||||
|  | 		return | ||||||
|  | 	end | ||||||
|  | 
 | ||||||
|  | 	obj:get_luaentity( ).node_idx = node_idx | ||||||
|  | 	rotate_flag_by_param2( obj, param2 ) | ||||||
|  | 
 | ||||||
|  | 	active_flags[ node_idx ] = obj | ||||||
|  | 	return obj | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | local function spawn_flag_and_set_texture( pos ) | ||||||
|  | 	local flag = spawn_flag( pos ) | ||||||
|  | 	if flag and flag:get_luaentity() then | ||||||
|  | 		local meta = minetest.get_meta( pos ) | ||||||
|  | 		local flag_name = meta:get_string("flag_name") | ||||||
|  | 		if flag_name == "" then | ||||||
|  | 			flag_name = DEFAULT_FLAG | ||||||
|  | 			meta:set_string("flag_idx", "") | ||||||
|  | 			meta:set_string("flag_name", flag_name) | ||||||
|  | 		end | ||||||
|  | 		flag:get_luaentity():reset_texture( flag_name ) | ||||||
|  | 	end | ||||||
|  | 	return flag | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | local function cycle_flag( pos, player, cycle_backwards ) | ||||||
|  | 	local pname = player:get_player_name( ) | ||||||
|  | 	if minetest.is_protected( pos, pname ) and not | ||||||
|  | 			minetest.check_player_privs( pname, "protection_bypass") then | ||||||
|  | 		minetest.record_protection_violation( pos, pname ) | ||||||
|  | 		return | ||||||
|  | 	end | ||||||
|  | 
 | ||||||
|  | 	local node_idx = minetest.hash_node_position( pos ) | ||||||
|  | 
 | ||||||
|  | 	local aflag = active_flags[ node_idx ] | ||||||
|  | 	local flag | ||||||
|  | 	if aflag then | ||||||
|  | 		flag = aflag:get_luaentity( ) | ||||||
|  | 	end | ||||||
|  | 	if flag then | ||||||
|  | 		local flag_name | ||||||
|  | 		if cycle_backwards then | ||||||
|  | 			flag_name = flag:reset_texture( nil, -1 ) | ||||||
|  | 		else | ||||||
|  | 			flag_name = flag:reset_texture( nil, 1 ) | ||||||
|  | 		end | ||||||
|  | 		local meta = minetest.get_meta( pos ) | ||||||
|  | 		meta:set_string("flag_name", flag_name) | ||||||
|  | 	else | ||||||
|  | 		spawn_flag_and_set_texture( pos ) | ||||||
|  | 	end | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | minetest.register_node( "pirate_flag:upper_mast", { | ||||||
|  | 	description = ("Flag Pole with Flag"), | ||||||
|  | 	drawtype = "mesh", | ||||||
|  | 	paramtype = "light", | ||||||
|  | 	mesh = "flags_mast_upper.obj", | ||||||
|  | 	paramtype2 = "facedir", | ||||||
|  | 	tiles = { "flags_baremetal.png", "flags_baremetal.png" }, | ||||||
|  | 	wield_image = "flags_pole_top_inv.png", | ||||||
|  | 	inventory_image = "flags_pole_top_inv.png", | ||||||
|  | 	groups = { cracky = 2 }, | ||||||
|  | 	sounds = metal_sounds, | ||||||
|  | 	is_ground_content = false, | ||||||
|  | 
 | ||||||
|  | 	drop = {"pirate_flag:lower_mast 2", "pirate_flag:upper_mast"}, | ||||||
|  | 
 | ||||||
|  |         selection_box = { | ||||||
|  |                 type = "fixed", | ||||||
|  |                 fixed = { { -2/16, -1/2, -2/16, 2/16, 3/2, 2/16 } }, | ||||||
|  |         }, | ||||||
|  |         collision_box = { | ||||||
|  |                 type = "fixed", | ||||||
|  |                 fixed = { { -2/16, -1/2, -2/16, 2/16, 3/2, 2/16 } }, | ||||||
|  |         }, | ||||||
|  | 
 | ||||||
|  | 	on_rightclick = function ( pos, node, player ) | ||||||
|  | 		cycle_flag( pos, player ) | ||||||
|  | 	end, | ||||||
|  | 
 | ||||||
|  | 	on_punch = function ( pos, node, player ) | ||||||
|  | 		cycle_flag( pos, player, -1 ) | ||||||
|  | 	end, | ||||||
|  | 
 | ||||||
|  | 	node_placement_prediction = "", | ||||||
|  | 
 | ||||||
|  | 	on_place = function( itemstack, placer, pointed_thing ) | ||||||
|  | 		if not pointed_thing.type == "node" then | ||||||
|  | 			return itemstack | ||||||
|  | 		end | ||||||
|  | 
 | ||||||
|  | 		local node = minetest.get_node(pointed_thing.under) | ||||||
|  | 		local node2 = minetest.get_node(pointed_thing.under - vector.new(0, 1, 0)) | ||||||
|  | 		if (node.name ~= "pirate_flag:lower_mast" or node2.name ~= "pirate_flag:lower_mast") then | ||||||
|  | 			return itemstack | ||||||
|  | 		end | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 		local pn = placer:get_player_name() | ||||||
|  | 		if minetest.is_protected(pointed_thing.under, pn) then | ||||||
|  | 			minetest.record_protection_violation(pointed_thing.under, pn) | ||||||
|  | 			return itemstack | ||||||
|  | 		elseif minetest.is_protected(pointed_thing.under - vector.new(0, 1, 0), pn) then | ||||||
|  | 			minetest.record_protection_violation(pointed_thing.under - vector.new(0, 1, 0), pn) | ||||||
|  | 			return itemstack | ||||||
|  | 		end | ||||||
|  | 
 | ||||||
|  | 		local yaw = placer:get_look_horizontal() | ||||||
|  | 		local dir = minetest.yaw_to_dir(yaw) | ||||||
|  | 		local param2 = (minetest.dir_to_facedir(dir) + 3) % 4 | ||||||
|  | 		minetest.set_node(pointed_thing.under - vector.new(0, 1, 0), {name = "pirate_flag:upper_mast", param2 = param2 }) | ||||||
|  | 		minetest.set_node(pointed_thing.under, {name = "pirate_flag:upper_mast_hidden_1"}) | ||||||
|  | 
 | ||||||
|  | 		if not (minetest.is_creative_enabled(pn)) then | ||||||
|  | 			itemstack:take_item() | ||||||
|  | 		end | ||||||
|  | 
 | ||||||
|  | 		local def = minetest.registered_nodes["pirate_flag:upper_mast"] | ||||||
|  | 		if def and def.sounds then | ||||||
|  | 			minetest.sound_play(def.sounds.place, {pos = pos}, true) | ||||||
|  | 		end | ||||||
|  | 
 | ||||||
|  | 		return itemstack | ||||||
|  | 	end, | ||||||
|  | 
 | ||||||
|  | 	on_construct = function ( pos ) | ||||||
|  | 		local flag = spawn_flag ( pos ) | ||||||
|  | 		if flag and flag:get_luaentity() then | ||||||
|  | 			local meta = minetest.get_meta( pos ) | ||||||
|  | 			meta:set_string("flag_name", flag:get_luaentity().flag_name) | ||||||
|  | 		end | ||||||
|  | 	end, | ||||||
|  | 
 | ||||||
|  | 	on_destruct = function ( pos ) | ||||||
|  | 		local node_idx = minetest.hash_node_position( pos ) | ||||||
|  | 		if active_flags[ node_idx ] then | ||||||
|  | 			active_flags[ node_idx ]:remove( ) | ||||||
|  | 		end | ||||||
|  | 	end, | ||||||
|  | 
 | ||||||
|  | 	after_destruct = function( pos ) | ||||||
|  | 		local above1 = {x=pos.x, y=pos.y+1, z=pos.z} | ||||||
|  | 		if minetest.get_node( above1 ).name == "pirate_flag:upper_mast_hidden_1" then | ||||||
|  | 			minetest.remove_node( above1 ) | ||||||
|  | 		end | ||||||
|  | 	end, | ||||||
|  | 
 | ||||||
|  | 	on_rotate = function(pos, node, user, mode, new_param2) | ||||||
|  | 		if mode == screwdriver.ROTATE_AXIS then | ||||||
|  | 			return false | ||||||
|  | 		end | ||||||
|  | 		local node_idx = minetest.hash_node_position( pos ) | ||||||
|  | 		local aflag = active_flags[ node_idx ] | ||||||
|  | 		if aflag then | ||||||
|  | 			local lua = aflag:get_luaentity( ) | ||||||
|  | 			if not lua then | ||||||
|  | 				aflag = spawn_flag_and_set_texture( pos ) | ||||||
|  | 				if aflag then | ||||||
|  | 					lua = aflag:get_luaentity() | ||||||
|  | 					if not lua then | ||||||
|  | 						 return | ||||||
|  | 					 end | ||||||
|  | 				 end | ||||||
|  | 			end | ||||||
|  | 			local flag_pos_idx = lua.node_idx | ||||||
|  | 			local flag_pos = minetest.get_position_from_hash( flag_pos_idx ) | ||||||
|  | 			flag_pos = get_flag_pos( flag_pos, new_param2 ) | ||||||
|  | 			rotate_flag_by_param2( aflag, new_param2 ) | ||||||
|  | 			aflag:set_pos( flag_pos ) | ||||||
|  | 		end | ||||||
|  | 	end, | ||||||
|  | } ) | ||||||
|  | 
 | ||||||
|  | minetest.register_lbm({ | ||||||
|  | 	name = "pirate_flag:respawn_flags", | ||||||
|  | 	label = "Respawn flags", | ||||||
|  | 	nodenames = {"pirate_flag:upper_mast"}, | ||||||
|  | 	run_at_every_load = true, | ||||||
|  | 	action = function(pos, node) | ||||||
|  | 		local node_idx = minetest.hash_node_position( pos ) | ||||||
|  | 		local aflag = active_flags[ node_idx ] | ||||||
|  | 		if aflag then | ||||||
|  | 			return | ||||||
|  | 		end | ||||||
|  | 		spawn_flag_and_set_texture( pos ) | ||||||
|  | 	end | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | minetest.register_lbm({ | ||||||
|  | 	name = "pirate_flag:update_node_meta", | ||||||
|  | 	label = "Update mast node meta", | ||||||
|  | 	nodenames = {"pirate_flag:upper_mast"}, | ||||||
|  | 	run_at_every_load = false, | ||||||
|  | 	action = function(pos, node) | ||||||
|  | 		local meta = minetest.get_meta( pos ) | ||||||
|  | 		local flag_idx = meta:get_int("flag_idx") | ||||||
|  | 		if flag_idx ~= 0 then | ||||||
|  | 			flag_name = DEFAULT_FLAG | ||||||
|  | 			meta:set_string("flag_idx", "") | ||||||
|  | 			meta:set_string("flag_name", flag_name) | ||||||
|  | 		end | ||||||
|  | 	end | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | local flagpole_material = minetest.settings:get('flagpole_material') or "default:steel_ingot" | ||||||
|  | 
 | ||||||
|  | if minetest.registered_items[flagpole_material] then | ||||||
|  | 	minetest.register_craft({ | ||||||
|  | 		output = "pirate_flag:lower_mast 3", | ||||||
|  | 		recipe = { | ||||||
|  | 			{flagpole_material}, | ||||||
|  | 			{flagpole_material}, | ||||||
|  | 			{flagpole_material}, | ||||||
|  | 		}, | ||||||
|  | 	}) | ||||||
|  | end | ||||||
|  | minetest.register_craft({ | ||||||
|  | 	output = "pirate_flag:upper_mast", | ||||||
|  | 	recipe = { | ||||||
|  | 		{"group:wool", "group:wool", "group:wool"}, | ||||||
|  | 		{"group:wool", "group:wool", "group:wool"}, | ||||||
|  | 	}, | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | -- Add a hidden upper mast segments to block the node | ||||||
|  | -- the upper mast occupies. This is also needed to prevent | ||||||
|  | -- collision issues. | ||||||
|  | -- This node will be automatically | ||||||
|  | -- added/removed when the upper mast is constructed | ||||||
|  | -- or destructed. | ||||||
|  | minetest.register_node( "pirate_flag:upper_mast_hidden_1", { | ||||||
|  | 	drawtype = "airlike", | ||||||
|  | 	pointable = false, | ||||||
|  | 	paramtype = "light", | ||||||
|  | 	sunlight_propagates = true, | ||||||
|  | 	wield_image = "flags_pole_hidden1_inv.png", | ||||||
|  | 	inventory_image = "flags_pole_hidden1_inv.png", | ||||||
|  | 	groups = { not_in_creative_inventory = 1 }, | ||||||
|  | 	sounds = metal_sounds, | ||||||
|  |         collision_box = { | ||||||
|  |                 type = "fixed", | ||||||
|  |                 fixed = { { -3/32, -1/2, -3/32, 3/32, 1/5, 3/32 } }, | ||||||
|  |         }, | ||||||
|  | 	is_ground_content = false, | ||||||
|  | 	on_blast = function() end, | ||||||
|  | 	can_dig = function() return false end, | ||||||
|  | 	drop = "", | ||||||
|  | 	diggable = false, | ||||||
|  | 	floodable = false, | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | -- API | ||||||
|  | flags.add_flag = function( name ) | ||||||
|  | 	if flag_exists( name ) then | ||||||
|  | 		return false | ||||||
|  | 	end | ||||||
|  | 	table.insert( flag_list, name ) | ||||||
|  | 	update_next_prev_flag_lists() | ||||||
|  | 	return true | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | flags.get_flags = function( ) | ||||||
|  | 	return table.copy( flag_list ) | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | flags.set_flag_at = function( pos, flag_name ) | ||||||
|  | 	local node = minetest.get_node( pos ) | ||||||
|  | 	if node.name ~= "pirate_flag:upper_mast" then | ||||||
|  | 		return false | ||||||
|  | 	end | ||||||
|  | 	if not flag_exists( flag_name ) then | ||||||
|  | 		return false | ||||||
|  | 	end | ||||||
|  | 	local node_idx = minetest.hash_node_position( pos ) | ||||||
|  | 	local aflag = active_flags[ node_idx ] | ||||||
|  | 	local flag | ||||||
|  | 	if aflag then | ||||||
|  | 		flag = aflag:get_luaentity( ) | ||||||
|  | 	end | ||||||
|  | 	if flag then | ||||||
|  | 		local set_flag_name = flag:reset_texture( flag_name ) | ||||||
|  | 		if set_flag_name == flag_name then | ||||||
|  | 			local meta = minetest.get_meta( pos ) | ||||||
|  | 			meta:set_string("flag_name", flag_name) | ||||||
|  | 			return true | ||||||
|  | 		end | ||||||
|  | 	end | ||||||
|  | 	return false | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | flags.get_flag_at = function( pos ) | ||||||
|  | 	local node = minetest.get_node( pos ) | ||||||
|  | 	if node.name ~= "pirate_flag:upper_mast" then | ||||||
|  | 		return nil | ||||||
|  | 	end | ||||||
|  | 	local meta = minetest.get_meta( pos ) | ||||||
|  | 	local flag_name = meta:get_string("flag_name") | ||||||
|  | 	if flag_name ~= "" then | ||||||
|  | 		return flag_name | ||||||
|  | 	end | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | -- Returns the wind strength at pos. | ||||||
|  | -- Can be overwritten by mods. | ||||||
|  | flags.get_wind = function( pos ) | ||||||
|  | 	-- The default wind function ignores pos. | ||||||
|  | 	-- Returns a wind between ca. 0 and 55 | ||||||
|  | 	local coords = { x = os.time( ) % 65535, y = 0 } | ||||||
|  | 	local cur_wind | ||||||
|  | 	if old_get2d then | ||||||
|  | 		cur_wind = wind_noise:get2d(coords) | ||||||
|  | 	else | ||||||
|  | 		cur_wind = wind_noise:get_2d(coords) | ||||||
|  | 	end | ||||||
|  | 	cur_wind = cur_wind * 30 + 30 | ||||||
|  | 	return cur_wind | ||||||
|  | end | ||||||
							
								
								
									
										6
									
								
								mod.conf
									
										
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,6 @@ | ||||||
|  | name = pirate_flag | ||||||
|  | title = Pirate Flags | ||||||
|  | author = Anonymous | ||||||
|  | optional_depends = default, screwdriver | ||||||
|  | description = Seven flags based on Generic flags | ||||||
|  | 
 | ||||||
							
								
								
									
										22
									
								
								models/flags_mast_lower.mtl
									
										
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,22 @@ | ||||||
|  | # Blender MTL File: 'None' | ||||||
|  | # Material Count: 2 | ||||||
|  | 
 | ||||||
|  | newmtl m_0 | ||||||
|  | Ns 225.000000 | ||||||
|  | Ka 1.000000 1.000000 1.000000 | ||||||
|  | Kd 0.800000 0.800000 0.800000 | ||||||
|  | Ks 0.500000 0.500000 0.500000 | ||||||
|  | Ke 0.000000 0.000000 0.000000 | ||||||
|  | Ni 1.450000 | ||||||
|  | d 1.000000 | ||||||
|  | illum 2 | ||||||
|  | 
 | ||||||
|  | newmtl m_1 | ||||||
|  | Ns 225.000000 | ||||||
|  | Ka 1.000000 1.000000 1.000000 | ||||||
|  | Kd 0.800000 0.800000 0.800000 | ||||||
|  | Ks 0.500000 0.500000 0.500000 | ||||||
|  | Ke 0.000000 0.000000 0.000000 | ||||||
|  | Ni 1.450000 | ||||||
|  | d 1.000000 | ||||||
|  | illum 2 | ||||||
							
								
								
									
										121
									
								
								models/flags_mast_lower.obj
									
										
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,121 @@ | ||||||
|  | # Blender v3.0.0 OBJ File: '' | ||||||
|  | # www.blender.org | ||||||
|  | mtllib flags_mast_lower.mtl | ||||||
|  | o cube.006_cube.003 | ||||||
|  | v -0.062500 0.500000 0.125000 | ||||||
|  | v 0.062500 0.500000 -0.125000 | ||||||
|  | v -0.062500 0.500000 -0.125000 | ||||||
|  | v 0.062500 0.500000 0.125000 | ||||||
|  | v 0.062500 -0.500000 -0.125000 | ||||||
|  | v -0.062500 -0.500000 -0.125000 | ||||||
|  | v 0.062500 -0.500000 0.125000 | ||||||
|  | v -0.062500 -0.500000 0.125000 | ||||||
|  | v 0.062500 0.500000 0.062500 | ||||||
|  | v 0.125000 0.500000 -0.062500 | ||||||
|  | v 0.062500 0.500000 -0.062500 | ||||||
|  | v 0.125000 0.500000 0.062500 | ||||||
|  | v 0.125000 -0.500000 -0.062500 | ||||||
|  | v 0.062500 -0.500000 -0.062500 | ||||||
|  | v 0.125000 -0.500000 0.062500 | ||||||
|  | v 0.062500 -0.500000 0.062500 | ||||||
|  | v -0.125000 0.500000 0.062500 | ||||||
|  | v -0.062500 0.500000 -0.062500 | ||||||
|  | v -0.125000 0.500000 -0.062500 | ||||||
|  | v -0.062500 0.500000 0.062500 | ||||||
|  | v -0.062500 -0.500000 -0.062500 | ||||||
|  | v -0.125000 -0.500000 -0.062500 | ||||||
|  | v -0.125000 -0.500000 0.062500 | ||||||
|  | v -0.062500 -0.500000 0.062500 | ||||||
|  | vt 0.000000 0.000000 | ||||||
|  | vt 0.000000 0.000000 | ||||||
|  | vt 0.000000 0.000000 | ||||||
|  | vt 0.000000 0.000000 | ||||||
|  | vt 0.000000 0.000000 | ||||||
|  | vt 0.000000 0.000000 | ||||||
|  | vt 0.000000 0.000000 | ||||||
|  | vt 0.000000 0.000000 | ||||||
|  | vt 0.000000 0.000000 | ||||||
|  | vt 0.000000 0.000000 | ||||||
|  | vt 0.000000 0.000000 | ||||||
|  | vt 0.000000 0.000000 | ||||||
|  | vt 0.000000 0.000000 | ||||||
|  | vt 0.125000 0.000000 | ||||||
|  | vt 0.125000 1.000000 | ||||||
|  | vt 0.000000 1.000000 | ||||||
|  | vt 0.562500 0.000000 | ||||||
|  | vt 0.625000 0.000000 | ||||||
|  | vt 0.625000 1.000000 | ||||||
|  | vt 0.562500 1.000000 | ||||||
|  | vt 0.875000 0.000000 | ||||||
|  | vt 1.000000 0.000000 | ||||||
|  | vt 1.000000 1.000000 | ||||||
|  | vt 0.875000 1.000000 | ||||||
|  | vt 0.375000 0.000000 | ||||||
|  | vt 0.437500 0.000000 | ||||||
|  | vt 0.437500 1.000000 | ||||||
|  | vt 0.375000 1.000000 | ||||||
|  | vt 0.062500 0.000000 | ||||||
|  | vt 0.125000 0.000000 | ||||||
|  | vt 0.125000 1.000000 | ||||||
|  | vt 0.062500 1.000000 | ||||||
|  | vt 0.250000 0.000000 | ||||||
|  | vt 0.375000 0.000000 | ||||||
|  | vt 0.375000 1.000000 | ||||||
|  | vt 0.250000 1.000000 | ||||||
|  | vt 0.875000 0.000000 | ||||||
|  | vt 0.937500 0.000000 | ||||||
|  | vt 0.937500 1.000000 | ||||||
|  | vt 0.875000 1.000000 | ||||||
|  | vt 0.062500 0.000000 | ||||||
|  | vt 0.125000 0.000000 | ||||||
|  | vt 0.125000 1.000000 | ||||||
|  | vt 0.062500 1.000000 | ||||||
|  | vt 0.875000 0.000000 | ||||||
|  | vt 0.937500 0.000000 | ||||||
|  | vt 0.937500 1.000000 | ||||||
|  | vt 0.875000 1.000000 | ||||||
|  | vt 0.625000 0.000000 | ||||||
|  | vt 0.750000 0.000000 | ||||||
|  | vt 0.750000 1.000000 | ||||||
|  | vt 0.625000 1.000000 | ||||||
|  | vt 0.437500 0.250000 | ||||||
|  | vt 0.562500 0.250000 | ||||||
|  | vt 0.562500 0.500000 | ||||||
|  | vt 0.437500 0.500000 | ||||||
|  | vt 0.375000 0.312500 | ||||||
|  | vt 0.437500 0.312500 | ||||||
|  | vt 0.437500 0.437500 | ||||||
|  | vt 0.375000 0.437500 | ||||||
|  | vt 0.562500 0.312500 | ||||||
|  | vt 0.625000 0.312500 | ||||||
|  | vt 0.625000 0.437500 | ||||||
|  | vt 0.562500 0.437500 | ||||||
|  | vn 0.0000 1.0000 0.0000 | ||||||
|  | vn 0.0000 0.0000 -1.0000 | ||||||
|  | vn 1.0000 0.0000 0.0000 | ||||||
|  | vn 0.0000 -0.0000 1.0000 | ||||||
|  | vn -1.0000 0.0000 0.0000 | ||||||
|  | vn 0.0000 -1.0000 -0.0000 | ||||||
|  | usemtl m_0 | ||||||
|  | s off | ||||||
|  | f 1/1/1 2/2/1 3/3/1 | ||||||
|  | f 1/1/1 4/4/1 2/2/1 | ||||||
|  | f 9/5/1 10/6/1 11/7/1 | ||||||
|  | f 9/5/1 12/8/1 10/6/1 | ||||||
|  | f 17/9/1 18/10/1 19/11/1 | ||||||
|  | f 17/9/1 20/12/1 18/10/1 | ||||||
|  | s 1 | ||||||
|  | f 5/13/2 6/14/2 3/15/2 2/16/2 | ||||||
|  | f 7/17/3 5/18/3 2/19/3 4/20/3 | ||||||
|  | f 8/21/4 7/22/4 4/23/4 1/24/4 | ||||||
|  | f 6/25/5 8/26/5 1/27/5 3/28/5 | ||||||
|  | f 13/29/2 14/30/2 11/31/2 10/32/2 | ||||||
|  | f 15/33/3 13/34/3 10/35/3 12/36/3 | ||||||
|  | f 16/37/4 15/38/4 12/39/4 9/40/4 | ||||||
|  | f 21/41/2 22/42/2 19/43/2 18/44/2 | ||||||
|  | f 23/45/4 24/46/4 20/47/4 17/48/4 | ||||||
|  | f 22/49/5 23/50/5 17/51/5 19/52/5 | ||||||
|  | usemtl m_1 | ||||||
|  | f 6/53/6 5/54/6 7/55/6 8/56/6 | ||||||
|  | f 14/57/6 13/58/6 15/59/6 16/60/6 | ||||||
|  | f 22/61/6 21/62/6 24/63/6 23/64/6 | ||||||
							
								
								
									
										171
									
								
								models/flags_mast_upper.obj
									
										
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,171 @@ | ||||||
|  | # Blender v3.0.0 OBJ File: '' | ||||||
|  | # www.blender.org | ||||||
|  | mtllib flags_mast_upper.mtl | ||||||
|  | o cube.006_cube.008 | ||||||
|  | v 0.125000 1.437500 -0.125000 | ||||||
|  | v -0.125000 1.437500 -0.125000 | ||||||
|  | v -0.125000 1.500000 -0.125000 | ||||||
|  | v 0.125000 1.500000 -0.125000 | ||||||
|  | v 0.125000 1.437500 0.125000 | ||||||
|  | v 0.125000 1.500000 0.125000 | ||||||
|  | v -0.125000 1.437500 0.125000 | ||||||
|  | v -0.125000 1.500000 0.125000 | ||||||
|  | v 0.187500 1.312500 -0.187500 | ||||||
|  | v -0.187500 1.312500 -0.187500 | ||||||
|  | v -0.187500 1.437500 -0.187500 | ||||||
|  | v 0.187500 1.437500 -0.187500 | ||||||
|  | v 0.187500 1.312500 0.187500 | ||||||
|  | v 0.187500 1.437500 0.187500 | ||||||
|  | v -0.187500 1.312500 0.187500 | ||||||
|  | v -0.187500 1.437500 0.187500 | ||||||
|  | v 0.125000 -0.500000 -0.062500 | ||||||
|  | v 0.062500 -0.500000 -0.062500 | ||||||
|  | v 0.062500 1.312500 -0.062500 | ||||||
|  | v 0.125000 1.312500 -0.062500 | ||||||
|  | v 0.125000 -0.500000 0.062500 | ||||||
|  | v 0.125000 1.312500 0.062500 | ||||||
|  | v 0.062500 -0.500000 0.062500 | ||||||
|  | v 0.062500 1.312500 0.062500 | ||||||
|  | v 0.062500 -0.500000 -0.125000 | ||||||
|  | v -0.062500 -0.500000 -0.125000 | ||||||
|  | v -0.062500 1.312500 -0.125000 | ||||||
|  | v 0.062500 1.312500 -0.125000 | ||||||
|  | v 0.062500 -0.500000 0.125000 | ||||||
|  | v 0.062500 1.312500 0.125000 | ||||||
|  | v -0.062500 -0.500000 0.125000 | ||||||
|  | v -0.062500 1.312500 0.125000 | ||||||
|  | v -0.062500 -0.500000 -0.062500 | ||||||
|  | v -0.125000 -0.500000 -0.062500 | ||||||
|  | v -0.125000 1.312500 -0.062500 | ||||||
|  | v -0.062500 1.312500 -0.062500 | ||||||
|  | v -0.125000 -0.500000 0.062500 | ||||||
|  | v -0.062500 -0.500000 0.062500 | ||||||
|  | v -0.062500 1.312500 0.062500 | ||||||
|  | v -0.125000 1.312500 0.062500 | ||||||
|  | vt 0.000000 0.000000 | ||||||
|  | vt 0.187500 0.000000 | ||||||
|  | vt 0.187500 0.062500 | ||||||
|  | vt 0.000000 0.062500 | ||||||
|  | vt 0.562500 0.000000 | ||||||
|  | vt 0.750000 0.000000 | ||||||
|  | vt 0.750000 0.062500 | ||||||
|  | vt 0.562500 0.062500 | ||||||
|  | vt 0.812500 0.000000 | ||||||
|  | vt 1.000000 0.000000 | ||||||
|  | vt 1.000000 0.062500 | ||||||
|  | vt 0.812500 0.062500 | ||||||
|  | vt 0.250000 0.000000 | ||||||
|  | vt 0.437500 0.000000 | ||||||
|  | vt 0.437500 0.062500 | ||||||
|  | vt 0.250000 0.062500 | ||||||
|  | vt 0.000000 0.000000 | ||||||
|  | vt 0.250000 0.000000 | ||||||
|  | vt 0.250000 0.125000 | ||||||
|  | vt 0.000000 0.125000 | ||||||
|  | vt 0.500000 0.000000 | ||||||
|  | vt 0.750000 0.000000 | ||||||
|  | vt 0.750000 0.125000 | ||||||
|  | vt 0.500000 0.125000 | ||||||
|  | vt 0.750000 0.000000 | ||||||
|  | vt 1.000000 0.000000 | ||||||
|  | vt 1.000000 0.125000 | ||||||
|  | vt 0.750000 0.125000 | ||||||
|  | vt 0.500000 0.000000 | ||||||
|  | vt 0.500000 0.125000 | ||||||
|  | vt 0.062500 0.000000 | ||||||
|  | vt 0.125000 0.000000 | ||||||
|  | vt 0.125000 1.000000 | ||||||
|  | vt 0.062500 1.000000 | ||||||
|  | vt 0.250000 0.000000 | ||||||
|  | vt 0.375000 0.000000 | ||||||
|  | vt 0.375000 1.000000 | ||||||
|  | vt 0.250000 1.000000 | ||||||
|  | vt 0.875000 0.000000 | ||||||
|  | vt 0.937500 0.000000 | ||||||
|  | vt 0.937500 1.000000 | ||||||
|  | vt 0.875000 1.000000 | ||||||
|  | vt 0.000000 0.000000 | ||||||
|  | vt 0.125000 0.000000 | ||||||
|  | vt 0.125000 1.000000 | ||||||
|  | vt 0.000000 1.000000 | ||||||
|  | vt 0.562500 0.000000 | ||||||
|  | vt 0.625000 0.000000 | ||||||
|  | vt 0.625000 1.000000 | ||||||
|  | vt 0.562500 1.000000 | ||||||
|  | vt 0.875000 0.000000 | ||||||
|  | vt 1.000000 0.000000 | ||||||
|  | vt 1.000000 1.000000 | ||||||
|  | vt 0.875000 1.000000 | ||||||
|  | vt 0.375000 0.000000 | ||||||
|  | vt 0.437500 0.000000 | ||||||
|  | vt 0.437500 1.000000 | ||||||
|  | vt 0.375000 1.000000 | ||||||
|  | vt 0.062500 0.000000 | ||||||
|  | vt 0.125000 0.000000 | ||||||
|  | vt 0.125000 1.000000 | ||||||
|  | vt 0.062500 1.000000 | ||||||
|  | vt 0.875000 0.000000 | ||||||
|  | vt 0.937500 0.000000 | ||||||
|  | vt 0.937500 1.000000 | ||||||
|  | vt 0.875000 1.000000 | ||||||
|  | vt 0.625000 0.000000 | ||||||
|  | vt 0.750000 0.000000 | ||||||
|  | vt 0.750000 1.000000 | ||||||
|  | vt 0.625000 1.000000 | ||||||
|  | vt 0.375000 0.562500 | ||||||
|  | vt 0.562500 0.562500 | ||||||
|  | vt 0.562500 0.750000 | ||||||
|  | vt 0.375000 0.750000 | ||||||
|  | vt 0.312500 0.500000 | ||||||
|  | vt 0.562500 0.500000 | ||||||
|  | vt 0.562500 0.750000 | ||||||
|  | vt 0.312500 0.750000 | ||||||
|  | vt 0.437500 0.250000 | ||||||
|  | vt 0.687500 0.250000 | ||||||
|  | vt 0.687500 0.500000 | ||||||
|  | vt 0.437500 0.500000 | ||||||
|  | vt 0.375000 0.312500 | ||||||
|  | vt 0.437500 0.312500 | ||||||
|  | vt 0.437500 0.437500 | ||||||
|  | vt 0.375000 0.437500 | ||||||
|  | vt 0.437500 0.250000 | ||||||
|  | vt 0.562500 0.250000 | ||||||
|  | vt 0.562500 0.500000 | ||||||
|  | vt 0.437500 0.500000 | ||||||
|  | vt 0.562500 0.312500 | ||||||
|  | vt 0.625000 0.312500 | ||||||
|  | vt 0.625000 0.437500 | ||||||
|  | vt 0.562500 0.437500 | ||||||
|  | vn 0.0000 0.0000 -1.0000 | ||||||
|  | vn 1.0000 0.0000 0.0000 | ||||||
|  | vn 0.0000 -0.0000 1.0000 | ||||||
|  | vn -1.0000 0.0000 0.0000 | ||||||
|  | vn 0.0000 1.0000 0.0000 | ||||||
|  | vn 0.0000 -1.0000 0.0000 | ||||||
|  | usemtl m_0 | ||||||
|  | s 1 | ||||||
|  | f 1/1/1 2/2/1 3/3/1 4/4/1 | ||||||
|  | f 5/5/2 1/6/2 4/7/2 6/8/2 | ||||||
|  | f 7/9/3 5/10/3 6/11/3 8/12/3 | ||||||
|  | f 2/13/4 7/14/4 8/15/4 3/16/4 | ||||||
|  | f 9/17/1 10/18/1 11/19/1 12/20/1 | ||||||
|  | f 13/21/2 9/22/2 12/23/2 14/24/2 | ||||||
|  | f 15/25/3 13/26/3 14/27/3 16/28/3 | ||||||
|  | f 10/18/4 15/29/4 16/30/4 11/19/4 | ||||||
|  | f 17/31/1 18/32/1 19/33/1 20/34/1 | ||||||
|  | f 21/35/2 17/36/2 20/37/2 22/38/2 | ||||||
|  | f 23/39/3 21/40/3 22/41/3 24/42/3 | ||||||
|  | f 25/43/1 26/44/1 27/45/1 28/46/1 | ||||||
|  | f 29/47/2 25/48/2 28/49/2 30/50/2 | ||||||
|  | f 31/51/3 29/52/3 30/53/3 32/54/3 | ||||||
|  | f 26/55/4 31/56/4 32/57/4 27/58/4 | ||||||
|  | f 33/59/1 34/60/1 35/61/1 36/62/1 | ||||||
|  | f 37/63/3 38/64/3 39/65/3 40/66/3 | ||||||
|  | f 34/67/4 37/68/4 40/69/4 35/70/4 | ||||||
|  | usemtl m_1 | ||||||
|  | f 8/71/5 6/72/5 4/73/5 3/74/5 | ||||||
|  | f 16/75/5 14/76/5 12/77/5 11/78/5 | ||||||
|  | f 10/79/6 9/80/6 13/81/6 15/82/6 | ||||||
|  | f 18/83/6 17/84/6 21/85/6 23/86/6 | ||||||
|  | f 26/87/6 25/88/6 29/89/6 31/90/6 | ||||||
|  | f 34/91/6 33/92/6 38/93/6 37/94/6 | ||||||
							
								
								
									
										
											BIN
										
									
								
								models/flags_wavingflag.b3d
									
										
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								screenshot_20221024_090525.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 880 KiB | 
							
								
								
									
										6
									
								
								settingtypes.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,6 @@ | ||||||
|  | 
 | ||||||
|  | name_flags (Enable types flags) bool true | ||||||
|  | 
 | ||||||
|  | default_flag (Default flag) string white | ||||||
|  | 
 | ||||||
|  | flagpole_material (Flagpole material) string default:steel_ingot | ||||||
							
								
								
									
										
											BIN
										
									
								
								sounds/flagwave1.ogg
									
										
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								sounds/flagwave2.ogg
									
										
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								sounds/flagwave3.ogg
									
										
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								textures/flag_anarcho.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.3 KiB | 
							
								
								
									
										
											BIN
										
									
								
								textures/flag_anarchy.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 13 KiB | 
							
								
								
									
										
											BIN
										
									
								
								textures/flag_anonymous.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 15 KiB | 
							
								
								
									
										
											BIN
										
									
								
								textures/flag_black.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.9 KiB | 
							
								
								
									
										
											BIN
										
									
								
								textures/flag_blue.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.9 KiB | 
							
								
								
									
										
											BIN
										
									
								
								textures/flag_brown.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.9 KiB | 
							
								
								
									
										
											BIN
										
									
								
								textures/flag_cyan.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.9 KiB | 
							
								
								
									
										
											BIN
										
									
								
								textures/flag_dark_gray.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.9 KiB | 
							
								
								
									
										
											BIN
										
									
								
								textures/flag_dark_green.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.9 KiB | 
							
								
								
									
										
											BIN
										
									
								
								textures/flag_gray.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.9 KiB | 
							
								
								
									
										
											BIN
										
									
								
								textures/flag_green.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.9 KiB | 
							
								
								
									
										
											BIN
										
									
								
								textures/flag_guyfox.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 9.6 KiB | 
							
								
								
									
										
											BIN
										
									
								
								textures/flag_jollyroger.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 23 KiB | 
							
								
								
									
										
											BIN
										
									
								
								textures/flag_magenta.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.9 KiB | 
							
								
								
									
										
											BIN
										
									
								
								textures/flag_makhno.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 12 KiB | 
							
								
								
									
										
											BIN
										
									
								
								textures/flag_orange.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.9 KiB | 
							
								
								
									
										
											BIN
										
									
								
								textures/flag_pink.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.9 KiB | 
							
								
								
									
										
											BIN
										
									
								
								textures/flag_pirate.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 22 KiB | 
							
								
								
									
										
											BIN
										
									
								
								textures/flag_purple.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.9 KiB | 
							
								
								
									
										
											BIN
										
									
								
								textures/flag_red.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.9 KiB | 
							
								
								
									
										
											BIN
										
									
								
								textures/flag_white.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.7 KiB | 
							
								
								
									
										
											BIN
										
									
								
								textures/flag_yellow.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.9 KiB | 
							
								
								
									
										
											BIN
										
									
								
								textures/flags_baremetal.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 293 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/flags_pole_bottom_inv.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 169 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/flags_pole_hidden1_inv.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 192 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/flags_pole_hidden2_inv.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 118 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/flags_pole_top_inv.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 900 B |