Compare commits
82 commits
Author | SHA1 | Date | |
---|---|---|---|
|
d4455b31f0 | ||
|
c7e39fb2db | ||
|
47a9fc050c | ||
|
b04cc0ece8 | ||
|
7ea3076ba2 | ||
|
87d4e305fe | ||
|
12de6a2365 | ||
|
5baf4eea28 | ||
|
3fcbc8d793 | ||
|
97e66600fd | ||
|
f58488c715 | ||
|
249ca5d861 | ||
|
efc157492a | ||
|
fba6030272 | ||
|
16613e636c | ||
|
0bf701f451 | ||
|
55bb184ea6 | ||
|
a0adbb6c06 | ||
|
6936be82d0 | ||
|
e774da4fd4 | ||
|
e1b6f01687 | ||
|
a81e55d781 | ||
|
343f664534 | ||
|
b06fff649a | ||
|
1985c4d921 | ||
|
02b3118cfc | ||
|
39924e6ab0 | ||
|
c676c63634 | ||
|
17a1520487 | ||
|
e1ef02f97e | ||
|
6c6e1d453d | ||
|
947cc219eb | ||
|
7a2fd7d755 | ||
|
e71ade5e45 | ||
|
3c559f429f | ||
|
acd3cd1d29 | ||
|
860ec0017c | ||
|
c7a4d879e0 | ||
|
2a002a736a | ||
|
adcfdafbec | ||
|
fe49b2caa8 | ||
|
f30176ccb1 | ||
|
e07c633679 | ||
|
bbb59d9dce | ||
|
8fd4f9661e | ||
|
5010445428 | ||
|
842c1bce44 | ||
|
0a0ccd49c3 | ||
|
4a890ef5ed | ||
|
a295c4c028 | ||
|
70721eceb4 | ||
|
76b5bd0544 | ||
|
b003e8366a | ||
|
c291ffccce | ||
|
0bf02d3245 | ||
|
cff6a2f9c1 | ||
|
a570ed7c36 | ||
|
7698ceebd0 | ||
|
889744fc7a | ||
|
1fe38606b4 | ||
|
88ce6844ff | ||
|
ae0929a6dd | ||
|
f4964faaca | ||
|
5ba46824ad | ||
|
901722ca97 | ||
|
b4199d580a | ||
|
61f1b471d0 | ||
|
72f3b04842 | ||
|
2e704ca392 | ||
|
858610b8ee | ||
|
7dc6217492 | ||
|
71853506ef | ||
|
201db6bd8a | ||
|
52097be084 | ||
|
a729d0ce3b | ||
|
3cc23ae664 | ||
|
42afe00827 | ||
|
7035943fc4 | ||
|
662bc328f4 | ||
|
dcf0b79420 | ||
|
a3b6fedf64 | ||
|
11f3fb805b |
64
API.md
Normal file
|
@ -0,0 +1,64 @@
|
|||
# `pride_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
|
||||
|
||||
### `pride_flags.add_flag(name)`
|
||||
|
||||
Add a new flag to the game. `name` is the flag identifier.
|
||||
There *must* exist a texture with the name `prideflag_<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.
|
||||
|
||||
### `pride_flags.get_flags()`
|
||||
|
||||
Returns a list of all available flag identifiers. The flags
|
||||
are sorted by selection order.
|
||||
|
||||
### `pride_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 `pride_flags:upper_mast`.
|
||||
Returns `true` on success and `false` otherwise.
|
||||
|
||||
### `pride_flags.get_flag_at(pos)`
|
||||
|
||||
Returns the currently used flag at the upper mast node at position `pos`.
|
||||
The node at `pos` *must* be `pride_flags:upper_mast`.
|
||||
Returns a string on success and `nil` otherwise.
|
||||
|
||||
### `pride_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
|
94
LICENSE.txt
Normal file
|
@ -0,0 +1,94 @@
|
|||
# Licensing and credits for Pride Flags Mod
|
||||
|
||||
Source Code License
|
||||
----------------------------------------------------------
|
||||
|
||||
GNU Lesser General Public License v3 (LGPL-3.0)
|
||||
|
||||
Copyright (c) 2022, 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/pride_flags_mast_lower.obj
|
||||
by sorcerykid
|
||||
|
||||
/models/pride_flags_mast_upper.obj
|
||||
by sorcerykid
|
||||
|
||||
/models/pride_flags_wavingflag.b3d
|
||||
by sorcerykid
|
||||
|
||||
/textures/pride_flags_baremetal.png
|
||||
by sorcerykid
|
||||
|
||||
/sounds/pride_flags_flagwave1.ogg
|
||||
by Chelly01
|
||||
obtained from https://freesound.org/people/Chelly01/sounds/541088/
|
||||
modified by sorcerykid
|
||||
|
||||
/sounds/pride_flags_flagwave2.ogg
|
||||
by Chelly01
|
||||
obtained from https://freesound.org/people/Chelly01/sounds/541088/
|
||||
modified by sorcerykid
|
||||
|
||||
/sounds/pride_flags_flagwave3.ogg
|
||||
by Chelly01
|
||||
obtained from https://freesound.org/people/Chelly01/sounds/541088/
|
||||
modified by sorcerykid
|
||||
|
||||
Pride flags:
|
||||
All pride flags have a name like "/textures/prideflag_<NAME>.png",
|
||||
where <NAME> is the pride flag name. For example, the rainbow flag
|
||||
is "/textures/prideflag_rainbow.png". These are the current pride flags:
|
||||
|
||||
asexual, bisexual, rainbow, gendercreative, genderfluid, genderqueer,
|
||||
lesbian, nonbinary, pansexual, polysexual, transgender:
|
||||
by sorcerykid
|
||||
|
||||
aromantic, grayromantic, demiromantic, graysexual, demisexual, omnisexual,
|
||||
homoromantic, biromantic, panromantic, polyromantic, omniromantic,
|
||||
vincian, agender, demigender, androgyne, multigender,
|
||||
intersex, polyamorous, queer, maverique, neutrois, multigender, polygender:
|
||||
by Wuzzy
|
||||
|
||||
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/
|
202
README.txt
|
@ -1,32 +1,93 @@
|
|||
Pride Flags Mod v1.0
|
||||
By Leslie E. Krause
|
||||
Pride Flags Mod v2.2.0
|
||||
By Leslie E. Krause and Wuzzy
|
||||
|
||||
Pride Flags adds a variety of eight animated flags to celebrate pride in Minetest.
|
||||
Pride Flags adds a variety of animated flags to celebrate Pride in Luanti.
|
||||
|
||||
The flags and poles are non-craftable and intended for placement by an administrator in a
|
||||
conspicuous location, such as atop a building or along a promenade.
|
||||
This adds two blocks:
|
||||
|
||||
/giveme pride_flags:mast_lower
|
||||
/giveme pride_flags:mast_upper
|
||||
* Flag Pole: For the lower section
|
||||
* Flag Pole with Flag: For the top of the flag pole with a flag attached.
|
||||
Note: It occupies 3 blocks vertically.
|
||||
|
||||
By default, a rainbow pride flag will appear when the upper mast is placed. Right-click
|
||||
the node to select a different flag.
|
||||
Initially, the rainbow pride flag will appear when the Flag Pole with Flag is placed.
|
||||
Use the 'place' or 'punch' key while pointing to the flag pole to select a different flag.
|
||||
|
||||
There are functions for programmers (see below) to add custom flags as well.
|
||||
|
||||
What are pride flags?
|
||||
---------------------
|
||||
Pride flags are flags created by LGBTQ+ people to represent themselves.
|
||||
The rainbow flag is the most well-known flag and is understood as
|
||||
the symbol for the whole LGBTQ+ community. Additionally, flags for
|
||||
specific groups (like lesbian, bisexual, trans, etc.), exist, too.
|
||||
|
||||
Pride flags can be used by people in that community but also
|
||||
by people outside of it to show support and acceptance, and to
|
||||
spread awareness.
|
||||
|
||||
List of flags
|
||||
--------------------
|
||||
These flags are available:
|
||||
|
||||
* Broader community:
|
||||
* Gay/LGBTQ+ (rainbow flag)
|
||||
* Progress Pride
|
||||
* Orientations (sexual, romantic or other)
|
||||
* Lesbian
|
||||
* Vincian
|
||||
* Sexual orientations
|
||||
* Bisexual
|
||||
* Pansexual
|
||||
* Polysexual
|
||||
* Omnisexual
|
||||
* Asexual
|
||||
* Graysexual
|
||||
* Demisexual
|
||||
* Romantic orientations
|
||||
* Homoromantic
|
||||
* Biromantic
|
||||
* Polyromantic
|
||||
* Panromantic
|
||||
* Omniromantic
|
||||
* Aromantic
|
||||
* Grayromantic
|
||||
* Demiromantic
|
||||
* Gender-related
|
||||
* Genderqueer
|
||||
* Transgender
|
||||
* Androgyne
|
||||
* Demigender
|
||||
* Maverique
|
||||
* Neutrois
|
||||
* Multigender
|
||||
* Polygender
|
||||
* Pangender
|
||||
* Agender
|
||||
* Genderfluid
|
||||
* Sex-related
|
||||
* Intersex
|
||||
* Relationships
|
||||
* Polyamorous
|
||||
* Queer
|
||||
* Queer
|
||||
|
||||
API (for programmers)
|
||||
----------------------
|
||||
This mod has a few helper functions if you're a programmer and want to interface with it.
|
||||
You can add custom flags and more. See `API.md` for a list of all functions.
|
||||
|
||||
Repository
|
||||
----------------------
|
||||
|
||||
Browse source code...
|
||||
https://bitbucket.org/sorcerykid/pride_flags
|
||||
|
||||
Download archive...
|
||||
https://bitbucket.org/sorcerykid/pride_flags/get/master.zip
|
||||
https://bitbucket.org/sorcerykid/pride_flags/get/master.tar.gz
|
||||
https://codeberg.org/Wuzzy/pride_flags
|
||||
|
||||
Compatability
|
||||
----------------------
|
||||
|
||||
Minetest 0.4.15+ required
|
||||
Luanti/Minetest version 5.4.0 or later required.
|
||||
|
||||
(older versions might work, too, but the flag waving sound is buggy)
|
||||
|
||||
Installation
|
||||
----------------------
|
||||
|
@ -34,110 +95,17 @@ Installation
|
|||
1) Unzip the archive into the mods directory of your game.
|
||||
2) Rename the pride_flags-master directory to "pride_flags".
|
||||
|
||||
Source Code License
|
||||
License/Credits
|
||||
----------------------------------------------------------
|
||||
|
||||
GNU Lesser General Public License v3 (LGPL-3.0)
|
||||
This mod is free software.
|
||||
The source code is licensed under the LGPLv3.
|
||||
The media is licensed under CC BY-SA 3.0.
|
||||
|
||||
Copyright (c) 2022, Leslie E. Krause (leslie@searstower.org)
|
||||
See LICENSE.txt for details and credits.
|
||||
|
||||
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.
|
||||
Translation credits:
|
||||
|
||||
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-2.1.html
|
||||
|
||||
|
||||
Multimedia License (textures, sounds, and models)
|
||||
----------------------------------------------------------
|
||||
|
||||
Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
|
||||
|
||||
/models/mast_lower.obj
|
||||
by sorcerykid
|
||||
|
||||
/models/mast_upper.obj
|
||||
by sorcerykid
|
||||
|
||||
/models/wavingflag.b3d
|
||||
by sorcerykid
|
||||
|
||||
/textures/default_baremetal.png
|
||||
by sorcerykid
|
||||
|
||||
/textures/prideflag_asexual.png
|
||||
by sorcerykid
|
||||
|
||||
/textures/prideflag_bisexual.png
|
||||
by sorcerykid
|
||||
|
||||
/textures/prideflag_rainbow.png
|
||||
by sorcerykid
|
||||
|
||||
/textures/prideflag_gendercreative.png
|
||||
by sorcerykid
|
||||
|
||||
/textures/prideflag_genderfluid.png
|
||||
by sorcerykid
|
||||
|
||||
/textures/prideflag_genderqueer.png
|
||||
by sorcerykid
|
||||
|
||||
/textures/prideflag_lesbian.png
|
||||
by sorcerykid
|
||||
|
||||
/textures/prideflag_nonbinary.png
|
||||
by sorcerykid
|
||||
|
||||
/textures/prideflag_pansexual.png
|
||||
by sorcerykid
|
||||
|
||||
/textures/prideflag_polysexual.png
|
||||
by sorcerykid
|
||||
|
||||
/textures/prideflag_transgender.png
|
||||
by sorcerykid
|
||||
|
||||
/sounds/flagwave1.ogg
|
||||
by Chelly01
|
||||
obtained from https://freesound.org/people/Chelly01/sounds/541088/
|
||||
modified by sorcerykid
|
||||
|
||||
/sounds/flagwave2.ogg
|
||||
by Chelly01
|
||||
obtained from https://freesound.org/people/Chelly01/sounds/541088/
|
||||
modified by sorcerykid
|
||||
|
||||
/sounds/flagwave3.ogg
|
||||
by Chelly01
|
||||
obtained from https://freesound.org/people/Chelly01/sounds/541088/
|
||||
modified by sorcerykid
|
||||
|
||||
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/
|
||||
* German: Wuzzy
|
||||
* French: Z-Master
|
||||
* Spanish: megustanlosfrijoles
|
||||
|
|
650
init.lua
|
@ -1,52 +1,188 @@
|
|||
--------------------------------------------------------
|
||||
-- Minetest :: Pride Flags Mod (pride_flags)
|
||||
-- Luanti :: Pride Flags Mod (pride_flags)
|
||||
--
|
||||
-- See README.txt for licensing and other information.
|
||||
-- Copyright (c) 2022, Leslie E. Krause
|
||||
--
|
||||
-- ./games/minetest_game/mods/pride_flags/init.lua
|
||||
-- Copyright (c) 2022, Leslie E. Krause and Wuzzy
|
||||
--------------------------------------------------------
|
||||
|
||||
pride_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 Luanti 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
|
||||
|
||||
local flag_list = { "rainbow", "lesbian", "bisexual", "transgender", "genderqueer", "nonbinary", "pansexual", "asexual" }
|
||||
-- This flag is used as the default or fallback in case of error/missing data
|
||||
local DEFAULT_FLAG = "rainbow"
|
||||
|
||||
-- Flag list for the old number-based storing of flags, used up to
|
||||
-- 8fd4f9661e123bc84c0499c4809537e8aeb24c3b.
|
||||
-- DO NOT CHANGE THIS LIST!
|
||||
local legacy_flag_list = {
|
||||
"rainbow", "lesbian", "bisexual", "transgender", "genderqueer", "nonbinary", "pansexual", "asexual",
|
||||
"vincian", "polysexual", "omnisexual", "graysexual", "demisexual", "homoromantic", "biromantic",
|
||||
"polyromantic", "panromantic", "omniromantic", "aromantic", "grayromantic", "demiromantic",
|
||||
"androgyne", "demigender", "maverique", "neutrois", "multigender", "polygender", "pangender", "agender",
|
||||
"genderfluid", "intersex", "polyamorous", "queer", "demigirl", "demiboy", "bigender", "trigender",
|
||||
}
|
||||
local flag_list = {
|
||||
-- broader community
|
||||
"rainbow", -- rainbow flag / LGBTQ+ Pride flag / Gay Pride flag
|
||||
"progress", -- Progress Pride
|
||||
-- orientations (general)
|
||||
"lesbian", "vincian",
|
||||
-- sexual orientations
|
||||
"bisexual", "pansexual", "polysexual", "omnisexual", -- m-spec
|
||||
"asexual", "graysexual", "demisexual", -- a-spec
|
||||
-- romantic orientations
|
||||
"homoromantic",
|
||||
"biromantic", "polyromantic", "panromantic", "omniromantic", -- m-spec
|
||||
"aromantic", "grayromantic", "demiromantic", -- a-spec
|
||||
-- gender-related
|
||||
---- umbrella terms
|
||||
"transgender", "genderqueer", "nonbinary",
|
||||
---- identities that refer to 0 or multiple genders
|
||||
"multigender", "polygender", "pangender",
|
||||
"agender", "bigender", "trigender",
|
||||
---- identities that refer to a specific gender
|
||||
"demigender", "demigirl", "demiboy",
|
||||
"androgyne", "maverique", "neutrois",
|
||||
---- genderfluid
|
||||
"genderfluid",
|
||||
-- sex-related
|
||||
"intersex",
|
||||
-- relationship
|
||||
"polyamorous",
|
||||
-- queer
|
||||
"queer",}
|
||||
|
||||
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
|
||||
|
||||
local S
|
||||
if minetest.get_translator then
|
||||
S = minetest.get_translator("pride_flags")
|
||||
else
|
||||
S = function(s) return s 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 ~= "pride_flags:upper_mast" and node.name ~= "ignore" then
|
||||
minetest.log("action", "[pride_flags] Orphan flag entity removed at "..minetest.pos_to_string(pos, 1))
|
||||
self.object:remove( )
|
||||
return true
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
minetest.register_entity( "pride_flags:wavingflag", {
|
||||
initial_properties = {
|
||||
physical = false,
|
||||
visual = "mesh",
|
||||
visual_size = { x = 8.5, y = 8.5 },
|
||||
collisionbox = { -0.1, -0.85, -0.1, 0.1, 0.85, 0.1 },
|
||||
collisionbox = { 0, 0, 0, 0, 0, 0 },
|
||||
backface_culling = false,
|
||||
pointable = false,
|
||||
mesh = "wavingflag.b3d",
|
||||
mesh = "pride_flags_wavingflag.b3d",
|
||||
textures = { "prideflag_rainbow.png" },
|
||||
use_texture_alpha = false,
|
||||
},
|
||||
|
||||
on_activate = function ( self, staticdata, dtime )
|
||||
self:reset_animation( math.random( 1, 50 ) ) -- random starting frame to desynchronize multiple flags
|
||||
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 )
|
||||
self.flag_idx = data.flag_idx
|
||||
if data.flag_name then
|
||||
self.flag_name = data.flag_name
|
||||
else
|
||||
-- Convert legacy flag number to flag name
|
||||
local flag_idx = data.flag_idx
|
||||
self.flag_name = legacy_flag_list[ flag_idx ]
|
||||
if not self.flag_name then
|
||||
self.flag_name = DEFAULT_FLAG
|
||||
end
|
||||
end
|
||||
self.node_idx = data.node_idx
|
||||
|
||||
if not self.flag_idx or not self.node_idx then
|
||||
if not self.flag_name or not self.node_idx then
|
||||
self.object:remove( )
|
||||
return
|
||||
end
|
||||
self:reset_texture( self.flag_idx )
|
||||
|
||||
self:reset_texture( self.flag_name )
|
||||
|
||||
active_flags[ self.node_idx ] = self.object
|
||||
else
|
||||
self.flag_idx = 1
|
||||
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 == "pride_flags:wavingflag" then
|
||||
if lua.node_idx == self.node_idx then
|
||||
self.object:remove( )
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
end,
|
||||
|
||||
|
@ -60,68 +196,91 @@ minetest.register_entity( "pride_flags:wavingflag", {
|
|||
self.anim_timer = self.anim_timer - dtime
|
||||
|
||||
if self.anim_timer <= 0 then
|
||||
minetest.sound_stop( self.sound_id )
|
||||
self:reset_animation( 1 )
|
||||
if delete_if_orphan( self) then
|
||||
return
|
||||
end
|
||||
self:reset_animation( )
|
||||
end
|
||||
end,
|
||||
|
||||
reset_animation = function ( self, start_frame )
|
||||
local cur_wind = wind_noise:get2d( { x = os.time( ) % 65535, y = 0 } ) * 30 + 30
|
||||
print( cur_wind )
|
||||
reset_animation = function ( self, initial )
|
||||
local pos = self.object:get_pos( )
|
||||
local cur_wind = pride_flags.get_wind( pos )
|
||||
minetest.log("verbose", "[pride_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 = "flagwave1"
|
||||
wave_sound = "pride_flags_flagwave1"
|
||||
elseif cur_wind < 20 then
|
||||
anim_speed = 20 -- 4 cycles
|
||||
wave_sound = "flagwave1"
|
||||
wave_sound = "pride_flags_flagwave1"
|
||||
elseif cur_wind < 40 then
|
||||
anim_speed = 40 -- 8 cycles
|
||||
wave_sound = "flagwave2"
|
||||
wave_sound = "pride_flags_flagwave2"
|
||||
else
|
||||
anim_speed = 80 -- 16 cycles
|
||||
wave_sound = "flagwave3"
|
||||
wave_sound = "pride_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
|
||||
self.object:set_animation( { x = start_frame, y = 575 }, anim_speed, 0, true )
|
||||
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 = ( 576 - start_frame ) / 5 -- default to 115 seconds to reset animation
|
||||
self.anim_timer = 115 + math.random(-10, 10) -- time to reset animation
|
||||
end,
|
||||
|
||||
reset_texture = function ( self, flag_idx )
|
||||
if not flag_idx then
|
||||
self.flag_idx = self.flag_idx % #flag_list + 1 -- this automatically increments
|
||||
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_idx = flag_idx
|
||||
self.flag_name = flag_name
|
||||
end
|
||||
|
||||
local texture = string.format( "prideflag_%s.png", flag_list[ self.flag_idx ] )
|
||||
local texture = string.format( "prideflag_%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_idx = self.flag_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( "pride_flags:lower_mast", {
|
||||
description = "Flag Pole",
|
||||
description = S("Flag Pole"),
|
||||
drawtype = "mesh",
|
||||
paramtype = "light",
|
||||
mesh = "mast_lower.obj",
|
||||
mesh = "pride_flags_mast_lower.obj",
|
||||
paramtype2 = "facedir",
|
||||
groups = { cracky = 2, post = 1 },
|
||||
tiles = { "default_baremetal.png", "default_baremetal.png" },
|
||||
groups = { cracky = 1, level = 2 },
|
||||
--sounds = default.node_sound_metal_defaults( ),
|
||||
tiles = { "pride_flags_baremetal.png", "pride_flags_baremetal.png" },
|
||||
wield_image = "pride_flags_pole_bottom_inv.png",
|
||||
inventory_image = "pride_flags_pole_bottom_inv.png",
|
||||
groups = { cracky = 2 },
|
||||
sounds = metal_sounds,
|
||||
is_ground_content = false,
|
||||
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
|
@ -131,18 +290,117 @@ minetest.register_node( "pride_flags:lower_mast", {
|
|||
type = "fixed",
|
||||
fixed = { { -3/32, -1/2, -3/32, 3/32, 1/2, 3/32 } },
|
||||
},
|
||||
|
||||
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.6, z = -0.1 },
|
||||
[1] = { x = -0.1, y = 0.6, z = 0 },
|
||||
[2] = { x = 0, y = 0.6, z = 0.1 },
|
||||
[3] = { x = 0.1, y = 0.6, 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", "[pride_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, "pride_flags: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
|
||||
-- Convert legacy flag number to flag name
|
||||
local flag_idx = meta:get_int("flag_idx")
|
||||
flag_name = legacy_flag_list[flag_idx]
|
||||
if not flag_name then
|
||||
flag_name = DEFAULT_FLAG
|
||||
end
|
||||
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( "pride_flags:upper_mast", {
|
||||
description = "Flag Pole",
|
||||
description = S("Flag Pole with Flag"),
|
||||
drawtype = "mesh",
|
||||
paramtype = "light",
|
||||
mesh = "mast_upper.obj",
|
||||
mesh = "pride_flags_mast_upper.obj",
|
||||
paramtype2 = "facedir",
|
||||
tiles = { "pride_flags_baremetal.png", "pride_flags_baremetal.png" },
|
||||
wield_image = "pride_flags_pole_top_inv.png",
|
||||
inventory_image = "pride_flags_pole_top_inv.png",
|
||||
groups = { cracky = 2 },
|
||||
tiles = { "default_baremetal.png", "default_baremetal.png" },
|
||||
groups = { cracky = 1, level = 2 },
|
||||
--sounds = default.node_sound_metal_defaults( ),
|
||||
sounds = metal_sounds,
|
||||
is_ground_content = false,
|
||||
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
|
@ -150,40 +408,96 @@ minetest.register_node( "pride_flags:upper_mast", {
|
|||
},
|
||||
collision_box = {
|
||||
type = "fixed",
|
||||
fixed = { { -3/32, -1/2, -3/32, 3/32, 27/16, 3/32 } },
|
||||
fixed = { { -3/32, -1/2, -3/32, 3/32, 1/2, 3/32 } },
|
||||
},
|
||||
|
||||
on_rightclick = function ( pos, node, player )
|
||||
local node_idx = minetest.hash_node_position( pos )
|
||||
cycle_flag( pos, player )
|
||||
end,
|
||||
|
||||
if minetest.check_player_privs( player:get_player_name( ), "server" ) then
|
||||
active_flags[ node_idx ]:get_luaentity( ):reset_texture( )
|
||||
on_punch = function ( pos, node, player )
|
||||
cycle_flag( pos, player, -1 )
|
||||
end,
|
||||
|
||||
node_placement_prediction = "",
|
||||
|
||||
on_place = function( itemstack, placer, pointed_thing )
|
||||
if pointed_thing.type ~= "node" then
|
||||
return itemstack
|
||||
end
|
||||
|
||||
local node = minetest.get_node(pointed_thing.under)
|
||||
local pdef = minetest.registered_nodes[node.name]
|
||||
if pdef and pdef.on_rightclick and
|
||||
not placer:get_player_control().sneak then
|
||||
return pdef.on_rightclick(pointed_thing.under,
|
||||
node, placer, itemstack, pointed_thing)
|
||||
end
|
||||
|
||||
local pos
|
||||
if pdef and pdef.buildable_to then
|
||||
pos = pointed_thing.under
|
||||
else
|
||||
pos = pointed_thing.above
|
||||
node = minetest.get_node(pos)
|
||||
pdef = minetest.registered_nodes[node.name]
|
||||
if not pdef or not pdef.buildable_to then
|
||||
return itemstack
|
||||
end
|
||||
end
|
||||
|
||||
local above1 = {x = pos.x, y = pos.y + 1, z = pos.z}
|
||||
local above2 = {x = pos.x, y = pos.y + 2, z = pos.z}
|
||||
local anode1 = minetest.get_node_or_nil(above1)
|
||||
local anode2 = minetest.get_node_or_nil(above2)
|
||||
local adef1 = anode1 and minetest.registered_nodes[anode1.name]
|
||||
local adef2 = anode2 and minetest.registered_nodes[anode2.name]
|
||||
|
||||
-- Don't build if upper nodes are blocked, unless it's a hidden node
|
||||
if not adef1 or (not adef1.buildable_to and anode1.name ~= "pride_flags:upper_mast_hidden_1") then
|
||||
return itemstack
|
||||
end
|
||||
if not adef2 or (not adef2.buildable_to and anode2.name ~= "pride_flags:upper_mast_hidden_2") then
|
||||
return itemstack
|
||||
end
|
||||
|
||||
local pn = placer:get_player_name()
|
||||
if minetest.is_protected(pos, pn) then
|
||||
minetest.record_protection_violation(pos, pn)
|
||||
return itemstack
|
||||
elseif minetest.is_protected(above1, pn) then
|
||||
minetest.record_protection_violation(above1, pn)
|
||||
return itemstack
|
||||
elseif minetest.is_protected(above2, pn) then
|
||||
minetest.record_protection_violation(above2, 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(pos, {name = "pride_flags:upper_mast", param2 = param2 })
|
||||
minetest.set_node(above1, {name = "pride_flags:upper_mast_hidden_1"})
|
||||
minetest.set_node(above2, {name = "pride_flags:upper_mast_hidden_2"})
|
||||
|
||||
if not (minetest.is_creative_enabled(pn)) then
|
||||
itemstack:take_item()
|
||||
end
|
||||
|
||||
local def = minetest.registered_nodes["pride_flags: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 node_idx = minetest.hash_node_position( pos )
|
||||
local param2 = minetest.get_node( pos ).param2
|
||||
local facedir_to_pos = {
|
||||
[0] = { x = 0, y = 0.6, z = -0.1 },
|
||||
[1] = { x = -0.1, y = 0.6, z = 0 },
|
||||
[2] = { x = 0, y = 0.6, z = 0.1 },
|
||||
[3] = { x = 0.1, y = 0.6, z = 0 },
|
||||
}
|
||||
|
||||
local facedir_to_yaw = {
|
||||
[0] = rad_90,
|
||||
[1] = 0,
|
||||
[2] = -rad_90,
|
||||
[3] = rad_180,
|
||||
}
|
||||
local flag_pos = vector.add( pos, vector.multiply( facedir_to_pos[ param2 ], 1 ) )
|
||||
local obj = minetest.add_entity( flag_pos, "pride_flags:wavingflag" )
|
||||
|
||||
obj:get_luaentity( ).node_idx = node_idx
|
||||
obj:set_yaw( facedir_to_yaw[ param2 ] - rad_180 )
|
||||
|
||||
active_flags[ node_idx ] = obj
|
||||
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 )
|
||||
|
@ -192,4 +506,208 @@ minetest.register_node( "pride_flags:upper_mast", {
|
|||
active_flags[ node_idx ]:remove( )
|
||||
end
|
||||
end,
|
||||
|
||||
after_destruct = function( pos )
|
||||
local above1 = {x=pos.x, y=pos.y+1, z=pos.z}
|
||||
local above2 = {x=pos.x, y=pos.y+2, z=pos.z}
|
||||
if minetest.get_node( above1 ).name == "pride_flags:upper_mast_hidden_1" then
|
||||
minetest.remove_node( above1 )
|
||||
end
|
||||
if minetest.get_node( above2 ).name == "pride_flags:upper_mast_hidden_2" then
|
||||
minetest.remove_node( above2 )
|
||||
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 = "pride_flags:respawn_flags",
|
||||
label = "Respawn flags",
|
||||
nodenames = {"pride_flags: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 = "pride_flags:update_node_meta",
|
||||
label = "Update mast node meta",
|
||||
nodenames = {"pride_flags: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
|
||||
local flag_name = legacy_flag_list[ flag_idx ]
|
||||
if not flag_name then
|
||||
flag_name = DEFAULT_FLAG
|
||||
end
|
||||
meta:set_string("flag_idx", "")
|
||||
meta:set_string("flag_name", flag_name)
|
||||
end
|
||||
end
|
||||
})
|
||||
|
||||
if minetest.get_modpath("default") then
|
||||
minetest.register_craft({
|
||||
output = "pride_flags:lower_mast 6",
|
||||
recipe = {
|
||||
{"default:steel_ingot"},
|
||||
{"default:steel_ingot"},
|
||||
{"default:steel_ingot"},
|
||||
},
|
||||
})
|
||||
end
|
||||
minetest.register_craft({
|
||||
output = "pride_flags:upper_mast",
|
||||
recipe = {
|
||||
{"pride_flags:lower_mast", "group:wool", "group:wool"},
|
||||
{"pride_flags:lower_mast", "group:wool", "group:wool"},
|
||||
},
|
||||
})
|
||||
|
||||
-- Add 2 hidden upper mast segments to block all the nodes
|
||||
-- the upper mast occupies. This is also needed to prevent
|
||||
-- collision issues with overhigh nodes.
|
||||
-- These nodes will be automatically
|
||||
-- added/removed when the upper mast is constructed
|
||||
-- or destructed.
|
||||
minetest.register_node( "pride_flags:upper_mast_hidden_1", {
|
||||
drawtype = "airlike",
|
||||
pointable = false,
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true,
|
||||
wield_image = "pride_flags_pole_hidden1_inv.png",
|
||||
inventory_image = "pride_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,
|
||||
})
|
||||
minetest.register_node( "pride_flags:upper_mast_hidden_2", {
|
||||
drawtype = "airlike",
|
||||
pointable = false,
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true,
|
||||
wield_image = "pride_flags_pole_hidden2_inv.png",
|
||||
inventory_image = "pride_flags_pole_hidden2_inv.png",
|
||||
groups = { not_in_creative_inventory = 1 },
|
||||
sounds = metal_sounds,
|
||||
collision_box = {
|
||||
type = "fixed",
|
||||
fixed = { { -3/32, -1/2, -3/32, 3/32, -5/16, 3/32 } },
|
||||
},
|
||||
is_ground_content = false,
|
||||
|
||||
on_blast = function() end,
|
||||
can_dig = function() return false end,
|
||||
drop = "",
|
||||
diggable = false,
|
||||
floodable = false,
|
||||
})
|
||||
|
||||
-- API
|
||||
pride_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
|
||||
|
||||
pride_flags.get_flags = function( )
|
||||
return table.copy( flag_list )
|
||||
end
|
||||
|
||||
pride_flags.set_flag_at = function( pos, flag_name )
|
||||
local node = minetest.get_node( pos )
|
||||
if node.name ~= "pride_flags: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
|
||||
|
||||
pride_flags.get_flag_at = function( pos )
|
||||
local node = minetest.get_node( pos )
|
||||
if node.name ~= "pride_flags: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.
|
||||
pride_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
|
||||
|
||||
|
|
5
locale/pride_flags.de.tr
Normal file
|
@ -0,0 +1,5 @@
|
|||
# textdomain:pride_flags
|
||||
Pride Flags=Pride-Flaggen
|
||||
Adds a variety of animated flags to celebrate Pride.=Fügt eine Reihe an animierten Flaggen hinzu, um Pride (LGBTQ+) zu feiern.
|
||||
Flag Pole=Flaggenmast
|
||||
Flag Pole with Flag=Flaggenmast mit Flagge
|
5
locale/pride_flags.es.tr
Normal file
|
@ -0,0 +1,5 @@
|
|||
# textdomain:pride_flags
|
||||
Pride Flags=Banderas del orgullo
|
||||
Adds a variety of animated flags to celebrate Pride.=Añade una variedad de banderas animadas para celebrar el orgullo
|
||||
Flag Pole=Asta
|
||||
Flag Pole with Flag=Asta con bandera
|
5
locale/pride_flags.fr.tr
Normal file
|
@ -0,0 +1,5 @@
|
|||
# textdomain: pride_flags
|
||||
Pride Flags=
|
||||
Adds a variety of animated flags to celebrate Pride.=
|
||||
Flag Pole=Mât
|
||||
Flag Pole with Flag=Mât avec drapeau
|
5
locale/template.txt
Normal file
|
@ -0,0 +1,5 @@
|
|||
# textdomain:pride_flags
|
||||
Pride Flags=
|
||||
Adds a variety of animated flags to celebrate Pride.=
|
||||
Flag Pole=
|
||||
Flag Pole with Flag=
|
6
mod.conf
|
@ -1,5 +1,5 @@
|
|||
name = pride_flags
|
||||
title = Pride Flags
|
||||
author = sorcerykid
|
||||
license = LGPL-3.0
|
||||
|
||||
author = sorcerykid, Wuzzy
|
||||
optional_depends = default, screwdriver
|
||||
description = Adds a variety of animated flags to celebrate Pride.
|
||||
|
|
BIN
screenshot.png
Normal file
After Width: | Height: | Size: 77 KiB |
Before Width: | Height: | Size: 452 B |
BIN
textures/pride_flags_baremetal.png
Normal file
After Width: | Height: | Size: 293 B |
BIN
textures/pride_flags_pole_bottom_inv.png
Normal file
After Width: | Height: | Size: 169 B |
BIN
textures/pride_flags_pole_hidden1_inv.png
Normal file
After Width: | Height: | Size: 192 B |
BIN
textures/pride_flags_pole_hidden2_inv.png
Normal file
After Width: | Height: | Size: 118 B |
BIN
textures/pride_flags_pole_top_inv.png
Normal file
After Width: | Height: | Size: 184 B |
BIN
textures/prideflag_agender.png
Normal file
After Width: | Height: | Size: 234 B |
BIN
textures/prideflag_androgyne.png
Normal file
After Width: | Height: | Size: 106 B |
BIN
textures/prideflag_aromantic.png
Normal file
After Width: | Height: | Size: 141 B |
Before Width: | Height: | Size: 210 B After Width: | Height: | Size: 117 B |
BIN
textures/prideflag_bigender.png
Normal file
After Width: | Height: | Size: 169 B |
BIN
textures/prideflag_biromantic.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 219 B After Width: | Height: | Size: 105 B |
BIN
textures/prideflag_demiboy.png
Normal file
After Width: | Height: | Size: 118 B |
BIN
textures/prideflag_demigender.png
Normal file
After Width: | Height: | Size: 162 B |
BIN
textures/prideflag_demigirl.png
Normal file
After Width: | Height: | Size: 118 B |
BIN
textures/prideflag_demiromantic.png
Normal file
After Width: | Height: | Size: 695 B |
BIN
textures/prideflag_demisexual.png
Normal file
After Width: | Height: | Size: 704 B |
Before Width: | Height: | Size: 208 B After Width: | Height: | Size: 117 B |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 225 B |
Before Width: | Height: | Size: 207 B After Width: | Height: | Size: 124 B |
BIN
textures/prideflag_grayromantic.png
Normal file
After Width: | Height: | Size: 107 B |
BIN
textures/prideflag_graysexual.png
Normal file
After Width: | Height: | Size: 107 B |
BIN
textures/prideflag_homoromantic.png
Normal file
After Width: | Height: | Size: 2 KiB |
BIN
textures/prideflag_intersex.png
Normal file
After Width: | Height: | Size: 798 B |
Before Width: | Height: | Size: 492 B After Width: | Height: | Size: 124 B |
BIN
textures/prideflag_maverique.png
Normal file
After Width: | Height: | Size: 178 B |
BIN
textures/prideflag_multigender.png
Normal file
After Width: | Height: | Size: 136 B |
BIN
textures/prideflag_neutrois.png
Normal file
After Width: | Height: | Size: 131 B |
Before Width: | Height: | Size: 725 B After Width: | Height: | Size: 224 B |
BIN
textures/prideflag_omniromantic.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
textures/prideflag_omnisexual.png
Normal file
After Width: | Height: | Size: 142 B |
BIN
textures/prideflag_pangender.png
Normal file
After Width: | Height: | Size: 118 B |
BIN
textures/prideflag_panromantic.png
Normal file
After Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 201 B After Width: | Height: | Size: 107 B |
BIN
textures/prideflag_polyamorous.png
Normal file
After Width: | Height: | Size: 787 B |
BIN
textures/prideflag_polygender.png
Normal file
After Width: | Height: | Size: 150 B |
BIN
textures/prideflag_polyromantic.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 709 B After Width: | Height: | Size: 243 B |
BIN
textures/prideflag_progress.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
textures/prideflag_queer.png
Normal file
After Width: | Height: | Size: 186 B |
Before Width: | Height: | Size: 228 B After Width: | Height: | Size: 155 B |
Before Width: | Height: | Size: 205 B After Width: | Height: | Size: 118 B |
BIN
textures/prideflag_trigender.png
Normal file
After Width: | Height: | Size: 133 B |
BIN
textures/prideflag_vincian.png
Normal file
After Width: | Height: | Size: 124 B |