mirror of
				https://github.com/minetest-mods/3d_armor.git
				synced 2025-10-31 12:55:23 +01:00 
			
		
		
		
	Compare commits
	
		
			1 Commits
		
	
	
		
			armorswap
			...
			code-quali
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | f81cb10f20 | 
							
								
								
									
										14
									
								
								.github/workflows/integration-test.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								.github/workflows/integration-test.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| name: integration-test | ||||
|  | ||||
| on: [push] | ||||
|  | ||||
| jobs: | ||||
|   build: | ||||
|  | ||||
|     runs-on: ubuntu-latest | ||||
|  | ||||
|     steps: | ||||
|     - uses: actions/checkout@v1 | ||||
|  | ||||
|     - name: integration-test | ||||
|       run: ./integration-test.sh | ||||
							
								
								
									
										17
									
								
								.github/workflows/luacheck.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								.github/workflows/luacheck.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| name: luacheck | ||||
|  | ||||
| on: [push] | ||||
|  | ||||
| jobs: | ||||
|   build: | ||||
|  | ||||
|     runs-on: ubuntu-latest | ||||
|  | ||||
|     steps: | ||||
|     - uses: actions/checkout@v1 | ||||
|     - name: apt | ||||
|       run: sudo apt-get install -y luarocks | ||||
|     - name: luacheck install | ||||
|       run: luarocks install --local luacheck | ||||
|     - name: luacheck run | ||||
|       run: $HOME/.luarocks/bin/luacheck ./ | ||||
							
								
								
									
										34
									
								
								.luacheckrc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								.luacheckrc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
|  | ||||
| unused_args = false | ||||
|  | ||||
| globals = { | ||||
| 	"wieldview", | ||||
| 	"armor", | ||||
| 	"armor_i18n", | ||||
| 	"inventory_plus" | ||||
| } | ||||
|  | ||||
| read_globals = { | ||||
| 	-- Stdlib | ||||
| 	string = {fields = {"split"}}, | ||||
| 	table = {fields = {"copy", "getn"}}, | ||||
|  | ||||
| 	-- Minetest | ||||
| 	"vector", "ItemStack", | ||||
| 	"dump", "VoxelArea", | ||||
|  | ||||
| 	-- deps | ||||
| 	"default", | ||||
| 	"minetest", | ||||
| 	"unified_inventory", | ||||
| 	"intllib", | ||||
| 	"wardrobe", | ||||
| 	"player_monoids", | ||||
| 	"armor_monoid", | ||||
| 	"sfinv", | ||||
| 	"ARMOR_MATERIALS", | ||||
| 	"ARMOR_FIRE_NODES", | ||||
| 	"pova", | ||||
| 	"skins", | ||||
| 	"u_skins" | ||||
| } | ||||
| @@ -185,7 +185,6 @@ armor.set_player_armor = function(self, player) | ||||
| 	local material = {count=1} | ||||
| 	local preview = armor:get_preview(name) | ||||
| 	local texture = "3d_armor_trans.png" | ||||
| 	local textures = {} | ||||
| 	local physics = {} | ||||
| 	local attributes = {} | ||||
| 	local levels = {} | ||||
| @@ -324,8 +323,8 @@ armor.punch = function(self, player, hitter, time_from_last_punch, tool_capabili | ||||
| 	local list = armor_inv:get_list("armor") | ||||
| 	for i, stack in pairs(list) do | ||||
| 		if stack:get_count() == 1 then | ||||
| 			local name = stack:get_name() | ||||
| 			local use = minetest.get_item_group(name, "armor_use") or 0 | ||||
| 			local itemname = stack:get_name() | ||||
| 			local use = minetest.get_item_group(itemname, "armor_use") or 0 | ||||
| 			local damage = use > 0 | ||||
| 			local def = stack:get_definition() or {} | ||||
| 			if type(def.on_punched) == "function" then | ||||
| @@ -373,7 +372,7 @@ armor.punch = function(self, player, hitter, time_from_last_punch, tool_capabili | ||||
| 				end | ||||
| 			end | ||||
| 			if damage == true and hitter == "fire" then | ||||
| 				damage = minetest.get_item_group(name, "flammable") > 0 | ||||
| 				damage = minetest.get_item_group(itemname, "flammable") > 0 | ||||
| 			end | ||||
| 			if damage == true then | ||||
| 				self:damage(player, i, stack, use) | ||||
|   | ||||
| @@ -15,19 +15,23 @@ local F = minetest.formspec_escape | ||||
|  | ||||
| dofile(modpath.."/api.lua") | ||||
|  | ||||
| -- integration test | ||||
| if minetest.settings:get_bool("enable_3d_armor_integration_test") then | ||||
|         dofile(modpath.."/integration_test.lua") | ||||
| end | ||||
|  | ||||
|  | ||||
| -- Legacy Config Support | ||||
|  | ||||
| local input = io.open(modpath.."/armor.conf", "r") | ||||
| if input then | ||||
| 	dofile(modpath.."/armor.conf") | ||||
| 	input:close() | ||||
| 	input = nil | ||||
| end | ||||
| input = io.open(worldpath.."/armor.conf", "r") | ||||
| if input then | ||||
| 	dofile(worldpath.."/armor.conf") | ||||
| 	input:close() | ||||
| 	input = nil | ||||
| end | ||||
| for name, _ in pairs(armor.config) do | ||||
| 	local global = "ARMOR_"..name:upper() | ||||
| @@ -169,9 +173,9 @@ local function validate_armor_inventory(player) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| local function init_player_armor(player) | ||||
| 	local name = player:get_player_name() | ||||
| 	local pos = player:get_pos() | ||||
| local function init_player_armor(initplayer) | ||||
| 	local name = initplayer:get_player_name() | ||||
| 	local pos = initplayer:get_pos() | ||||
| 	if not name or not pos then | ||||
| 		return false | ||||
| 	end | ||||
| @@ -214,20 +218,20 @@ local function init_player_armor(player) | ||||
| 		end, | ||||
| 	}, name) | ||||
| 	armor_inv:set_size("armor", 6) | ||||
| 	if not armor:load_armor_inventory(player) and armor.migrate_old_inventory then | ||||
| 		local player_inv = player:get_inventory() | ||||
| 	if not armor:load_armor_inventory(initplayer) and armor.migrate_old_inventory then | ||||
| 		local player_inv = initplayer:get_inventory() | ||||
| 		player_inv:set_size("armor", 6) | ||||
| 		for i=1, 6 do | ||||
| 			local stack = player_inv:get_stack("armor", i) | ||||
| 			armor_inv:set_stack("armor", i, stack) | ||||
| 		end | ||||
| 		armor:save_armor_inventory(player) | ||||
| 		armor:save_armor_inventory(initplayer) | ||||
| 		player_inv:set_size("armor", 0) | ||||
| 	end | ||||
| 	for i=1, 6 do | ||||
| 		local stack = armor_inv:get_stack("armor", i) | ||||
| 		if stack:get_count() > 0 then | ||||
| 			armor:run_callbacks("on_equip", player, i, stack) | ||||
| 			armor:run_callbacks("on_equip", initplayer, i, stack) | ||||
| 		end | ||||
| 	end | ||||
| 	armor.def[name] = { | ||||
| @@ -263,7 +267,7 @@ local function init_player_armor(player) | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
| 	armor:set_player_armor(player) | ||||
| 	armor:set_player_armor(initplayer) | ||||
| 	return true | ||||
| end | ||||
|  | ||||
| @@ -291,24 +295,31 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) | ||||
| 	if not name then | ||||
| 		return | ||||
| 	end | ||||
|   local player_name = player:get_player_name() | ||||
| 	for field, _ in pairs(fields) do | ||||
| 		if string.find(field, "skins_set") then | ||||
| 			minetest.after(0, function(player) | ||||
| 				local skin = armor:get_player_skin(name) | ||||
| 				armor.textures[name].skin = skin | ||||
| 				armor:set_player_armor(player) | ||||
| 			end, player) | ||||
| 			minetest.after(0, function() | ||||
|         local pplayer = minetest.get_player_by_name(player_name) | ||||
|         if player then | ||||
|           local skin = armor:get_player_skin(name) | ||||
|           armor.textures[name].skin = skin | ||||
|           armor:set_player_armor(pplayer) | ||||
|         end | ||||
| 			end) | ||||
| 		end | ||||
| 	end | ||||
| end) | ||||
|  | ||||
| minetest.register_on_joinplayer(function(player) | ||||
| 	default.player_set_model(player, "3d_armor_character.b3d") | ||||
| 	minetest.after(0, function(player) | ||||
| 		if init_player_armor(player) == false then | ||||
| 			pending_players[player] = 0 | ||||
|   local player_name = player:get_player_name() | ||||
|  | ||||
| 	minetest.after(0, function() | ||||
|     local pplayer = minetest.get_player_by_name(player_name) | ||||
| 		if pplayer and init_player_armor(pplayer) == false then | ||||
| 			pending_players[pplayer] = 0 | ||||
| 		end | ||||
| 	end, player) | ||||
| 	end) | ||||
| end) | ||||
|  | ||||
| minetest.register_on_leaveplayer(function(player) | ||||
|   | ||||
							
								
								
									
										25
									
								
								3d_armor/integration_test.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								3d_armor/integration_test.lua
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
|  | ||||
| minetest.log("warning", "[TEST] integration-test enabled!") | ||||
|  | ||||
| minetest.register_on_mods_loaded(function() | ||||
| 	minetest.after(1, function() | ||||
|  | ||||
| 		local data = minetest.write_json({ success = true }, true); | ||||
| 		local file = io.open(minetest.get_worldpath().."/integration_test.json", "w" ); | ||||
| 		if file then | ||||
| 			file:write(data) | ||||
| 			file:close() | ||||
| 		end | ||||
|  | ||||
| 		file = io.open(minetest.get_worldpath().."/registered_nodes.txt", "w" ); | ||||
| 		if file then | ||||
| 			for name in pairs(minetest.registered_nodes) do | ||||
| 				file:write(name .. '\n') | ||||
| 			end | ||||
| 			file:close() | ||||
| 		end | ||||
|  | ||||
| 		minetest.log("warning", "[TEST] integration tests done!") | ||||
| 		minetest.request_shutdown("success") | ||||
| 	end) | ||||
| end) | ||||
| @@ -1,5 +1,2 @@ | ||||
| 3d_armor | ||||
| shields? | ||||
| unified_inventory? | ||||
| inventory_plus? | ||||
| sfinv? | ||||
|  | ||||
|   | ||||
| @@ -1,65 +1,23 @@ | ||||
| -- support for i18n | ||||
| local S = armor_i18n.gettext | ||||
|  | ||||
| -- Update methods for supported inventories | ||||
| local inventory_update | ||||
| if minetest.global_exists("unified_inventory") then | ||||
| 	inventory_update = function(player) | ||||
| 		local page = unified_inventory.current_page[player:get_player_name()] | ||||
| 		unified_inventory.set_inventory_formspec(player, "armor") | ||||
| 		unified_inventory.get_formspec(player, "armor") | ||||
| 		unified_inventory.set_inventory_formspec(player, page) | ||||
| 	end | ||||
| elseif minetest.global_exists("sfinv") then | ||||
| 	inventory_update = function(player) | ||||
| 		sfinv.set_player_inventory_formspec(player) | ||||
| 	end | ||||
| elseif minetest.global_exists("inventory_plus") then | ||||
| 	inventory_update = function(player) | ||||
| 		local name = player:get_player_name() | ||||
| 		local formspec = armor:get_armor_formspec(name, true) | ||||
| 		local page = player:get_inventory_formspec() | ||||
| 		if page:find("detached:"..name.."_armor") then | ||||
| 			inventory_plus.set_inventory_formspec(player, formspec) | ||||
| 		end | ||||
| 	end | ||||
| else | ||||
| 	inventory_update = function()end | ||||
| end | ||||
| local armor_stand_formspec = "size[8,7]" .. | ||||
| 	default.gui_bg .. | ||||
| 	default.gui_bg_img .. | ||||
| 	default.gui_slots .. | ||||
| 	default.get_hotbar_bg(0,3) .. | ||||
| 	"list[current_name;armor_head;3,0.5;1,1;]" .. | ||||
| 	"list[current_name;armor_torso;4,0.5;1,1;]" .. | ||||
| 	"list[current_name;armor_legs;3,1.5;1,1;]" .. | ||||
| 	"list[current_name;armor_feet;4,1.5;1,1;]" .. | ||||
| 	"image[3,0.5;1,1;3d_armor_stand_head.png]" .. | ||||
| 	"image[4,0.5;1,1;3d_armor_stand_torso.png]" .. | ||||
| 	"image[3,1.5;1,1;3d_armor_stand_legs.png]" .. | ||||
| 	"image[4,1.5;1,1;3d_armor_stand_feet.png]" .. | ||||
| 	"list[current_player;main;0,3;8,1;]" .. | ||||
| 	"list[current_player;main;0,4.25;8,3;8]" | ||||
|  | ||||
| -- Shields enabled? | ||||
| local shield = minetest.get_modpath("shields") | ||||
|  | ||||
| -- Supported armor stand slots | ||||
| local elements = {"head", "torso", "legs", "feet"} | ||||
| if shield then | ||||
| 	table.insert(elements, "shield") | ||||
| end | ||||
|  | ||||
| local armor_stand_formspec = function(playername) | ||||
| 	return "formspec_version[1]" .. | ||||
| 		"size[" .. (shield and 11 or 8) .. ",7]" .. | ||||
| 		default.gui_bg .. | ||||
| 		default.gui_bg_img .. | ||||
| 		default.gui_slots .. | ||||
| 		default.get_hotbar_bg(0,3) .. | ||||
| 		"list[context;armor_head;3,0.5;1,1;]" .. | ||||
| 		"list[context;armor_torso;4,0.5;1,1;]" .. | ||||
| 		"list[context;armor_legs;3,1.5;1,1;]" .. | ||||
| 		"list[context;armor_feet;4,1.5;1,1;]" .. | ||||
| 		(shield and "list[context;armor_shield;5,1.5;1,1;]" or "") .. | ||||
| 		"image[3,0.5;1,1;3d_armor_stand_head.png]" .. | ||||
| 		"image[4,0.5;1,1;3d_armor_stand_torso.png]" .. | ||||
| 		"image[3,1.5;1,1;3d_armor_stand_legs.png]" .. | ||||
| 		"image[4,1.5;1,1;3d_armor_stand_feet.png]" .. | ||||
| 		(shield and "image[5,1.5;1,1;3d_armor_stand_shield.png]" or "") .. | ||||
| 		"button_exit[6,1.5;1,1;swap;Switch]" .. | ||||
| 		"list[current_player;main;0,3;8,1;]" .. | ||||
| 		"list[current_player;main;0,4.25;8,3;8]" .. | ||||
| 		"label[9,1;"..playername.."]" .. | ||||
| 		"list[detached:"..playername.."_armor;armor;9,4.25;2,3;]" .. | ||||
| 		"listring[detached:"..playername.."_armor;armor]" | ||||
| end | ||||
|  | ||||
| local function drop_armor(pos) | ||||
| 	local meta = minetest.get_meta(pos) | ||||
| @@ -139,7 +97,7 @@ local function update_entity(pos) | ||||
| 				yaw = math.pi / 2 | ||||
| 			end | ||||
| 		end | ||||
| 		object:set_yaw(yaw) | ||||
| 		object:setyaw(yaw) | ||||
| 		object:set_properties({textures={texture}}) | ||||
| 	end | ||||
| end | ||||
| @@ -175,84 +133,6 @@ local function remove_hidden_node(pos) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| local elements2groups = function(t) | ||||
| 	local result = {} | ||||
| 	for _,v in ipairs(t) do | ||||
| 		result["armor_" .. v] = false | ||||
| 	end | ||||
| 	return result | ||||
| end | ||||
|  | ||||
| local take_player_items = function(inv) | ||||
| 	local result = {} | ||||
| 	local slots = elements2groups(elements) | ||||
| 	for i = 1, inv:get_size('armor') do | ||||
| 		local stack = inv:get_stack("armor", i) | ||||
| 		local def = stack:get_definition() | ||||
| 		local groups = def and def.groups or nil | ||||
| 		if groups then | ||||
| 			for slot,used in pairs(slots) do | ||||
| 				if not used and groups[slot] then | ||||
| 					slots[slot] = true | ||||
| 					result[slot] = {index=table.maxn(result)+1, stack=stack} | ||||
| 					inv:set_stack("armor", i, nil) | ||||
| 					break | ||||
| 				end | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
| 	return result | ||||
| end | ||||
|  | ||||
| local take_stand_items = function(inv) | ||||
| 	local result = {} | ||||
| 	for i, element in ipairs(elements) do | ||||
| 		local stack = inv:get_stack("armor_"..element, 1) | ||||
| 		if not stack:is_empty() then | ||||
| 			table.insert(result, stack) | ||||
| 			inv:set_stack("armor_"..element, 1, nil) | ||||
| 		end | ||||
| 	end | ||||
| 	return result | ||||
| end | ||||
|  | ||||
| local function swap_armor(pos, player) | ||||
|  | ||||
| 	-- Collect player items removing them from inventory | ||||
| 	local player_inv = minetest.get_inventory({type='detached',name=player:get_player_name()..'_armor'}) | ||||
| 	local player_items = take_player_items(player_inv) | ||||
|  | ||||
| 	-- Collect stand items removing them from inventory | ||||
| 	local stand_inv = minetest.get_meta(pos):get_inventory() | ||||
| 	local stand_items = take_stand_items(stand_inv) | ||||
|  | ||||
| 	-- debug stuff | ||||
| 	local player_items_name = {} | ||||
| 	local stand_items_name = {} | ||||
|  | ||||
| 	local size = player_inv:get_size('armor') | ||||
| 	local min = 1 | ||||
| 	for _,stack in ipairs(stand_items) do | ||||
| 		for i = min,size do | ||||
| 			if player_inv:get_stack("armor", i):is_empty() then | ||||
| 				player_inv:set_stack("armor", i, stack) | ||||
| 				min = i + 1 | ||||
| 				break | ||||
| 			else | ||||
| 				print('slot ' .. i .. ' in use, trying to add ' .. stack:get_name()) | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
| 	for slot,data in pairs(player_items) do | ||||
| 		-- save data.index into armor stand meta to keep ordering next time | ||||
| 		stand_inv:set_stack(slot, 1, data.stack) | ||||
| 	end | ||||
|  | ||||
| 	-- update inventories managed by supported inventory mods | ||||
| 	update_entity(pos) | ||||
| 	inventory_update(player) | ||||
| end | ||||
|  | ||||
| minetest.register_node("3d_armor_stand:top", { | ||||
| 	description = S("Armor stand top"), | ||||
| 	paramtype = "light", | ||||
| @@ -287,6 +167,7 @@ minetest.register_node("3d_armor_stand:armor_stand", { | ||||
| 	sounds = default.node_sound_wood_defaults(), | ||||
| 	on_construct = function(pos) | ||||
| 		local meta = minetest.get_meta(pos) | ||||
| 		meta:set_string("formspec", armor_stand_formspec) | ||||
| 		meta:set_string("infotext", S("Armor Stand")) | ||||
| 		local inv = meta:get_inventory() | ||||
| 		for _, element in pairs(elements) do | ||||
| @@ -304,17 +185,9 @@ minetest.register_node("3d_armor_stand:armor_stand", { | ||||
| 		return true | ||||
| 	end, | ||||
| 	after_place_node = function(pos, placer) | ||||
| 		local meta = minetest.get_meta(pos) | ||||
| 		local formspec = armor_stand_formspec(placer and placer:get_player_name() or "") | ||||
| 		meta:set_string("formspec", formspec) | ||||
| 		minetest.add_entity(pos, "3d_armor_stand:armor_entity") | ||||
| 		add_hidden_node(pos, placer) | ||||
| 	end, | ||||
| 	on_receive_fields = function (pos, formname, fields, sender) | ||||
| 		if fields.swap then | ||||
| 			swap_armor(pos, sender) | ||||
| 		end | ||||
| 	end, | ||||
| 	allow_metadata_inventory_put = function(pos, listname, index, stack) | ||||
| 		local def = stack:get_definition() or {} | ||||
| 		local groups = def.groups or {} | ||||
|   | ||||
| @@ -1,6 +1,9 @@ | ||||
| Modpack - 3d Armor [0.4.13] | ||||
| =========================== | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ### Table of Contents | ||||
| <!-- START doctoc generated TOC please keep comment here to allow auto update --> | ||||
| <!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --> | ||||
|   | ||||
							
								
								
									
										20
									
								
								integration-test.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										20
									
								
								integration-test.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| #!/bin/sh | ||||
| # simple integration test | ||||
|  | ||||
| CFG=/tmp/minetest.conf | ||||
| MTDIR=/tmp/mt | ||||
| WORLDDIR=${MTDIR}/worlds/world | ||||
|  | ||||
| cat <<EOF > ${CFG} | ||||
|  enable_3d_armor_integration_test = true | ||||
| EOF | ||||
|  | ||||
| mkdir -p ${WORLDDIR} | ||||
| chmod 777 ${MTDIR} -R | ||||
| docker run --rm -i \ | ||||
| 	-v ${CFG}:/etc/minetest/minetest.conf:ro \ | ||||
| 	-v ${MTDIR}:/var/lib/minetest/.minetest \ | ||||
| 	-v $(pwd):/var/lib/minetest/.minetest/worlds/world/worldmods/3d_armor \ | ||||
| 	registry.gitlab.com/minetest/minetest/server:5.0.1 | ||||
|  | ||||
| test -f ${WORLDDIR}/integration_test.json && exit 0 || exit 1 | ||||
| @@ -2,7 +2,6 @@ | ||||
| local S = armor_i18n.gettext | ||||
|  | ||||
| local disable_sounds = minetest.settings:get_bool("shields_disable_sounds") | ||||
| local use_moreores = minetest.get_modpath("moreores") | ||||
| local function play_sound_effect(player, name) | ||||
| 	if not disable_sounds and player then | ||||
| 		local pos = player:get_pos() | ||||
|   | ||||
| @@ -66,9 +66,12 @@ end | ||||
| minetest.register_on_joinplayer(function(player) | ||||
| 	local name = player:get_player_name() | ||||
| 	wieldview.wielded_item[name] = "" | ||||
| 	minetest.after(0, function(player) | ||||
| 		wieldview:update_wielded_item(player) | ||||
| 	end, player) | ||||
| 	minetest.after(0, function() | ||||
| 		local pplayer = minetest.get_player_by_name(name) | ||||
| 		if player then | ||||
| 			wieldview:update_wielded_item(pplayer) | ||||
| 		end | ||||
| 	end) | ||||
| end) | ||||
|  | ||||
| minetest.register_globalstep(function(dtime) | ||||
| @@ -80,4 +83,3 @@ minetest.register_globalstep(function(dtime) | ||||
| 		time = 0 | ||||
| 	end | ||||
| end) | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user