aboutsummaryrefslogtreecommitdiff
path: root/src/serverremoteplayer.h
Commit message (Collapse)AuthorAge
* Entity damage system WIP; Remove C++ mobsPerttu Ahola2012-03-10
|
* Players stay in environment even when dead, damage flash and fall damage fixesKahrl2012-02-05
| | | | | | Don't set m_removed on dead players (dead players are indicated by hp == 0). Local damage flash is shown whatever the cause was (even from Lua set_hp). PlayerCAO damage flash matches duration of local damage flash. Fall damage is dealt much more consistently (this is done by disallowing jumping when speed.Y is very negative, up to now jumping could sometimes negate fall damage)
* The huge item definition and item namespace unification patch (itemdef), see ↵Kahrl2012-01-12
| | | | http://c55.me/minetest/wiki/doku.php?id=changes:itemdef
* Properly use time_from_last_punch for limiting PvP punch damagePerttu Ahola2011-12-04
|
* Fix ActiveObject creation for fast player respawnsPerttu Ahola2011-12-02
|
* Move ServerRemotePlayer to a separate filePerttu Ahola2011-12-02
6' href='#n126'>126 127 128 129 130 131 132 133 134
/*
Minetest
Copyright (C) 2020 Hugues Ross <hugues.ross@gmail.com>

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 2.1 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.

You should have received a copy of the GNU Lesser General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/

#include "texture_override.h"

#include "log.h"
#include "util/string.h"
#include <algorithm>
#include <fstream>

#define override_cast static_cast<override_t>

TextureOverrideSource::TextureOverrideSource(std::string filepath)
{
	std::ifstream infile(filepath.c_str());
	std::string line;
	int line_index = 0;
	while (std::getline(infile, line)) {
		line_index++;

		// Also trim '\r' on DOS-style files
		line = trim(line);

		// Ignore empty lines and comments
		if (line.empty() || line[0] == '#')
			continue;

		std::vector<std::string> splitted = str_split(line, ' ');
		if (splitted.size() != 3) {
			warningstream << filepath << ":" << line_index
					<< " Syntax error in texture override \"" << line
					<< "\": Expected 3 arguments, got " << splitted.size()
					<< std::endl;
			continue;
		}

		TextureOverride texture_override = {};
		texture_override.id = splitted[0];
		texture_override.texture = splitted[2];

		// Parse the target mask
		std::vector<std::string> targets = str_split(splitted[1], ',');
		for (const std::string &target : targets) {
			if (target == "top")
				texture_override.target |= override_cast(OverrideTarget::TOP);
			else if (target == "bottom")
				texture_override.target |= override_cast(OverrideTarget::BOTTOM);
			else if (target == "left")
				texture_override.target |= override_cast(OverrideTarget::LEFT);
			else if (target == "right")
				texture_override.target |= override_cast(OverrideTarget::RIGHT);
			else if (target == "front")
				texture_override.target |= override_cast(OverrideTarget::FRONT);
			else if (target == "back")
				texture_override.target |= override_cast(OverrideTarget::BACK);
			else if (target == "inventory")
				texture_override.target |= override_cast(OverrideTarget::INVENTORY);
			else if (target == "wield")
				texture_override.target |= override_cast(OverrideTarget::WIELD);
			else if (target == "special1")
				texture_override.target |= override_cast(OverrideTarget::SPECIAL_1);
			else if (target == "special2")
				texture_override.target |= override_cast(OverrideTarget::SPECIAL_2);
			else if (target == "special3")
				texture_override.target |= override_cast(OverrideTarget::SPECIAL_3);
			else if (target == "special4")
				texture_override.target |= override_cast(OverrideTarget::SPECIAL_4);
			else if (target == "special5")
				texture_override.target |= override_cast(OverrideTarget::SPECIAL_5);
			else if (target == "special6")
				texture_override.target |= override_cast(OverrideTarget::SPECIAL_6);
			else if (target == "sides")
				texture_override.target |= override_cast(OverrideTarget::SIDES);
			else if (target == "all" || target == "*")
				texture_override.target |= override_cast(OverrideTarget::ALL_FACES);
			else {
				// Report invalid target
				warningstream << filepath << ":" << line_index
						<< " Syntax error in texture override \"" << line
						<< "\": Unknown target \"" << target << "\""
						<< std::endl;
			}
		}

		// If there are no valid targets, skip adding this override
		if (texture_override.target == override_cast(OverrideTarget::INVALID)) {
			continue;
		}

		m_overrides.push_back(texture_override);
	}
}

//! Get all overrides that apply to item definitions
std::vector<TextureOverride> TextureOverrideSource::getItemTextureOverrides()
{
	std::vector<TextureOverride> found_overrides;

	for (const TextureOverride &texture_override : m_overrides) {
		if (texture_override.hasTarget(OverrideTarget::ITEM_TARGETS))
			found_overrides.push_back(texture_override);
	}

	return found_overrides;
}

//! Get all overrides that apply to node definitions
std::vector<TextureOverride> TextureOverrideSource::getNodeTileOverrides()
{
	std::vector<TextureOverride> found_overrides;

	for (const TextureOverride &texture_override : m_overrides) {
		if (texture_override.hasTarget(OverrideTarget::NODE_TARGETS))
			found_overrides.push_back(texture_override);
	}

	return found_overrides;
}