• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!
  • 2026 staff recruitment is open! Check it out and consider applying!

Zmiana barw outfitów bez butów

Status
Not open for further replies.
Code:
bool Player::changeOutfit(Outfit_t outfit, bool checkList)
{
	[b]std::string zmienna;
	this->getStorageValue((uint32_t)1234, zmienna);
	outfit.lookFeet = atoi(zmienna.c_str());[/b]

	uint32_t outfitId = Outfits::getInstance()->getOutfitId(outfit.lookType);
	if(checkList && (!canWearOutfit(outfitId, outfit.lookAddons) || !requestedOutfit))
		return false;

	requestedOutfit = false;
	if(outfitAttributes)
	{
		uint32_t oldId = Outfits::getInstance()->getOutfitId(defaultOutfit.lookType);
		outfitAttributes = !Outfits::getInstance()->removeAttributes(getID(), oldId, sex);
	}

	defaultOutfit = outfit;
	outfitAttributes = Outfits::getInstance()->addAttributes(getID(), outfitId, sex, defaultOutfit.lookAddons);
	return true;
}
Try it ;]
 
Last edited:
Proszę

Code:
no matching function for call to `Player::getStorageValue(uint32_t, std::string*)' 

candidates are: bool Player::getStorageValue(uint32_t, std::string&) const
 
Poszła kompilacja itd ale kurcze można zmieniać kolor butów normalnie, jednak po relogu ustawia się ten kolor co w storage.

Da sie jakoś zablokować żeby nie można było zmieniać tego koloru?
Żeby po zmianie i kliknięciu OK w oknie ustawiało kolor butów na ten w storage bez względu na to jaki kolor się wybrało.
 
Code:
bool Player::changeOutfit(Outfit_t outfit, bool checkList)
{
	uint32_t outfitId = Outfits::getInstance()->getOutfitId(outfit.lookType);
	if(checkList && (!canWearOutfit(outfitId, outfit.lookAddons) || !requestedOutfit))
		return false;

	[b]std::string zmienna;
	this->getStorageValue((uint32_t)1234, zmienna);
	outfit.lookFeet = atoi(zmienna.c_str());[/b]

	requestedOutfit = false;
	if(outfitAttributes)
	{
		uint32_t oldId = Outfits::getInstance()->getOutfitId(defaultOutfit.lookType);
		outfitAttributes = !Outfits::getInstance()->removeAttributes(getID(), oldId, sex);
	}

	defaultOutfit = outfit;
	outfitAttributes = Outfits::getInstance()->addAttributes(getID(), outfitId, sex, defaultOutfit.lookAddons);

	return true;
}
edited
 
Last edited:
No właśnie nie, teraz wcale nie zmienia butków nawet po relogu, można sobie dobrowolnie ustawiać kolor :/
 
Code:
void ProtocolGame::parseSetOutfit(NetworkMessage& msg)
{
	Outfit_t newOutfit = player->defaultOutfit;
	if(g_config.getBool(ConfigManager::ALLOW_CHANGEOUTFIT))
		newOutfit.lookType = msg.GetU16();
	else
		msg.SkipBytes(2);

	if(g_config.getBool(ConfigManager::ALLOW_CHANGECOLORS))
	{
		newOutfit.lookHead = msg.GetByte();
		newOutfit.lookBody = msg.GetByte();
		newOutfit.lookLegs = msg.GetByte();

		std::string tmp;
		if(player->getStorageValue((uint32_t)1234, tmp))
		{
			msg.SkipBytes(1);
			newOutfit.lookFeet = atoi(tmp.c_str());
		}
		else
			newOutfit.lookFeet = msg.GetByte();
	}
	else
		msg.SkipBytes(4);

	if(g_config.getBool(ConfigManager::ALLOW_CHANGEADDONS))
		newOutfit.lookAddons = msg.GetByte();
	else
		msg.SkipBytes(1);

	addGameTask(&Game::playerChangeOutfit, player->getID(), newOutfit);
}

bye.


Uzasadnienie dla jełopów, którzy uważają, że należy to zrobić w Player::changeOutfit: a co z wysyłaniem nowego outfitu do graczy? _._
Pozdro "wyjadaczowie".
 
Code:
void ProtocolGame::parseSetOutfit(NetworkMessage& msg)
{
	Outfit_t newOutfit = player->defaultOutfit;
	if(g_config.getBool(ConfigManager::ALLOW_CHANGEOUTFIT))
		newOutfit.lookType = msg.GetU16();
	else
		msg.SkipBytes(2);

	if(g_config.getBool(ConfigManager::ALLOW_CHANGECOLORS))
	{
		newOutfit.lookHead = msg.GetByte();
		newOutfit.lookBody = msg.GetByte();
		newOutfit.lookLegs = msg.GetByte();

		std::string tmp;
		if(player->getStorageValue((uint32_t)1234, tmp))
		{
			msg.SkipBytes(1);
			newOutfit.lookFeet = atoi(tmp.c_str());
		}
		else
			newOutfit.lookFeet = msg.GetByte();
	}
	else
		msg.SkipBytes(4);

	if(g_config.getBool(ConfigManager::ALLOW_CHANGEADDONS))
		newOutfit.lookAddons = msg.GetByte();
	else
		msg.SkipBytes(1);

	addGameTask(&Game::playerChangeOutfit, player->getID(), newOutfit);
}

bye.


Uzasadnienie dla jełopów, którzy uważają, że należy to zrobić w Player::changeOutfit: a co z wysyłaniem nowego outfitu do graczy? _._
Pozdro "wyjadaczowie".

Sam ześ jełop, ja tylko chcialem pomoc ;(
 
Sam ześ jełop, ja tylko chcialem pomoc ;(

No to zastanów się następnym razem... struct Outfit_t jest przekazywany z parseSetOutfit do playerChangeOutfit, skąd trafia do gracza jako normalny var, nie jako odsyłacz, więc następnie wysyłany do graczy jest w stanie pierwotnym i Twoja zmiana w changeOutfit nie jest uwzględniana, choć co prawda w rzeczywistości zmieniasz ten lookFeet.
Suma summarum: gracze spotykający nasz cel będą widzieć outfit prawidłowo (po zmianie), lecz Ci co byli w zasięgu wzroku (8x8) niestety nie.

Dlatego należy to zepsuć już przy trzonku :p
 
Wszystko działa prawidłowo wielkie dzięki Elf za pomoc no i oczywiście Averatec i Chojrak też wielkie dzięki za zainteresowanie i pomoc.

@Elf oni to wiedzieli ale zapomnieli ;D
 
Status
Not open for further replies.
Back
Top